ETH Price: $2,075.55 (-3.34%)

Contract

0xA5BDAa3809bb97BF2277190c1ECeF2Bc3af3F7d9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Emergency Unstak...241654202026-01-05 2:16:5968 days ago1767579419IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000034310.16224894
Emergency Unstak...241654152026-01-05 2:15:5968 days ago1767579359IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000025940.10505845
Emergency Unstak...241653272026-01-05 1:58:2368 days ago1767578303IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000020890.09881463
Emergency Unstak...241653162026-01-05 1:56:1168 days ago1767578171IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000028620.10840747
Sweep Remaining ...226759052025-06-10 18:17:47276 days ago1749579467IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000171213.69742352
Emergency Unstak...224988442025-05-16 23:18:47301 days ago1747437527IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000290161.2694883
Sweep Remaining ...224633252025-05-11 23:22:11306 days ago1747005731IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000042571.62021022
Sweep Remaining ...224633252025-05-11 23:22:11306 days ago1747005731IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000042571.62021022
Sweep Remaining ...224633232025-05-11 23:21:47306 days ago1747005707IN
0xA5BDAa38...c3af3F7d9
0 ETH0.00004021.53003286
Unstake224542652025-05-10 16:46:23307 days ago1746895583IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000882683.56957049
Claim Reward224542582025-05-10 16:44:59307 days ago1746895499IN
0xA5BDAa38...c3af3F7d9
0 ETH0.00049714.19548006
Unstake224425392025-05-09 1:04:23309 days ago1746752663IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000706592.96165151
Unstake224407132025-05-08 18:55:11309 days ago1746730511IN
0xA5BDAa38...c3af3F7d9
0 ETH0.002281069.10973355
Unstake224338942025-05-07 19:45:11310 days ago1746647111IN
0xA5BDAa38...c3af3F7d9
0 ETH0.00028161.12542401
Unstake224331382025-05-07 17:12:35310 days ago1746637955IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000513892.23267602
Unstake224305802025-05-07 8:23:11311 days ago1746606191IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000217250.91128083
Unstake224299222025-05-07 6:10:47311 days ago1746598247IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000202990.84045976
Unstake224296932025-05-07 5:24:11311 days ago1746595451IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000246180.98385347
Unstake224286902025-05-07 2:01:35311 days ago1746583295IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000095820.39704427
Unstake224286322025-05-07 1:49:47311 days ago1746582587IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000200530.83087866
Unstake224279272025-05-06 23:26:11311 days ago1746573971IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000340421.48006579
Unstake224279232025-05-06 23:25:23311 days ago1746573923IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000343721.44360379
Claim Reward224279202025-05-06 23:24:47311 days ago1746573887IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000165121.35788106
Claim Reward224279162025-05-06 23:23:59311 days ago1746573839IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000190341.37403887
Unstake224276892025-05-06 22:38:35311 days ago1746571115IN
0xA5BDAa38...c3af3F7d9
0 ETH0.000239530.99246977
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DogeFatherStaking

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2025-03-30
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

library SafeERC20 {
    error SafeERC20FailedOperation(address token);

    error SafeERC20FailedDecreaseAllowance(
        address spender,
        uint256 currentAllowance,
        uint256 requestedDecrease
    );

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeCall(token.transferFrom, (from, to, value))
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 requestedDecrease
    ) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(
                    spender,
                    currentAllowance,
                    requestedDecrease
                );
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    function forceApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        bytes memory approvalCall = abi.encodeCall(
            token.approve,
            (spender, value)
        );

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(
                token,
                abi.encodeCall(token.approve, (spender, 0))
            );
            _callOptionalReturn(token, approvalCall);
        }
    }

    function transferAndCallRelaxed(
        IERC1363 token,
        address to,
        uint256 value,
        bytes memory data
    ) internal {
        if (to.code.length == 0) {
            safeTransfer(token, to, value);
        } else if (!token.transferAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    function transferFromAndCallRelaxed(
        IERC1363 token,
        address from,
        address to,
        uint256 value,
        bytes memory data
    ) internal {
        if (to.code.length == 0) {
            safeTransferFrom(token, from, to, value);
        } else if (!token.transferFromAndCall(from, to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    function approveAndCallRelaxed(
        IERC1363 token,
        address to,
        uint256 value,
        bytes memory data
    ) internal {
        if (to.code.length == 0) {
            forceApprove(token, to, value);
        } else if (!token.approveAndCall(to, value, data)) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            let success := call(
                gas(),
                token,
                0,
                add(data, 0x20),
                mload(data),
                0,
                0x20
            )
            // bubble errors
            if iszero(success) {
                let ptr := mload(0x40)
                returndatacopy(ptr, 0, returndatasize())
                revert(ptr, returndatasize())
            }
            returnSize := returndatasize()
            returnValue := mload(0)
        }

        if (
            returnSize == 0 ? address(token).code.length == 0 : returnValue != 1
        ) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    function _callOptionalReturnBool(
        IERC20 token,
        bytes memory data
    ) private returns (bool) {
        bool success;
        uint256 returnSize;
        uint256 returnValue;
        assembly ("memory-safe") {
            success := call(
                gas(),
                token,
                0,
                add(data, 0x20),
                mload(data),
                0,
                0x20
            )
            returnSize := returndatasize()
            returnValue := mload(0)
        }
        return
            success &&
            (
                returnSize == 0
                    ? address(token).code.length > 0
                    : returnValue == 1
            );
    }
}

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

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}

interface IERC1363 is IERC20, IERC165 {
    function transferAndCall(address to, uint256 value) external returns (bool);

    function transferAndCall(
        address to,
        uint256 value,
        bytes calldata data
    ) external returns (bool);

    function transferFromAndCall(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function transferFromAndCall(
        address from,
        address to,
        uint256 value,
        bytes calldata data
    ) external returns (bool);

    function approveAndCall(
        address spender,
        uint256 value
    ) external returns (bool);

    function approveAndCall(
        address spender,
        uint256 value,
        bytes calldata data
    ) external returns (bool);
}

abstract contract Ownable is Context {
    address private _owner;

    error OwnableUnauthorizedAccount(address account);

    error OwnableInvalidOwner(address owner);

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

    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

abstract contract ReentrancyGuard {
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        _status = NOT_ENTERED;
    }

    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

contract DogeFatherStaking is ReentrancyGuard, Ownable {
    using SafeERC20 for IERC20;

    // --- Tokens ---
    IERC20 public stakingToken;
    IERC20 public rewardToken;

    // --- Lock-up Periods ---

    uint256 public constant SEVEN_DAYS = 7 days; // 7 days
    uint256 public constant FIVETEEN_DAYS = 15 days; // 15 days
    uint256 public constant THIRTY_DAYS = 30 days; // 30 days

    // --- APRs (in basis points, e.g., 2500 = 25.00%) ---
    uint256 public constant sevenDaysAPR = 2000;
    uint256 public constant fiveteenDaysAPR = 4000;
    uint256 public constant thirtyDaysAPR = 6000;

    // reward tracking
    uint256 public totalDistributedRewards;

    // --- Global Staking State ---
    uint256 public totalStakedAmount;
    uint256 public totalWeightedStake;

    address private penaltyRecipient;
    address private penaltyRecipient2;

    uint256 public constant SWEEP_GRACE_PERIOD = 40 days;

    // --- Injection Parameters ---
    uint256 public monthlyDistributionAmount;
    uint256 public DISTRIBUTION_INTERVAL = THIRTY_DAYS;

    // --- Reward Accumulator ---
    uint256 public constant PRECISION = 1e18;
    uint256 public accRewardPerWeight;
    uint256 public lastRewardUpdate;

    // --- Staking Deadline ---
    uint256 public stakingStartTime;
    uint256 public constant STAKING_DEADLINE = THIRTY_DAYS;

    // --- Stake Data ---
    struct Stake {
        uint256 amount;
        uint256 startTime;
        uint256 lockUpPeriod;
        uint256 apr;
        uint256 weightedStake;
        uint256 rewardDebt;
    }
    mapping(address => Stake[]) public stakes;

    // --- History ---
    struct History {
        uint256 time;
        uint256 totalWeightedStake;
        uint256 accRewardPerWeight;
    }
    History[] public history;

    // --- Events ---
    event Staked(
        address indexed user,
        uint256 amount,
        uint256 lockUpPeriod,
        uint256 apr
    );
    event Unstaked(address indexed user, uint256 amount, uint256 reward);
    event RewardClaimed(address indexed user, uint256 reward);
    event EmergencyUnstaked(
        address indexed user,
        uint256 amount,
        uint256 penalty
    );
    event RewardTokenSweep(address indexed owner, uint256 amount);

    // --- Constructor ---
    constructor(
        address _stakingToken,
        address _rewardToken,
        uint256 _monthlyDistributionAmount,
        address _penaltyRecipient,
        address _penaltyRecipient2
    ) Ownable(msg.sender) {
        require(_stakingToken != address(0), "Zero staking token address");
        require(_rewardToken != address(0), "Zero reward token address");
        require(_penaltyRecipient != address(0), "Zero address is not allowed");
        require(
            _penaltyRecipient2 != address(0),
            "Zero address is not allowed"
        );
        stakingToken = IERC20(_stakingToken);
        rewardToken = IERC20(_rewardToken);
        require(_monthlyDistributionAmount > 0, "Invalid amount");
        penaltyRecipient = _penaltyRecipient;
        penaltyRecipient2 = _penaltyRecipient2;

        // Initialize history time
        history.push(History(block.timestamp, 0, 0));

        monthlyDistributionAmount = _monthlyDistributionAmount;

        stakingStartTime = 0;
        renounceOwnership();
    }

    modifier updateRewards() {
        _updateAccumulator();
        _;
    }

    function _updateAccumulator() internal {
        if (
            block.timestamp <= stakingStartTime + STAKING_DEADLINE &&
            totalWeightedStake > 0
        ) {
            uint256 timeDelta = block.timestamp - lastRewardUpdate;
            uint256 rewardDelta = (monthlyDistributionAmount *
                timeDelta *
                PRECISION) / (totalWeightedStake * DISTRIBUTION_INTERVAL);
            accRewardPerWeight += rewardDelta;
        }
        lastRewardUpdate = block.timestamp;
    }

    function _updateHistory() internal {
        if (
            history.length > 0 &&
            history[history.length - 1].time == block.timestamp
        ) {
            history[history.length - 1].totalWeightedStake = totalWeightedStake;
            history[history.length - 1].accRewardPerWeight = accRewardPerWeight;
        } else {
            history.push(
                History(block.timestamp, totalWeightedStake, accRewardPerWeight)
            );
        }
    }

    function getAccRewardPerWeightAt(
        uint256 targetTime
    ) internal view returns (uint256) {
        if (history.length == 0) return 0;
        // Binary search to find the last entry where time <= targetTime
        uint256 left = 0;
        uint256 right = history.length - 1;
        while (left < right) {
            uint256 mid = left + (right - left + 1) / 2;
            if (history[mid].time <= targetTime) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        History memory h = history[left];
        if (h.time > targetTime) return 0; // Before first update
        if (h.totalWeightedStake == 0) return h.accRewardPerWeight;
        uint256 timeDelta = targetTime - h.time;
        uint256 rewardDelta = (monthlyDistributionAmount *
            timeDelta *
            PRECISION) / (h.totalWeightedStake * DISTRIBUTION_INTERVAL);
        return h.accRewardPerWeight + rewardDelta;
    }

    function stake(
        uint256 amount,
        uint256 lockUpPeriod
    ) external nonReentrant updateRewards {
        require(
            stakingStartTime > 0 && block.timestamp >= stakingStartTime,
            "Staking has not started yet"
        );
        // Check if staking is still allowed (within 30 days of deployment)
        require(
            block.timestamp <= stakingStartTime + STAKING_DEADLINE,
            "Staking period has ended"
        );
        require(amount > 0, "Cannot stake zero tokens");
        uint256 minStake = 1000 * (10 ** 9);
        require(
            amount >= minStake,
            "Amount must be greater than or equal to 1000"
        );

        require(stakes[msg.sender].length < 15, "Maximum stakes reached");

        require(
            lockUpPeriod == SEVEN_DAYS ||
                lockUpPeriod == FIVETEEN_DAYS ||
                lockUpPeriod == THIRTY_DAYS,
            "Invalid lock-up period"
        );

        uint256 apr = getAPRForLockupPeriod(lockUpPeriod);

        uint256 weighted = (amount * apr) / 10000;

        stakes[msg.sender].push(
            Stake({
                amount: amount,
                startTime: block.timestamp,
                lockUpPeriod: lockUpPeriod,
                apr: apr,
                weightedStake: weighted,
                rewardDebt: accRewardPerWeight
            })
        );

        totalStakedAmount += amount;
        totalWeightedStake += weighted;

        _updateHistory();

        stakingToken.safeTransferFrom(msg.sender, address(this), amount);

        emit Staked(msg.sender, amount, lockUpPeriod, apr);
    }

    function unstake(uint256 index) external updateRewards nonReentrant {
        require(index < stakes[msg.sender].length, "Invalid stake index");
        Stake memory userStake = stakes[msg.sender][index];

        uint256 stakeEndTime = userStake.startTime + userStake.lockUpPeriod;
        require(
            block.timestamp >= stakeEndTime,
            "Lock-up period not completed"
        );

        uint256 stakingPeriodEnd = stakingStartTime + STAKING_DEADLINE;

        // Determine the reward end time (earlier of stakeEndTime or stakingPeriodEnd)
        uint256 rewardEndTime = stakeEndTime < stakingPeriodEnd
            ? stakeEndTime
            : stakingPeriodEnd;

        // Since unstaking is only allowed after stakeEndTime, and rewardEndTime <= stakeEndTime,
        // we can directly use the accumulator at rewardEndTime
        uint256 accAtEnd = getAccRewardPerWeightAt(rewardEndTime);

        uint256 reward = (userStake.weightedStake *
            (accAtEnd - userStake.rewardDebt)) / PRECISION;

        require(
            reward <= rewardToken.balanceOf(address(this)),
            "Insufficient rewards pool"
        );

        totalStakedAmount -= userStake.amount;
        if (totalWeightedStake > 0) {
            totalWeightedStake -= userStake.weightedStake;
        }

        if (index != stakes[msg.sender].length - 1) {
            stakes[msg.sender][index] = stakes[msg.sender][
                stakes[msg.sender].length - 1
            ];
        }
        stakes[msg.sender].pop();

        _updateHistory();
        _updateRewardDistributeTracker(reward);

        // Transfer staked tokens and rewards to user
        stakingToken.safeTransfer(msg.sender, userStake.amount);
        rewardToken.safeTransfer(msg.sender, reward);

        emit Unstaked(msg.sender, userStake.amount, reward);
    }

    function claimReward(uint256 index) external nonReentrant updateRewards {
        require(index < stakes[msg.sender].length, "Invalid stake index");
        Stake storage userStake = stakes[msg.sender][index];

        uint256 stakeEndTime = userStake.startTime + userStake.lockUpPeriod;
        uint256 stakingPeriodEnd = stakingStartTime + STAKING_DEADLINE;

        // Determine the reward end time (earlier of stakeEndTime or stakingPeriodEnd)
        uint256 rewardEndTime = stakeEndTime < stakingPeriodEnd
            ? stakeEndTime
            : stakingPeriodEnd;

        uint256 effectiveAcc;

        if (block.timestamp >= rewardEndTime) {
            effectiveAcc = getAccRewardPerWeightAt(rewardEndTime);
        } else {
            effectiveAcc = accRewardPerWeight;
        }
        // Calculate pending reward
        uint256 reward = (userStake.weightedStake *
            (effectiveAcc - userStake.rewardDebt)) / PRECISION;
        require(reward > 0, "No rewards to claim");
        require(
            reward <= rewardToken.balanceOf(address(this)),
            "Insufficient rewards pool"
        );

        _updateRewardDistributeTracker(reward);

        // Update rewardDebt to prevent double-claiming
        userStake.rewardDebt = effectiveAcc;

        // Transfer reward to user
        rewardToken.safeTransfer(msg.sender, reward);

        emit RewardClaimed(msg.sender, reward);
    }

    // For frontend
    function calculateReward(
        Stake memory userStake
    ) public view returns (uint256) {
        uint256 stakeEndTime = userStake.startTime + userStake.lockUpPeriod;
        uint256 stakingPeriodEnd = stakingStartTime + STAKING_DEADLINE;

        // Determine the reward end time (earlier of stakeEndTime or stakingPeriodEnd)
        uint256 rewardEndTime = stakeEndTime < stakingPeriodEnd
            ? stakeEndTime
            : stakingPeriodEnd;

        uint256 effectiveAcc;

        if (block.timestamp >= rewardEndTime) {
            // If current time is past the reward end time, use the accumulator at rewardEndTime
            effectiveAcc = getAccRewardPerWeightAt(rewardEndTime);
        } else {
            // Otherwise, use the current accumulator and add any pending rewards up to the current time
            effectiveAcc = accRewardPerWeight;
            if (
                block.timestamp > lastRewardUpdate &&
                totalWeightedStake > 0 &&
                block.timestamp <= stakingPeriodEnd
            ) {
                uint256 timeDelta = block.timestamp - lastRewardUpdate;
                uint256 pending = (monthlyDistributionAmount *
                    timeDelta *
                    PRECISION) / (totalWeightedStake * DISTRIBUTION_INTERVAL);
                effectiveAcc += pending;
            }
        }

        return
            (userStake.weightedStake * (effectiveAcc - userStake.rewardDebt)) /
            PRECISION;
    }

    function emergencyUnstake(
        uint256 stakeIndex
    ) external nonReentrant updateRewards {
        require(stakeIndex < stakes[msg.sender].length, "Invalid stake index");
        Stake memory userStake = stakes[msg.sender][stakeIndex];

        uint256 penaltyPercent = 2000; // 20%

        uint256 totalPenalty = (userStake.amount * penaltyPercent) / 10000;
        uint256 penaltyRecipientPortion = (totalPenalty * 75) / 100;
        uint256 remainingPenalty = totalPenalty - penaltyRecipientPortion;

        stakingToken.safeTransfer(msg.sender, userStake.amount - totalPenalty);
        stakingToken.safeTransfer(penaltyRecipient, penaltyRecipientPortion);
        stakingToken.safeTransfer(penaltyRecipient2, remainingPenalty);

        // Update global staking totals
        totalStakedAmount -= userStake.amount;
        if (totalWeightedStake > 0) {
            totalWeightedStake -= userStake.weightedStake;
        }

        // Remove the stake
        uint256 lastIndex = stakes[msg.sender].length - 1;
        if (stakeIndex != lastIndex) {
            stakes[msg.sender][stakeIndex] = stakes[msg.sender][lastIndex];
        }
        stakes[msg.sender].pop();

        _updateHistory();

        emit EmergencyUnstaked(
            msg.sender,
            userStake.amount - totalPenalty,
            totalPenalty
        );
    }

    function startStaking() external {
        require(msg.sender == penaltyRecipient, "Unknow caller");
        require(stakingStartTime == 0, "Staking already started");
        stakingStartTime = block.timestamp;
        lastRewardUpdate = block.timestamp;
    }

    function _updateRewardDistributeTracker(uint256 rewardAmount) internal {
        totalDistributedRewards += rewardAmount;
    }

    function getStakeCount(address user) external view returns (uint256) {
        return stakes[user].length;
    }

    function getAPRForLockupPeriod(
        uint256 lockupPeriod
    ) public pure returns (uint256) {
        if (lockupPeriod == SEVEN_DAYS) return sevenDaysAPR;
        if (lockupPeriod == FIVETEEN_DAYS) return fiveteenDaysAPR;
        if (lockupPeriod == THIRTY_DAYS) return thirtyDaysAPR;
        return 0;
    }

    function recoverERC20(address token, uint256 amount) external {
        require(msg.sender == penaltyRecipient, "Unknow caller");
        require(
            token != address(stakingToken) && token != address(rewardToken),
            "Cannot recover staking/reward tokens"
        );
        IERC20(token).safeTransfer(msg.sender, amount);
    }

    function getRewardPoolBalance() public view returns (uint256) {
        return rewardToken.balanceOf(address(this));
    }

    function sweepRemainingRewardTokens() external {
        require(msg.sender == penaltyRecipient, "Unknow caller");
        uint256 sweepUnlockTime = stakingStartTime +
            STAKING_DEADLINE +
            SWEEP_GRACE_PERIOD;

        require(
            block.timestamp > sweepUnlockTime,
            "Sweep grace period not yet ended"
        );

        uint256 remainingBalance = rewardToken.balanceOf(address(this));
        require(remainingBalance > 0, "No reward tokens to sweep");

        rewardToken.safeTransfer(msg.sender, remainingBalance);

        emit RewardTokenSweep(msg.sender, remainingBalance);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_monthlyDistributionAmount","type":"uint256"},{"internalType":"address","name":"_penaltyRecipient","type":"address"},{"internalType":"address","name":"_penaltyRecipient2","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"EmergencyUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardTokenSweep","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockUpPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"apr","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"DISTRIBUTION_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FIVETEEN_DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEVEN_DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_DEADLINE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWEEP_GRACE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"THIRTY_DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accRewardPerWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"lockUpPeriod","type":"uint256"},{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"weightedStake","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"internalType":"struct DogeFatherStaking.Stake","name":"userStake","type":"tuple"}],"name":"calculateReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeIndex","type":"uint256"}],"name":"emergencyUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fiveteenDaysAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockupPeriod","type":"uint256"}],"name":"getAPRForLockupPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getRewardPoolBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getStakeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"history","outputs":[{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"totalWeightedStake","type":"uint256"},{"internalType":"uint256","name":"accRewardPerWeight","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monthlyDistributionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sevenDaysAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lockUpPeriod","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"lockUpPeriod","type":"uint256"},{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"weightedStake","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sweepRemainingRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"thirtyDaysAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDistributedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWeightedStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405262278d00600a55348015610016575f5ffd5b50604051613f12380380613f128339818101604052810190610038919061067c565b3360015f819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100b0575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100a79190610702565b60405180910390fd5b6100bf8161044160201b60201c565b505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012590610775565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361019c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610193906107dd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361020a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020190610845565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161026f90610845565b60405180910390fd5b8460025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f831161033a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610331906108ad565b60405180910390fd5b8160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600f60405180606001604052804281526020015f81526020015f815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f015560208201518160010155604082015181600201555050826009819055505f600d8190555061043761050460201b60201c565b50505050506108cb565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61051261052360201b60201c565b6105215f61044160201b60201c565b565b6105316105bc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166105556105c360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146105ba5761057e6105bc60201b60201c565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016105b19190610702565b60405180910390fd5b565b5f33905090565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610618826105ef565b9050919050565b6106288161060e565b8114610632575f5ffd5b50565b5f815190506106438161061f565b92915050565b5f819050919050565b61065b81610649565b8114610665575f5ffd5b50565b5f8151905061067681610652565b92915050565b5f5f5f5f5f60a08688031215610695576106946105eb565b5b5f6106a288828901610635565b95505060206106b388828901610635565b94505060406106c488828901610668565b93505060606106d588828901610635565b92505060806106e688828901610635565b9150509295509295909350565b6106fc8161060e565b82525050565b5f6020820190506107155f8301846106f3565b92915050565b5f82825260208201905092915050565b7f5a65726f207374616b696e6720746f6b656e20616464726573730000000000005f82015250565b5f61075f601a8361071b565b915061076a8261072b565b602082019050919050565b5f6020820190508181035f83015261078c81610753565b9050919050565b7f5a65726f2072657761726420746f6b656e2061646472657373000000000000005f82015250565b5f6107c760198361071b565b91506107d282610793565b602082019050919050565b5f6020820190508181035f8301526107f4816107bb565b9050919050565b7f5a65726f2061646472657373206973206e6f7420616c6c6f77656400000000005f82015250565b5f61082f601b8361071b565b915061083a826107fb565b602082019050919050565b5f6020820190508181035f83015261085c81610823565b9050919050565b7f496e76616c696420616d6f756e740000000000000000000000000000000000005f82015250565b5f610897600e8361071b565b91506108a282610863565b602082019050919050565b5f6020820190508181035f8301526108c48161088b565b9050919050565b61363a806108d85f395ff3fe608060405234801561000f575f5ffd5b506004361061020f575f3560e01c80637b0472f011610123578063ae169a50116100ab578063df674ac51161007a578063df674ac5146105b2578063eed9da1f146105d0578063f2fde38b146105ee578063f7c618c11461060a578063fd26eaa1146106285761020f565b8063ae169a501461052a578063b0e380dd14610546578063cf57ee6914610564578063d854fb75146105945761020f565b8063a3c2710d116100f2578063a3c2710d14610480578063a7a38f0b1461049e578063a87df832146104d0578063aa6bb09a146104ee578063aaf5eb681461050c5761020f565b80637b0472f01461040c5780638980f11f146104285780638da5cb5b14610444578063a21df9f0146104625761020f565b80632e17de78116101a65780635be6d82a116101755780635be6d82a1461039e5780636abfd183146103bc578063715018a6146103da57806371b0cbfa146103e457806372f702f3146103ee5761020f565b80632e17de78146103115780633b84b5081461032d578063567e98f91461034b578063584b62a1146103695761020f565b8063199aca60116101e2578063199aca60146102875780631c407718146102a557806321741f0e146102d55780632412b762146102f35761020f565b8063012ce50114610213578063060164801461022f57806308b26b751461025f5780631061311d1461027d575b5f5ffd5b61022d6004803603810190610228919061296b565b610646565b005b61024960048036038101906102449190612abf565b610b91565b6040516102569190612af9565b60405180910390f35b610267610cad565b6040516102749190612af9565b60405180910390f35b610285610cb3565b005b61028f610f22565b60405161029c9190612af9565b60405180910390f35b6102bf60048036038101906102ba919061296b565b610f29565b6040516102cc9190612af9565b60405180910390f35b6102dd610f6f565b6040516102ea9190612af9565b60405180910390f35b6102fb610f75565b6040516103089190612af9565b60405180910390f35b61032b6004803603810190610326919061296b565b610f7c565b005b6103356115c0565b6040516103429190612af9565b60405180910390f35b6103536115c6565b6040516103609190612af9565b60405180910390f35b610383600480360381019061037e9190612b6c565b6115cc565b60405161039596959493929190612baa565b60405180910390f35b6103a661161e565b6040516103b39190612af9565b60405180910390f35b6103c4611624565b6040516103d19190612af9565b60405180910390f35b6103e261162a565b005b6103ec61163d565b005b6103f6611720565b6040516104039190612c64565b60405180910390f35b61042660048036038101906104219190612c7d565b611745565b005b610442600480360381019061043d9190612b6c565b611b47565b005b61044c611cee565b6040516104599190612cca565b60405180910390f35b61046a611d16565b6040516104779190612af9565b60405180910390f35b610488611d1d565b6040516104959190612af9565b60405180910390f35b6104b860048036038101906104b3919061296b565b611d23565b6040516104c793929190612ce3565b60405180910390f35b6104d8611d58565b6040516104e59190612af9565b60405180910390f35b6104f6611d5e565b6040516105039190612af9565b60405180910390f35b610514611d64565b6040516105219190612af9565b60405180910390f35b610544600480360381019061053f919061296b565b611d70565b005b61054e6120ca565b60405161055b9190612af9565b60405180910390f35b61057e60048036038101906105799190612d18565b6120d1565b60405161058b9190612af9565b60405180910390f35b61059c61211a565b6040516105a99190612af9565b60405180910390f35b6105ba6121b9565b6040516105c79190612af9565b60405180910390f35b6105d86121bf565b6040516105e59190612af9565b60405180910390f35b61060860048036038101906106039190612d18565b6121c5565b005b610612612249565b60405161061f9190612c64565b60405180910390f35b61063061226e565b60405161063d9190612af9565b60405180910390f35b61064e612275565b6106566122b9565b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905081106106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90612d9d565b60405180910390fd5b5f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20828154811061072857610727612dbb565b5b905f5260205f2090600602016040518060c00160405290815f82015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505090505f6107d090505f61271082845f01516107959190612e15565b61079f9190612e83565b90505f6064604b836107b19190612e15565b6107bb9190612e83565b90505f81836107ca9190612eb3565b90506108263384875f01516107df9190612eb3565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b61089360075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b61090060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b845f015160055f8282546109149190612eb3565b925050819055505f600654111561094257846080015160065f82825461093a9190612eb3565b925050819055505b5f6001600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506109909190612eb3565b9050808714610a8d57600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081815481106109e8576109e7612dbb565b5b905f5260205f209060060201600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208881548110610a4357610a42612dbb565b5b905f5260205f2090600602015f820154815f015560018201548160010155600282015481600201556003820154816003015560048201548160040155600582015481600501559050505b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610ada57610ad9612ee6565b5b600190038181905f5260205f2090600602015f5f82015f9055600182015f9055600282015f9055600382015f9055600482015f9055600582015f905550509055610b226123d1565b3373ffffffffffffffffffffffffffffffffffffffff167f3b1e93c4be42a439cdb9e768b998c1f8181a04e2a02607a8dbc6c64b1ed5662585885f0151610b699190612eb3565b86604051610b78929190612f13565b60405180910390a2505050505050610b8e6124ff565b50565b5f5f82604001518360200151610ba79190612f3a565b90505f62278d00600d54610bbb9190612f3a565b90505f818310610bcb5781610bcd565b825b90505f814210610be757610be082612508565b9050610c70565b600b549050600c5442118015610bfe57505f600654115b8015610c0a5750824211155b15610c6f575f600c5442610c1e9190612eb3565b90505f600a54600654610c319190612e15565b670de0b6b3a764000083600954610c489190612e15565b610c529190612e15565b610c5c9190612e83565b90508083610c6a9190612f3a565b925050505b5b670de0b6b3a76400008660a0015182610c899190612eb3565b8760800151610c989190612e15565b610ca29190612e83565b945050505050919050565b600a5481565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3990612fb7565b60405180910390fd5b5f6234bc0062278d00600d54610d589190612f3a565b610d629190612f3a565b9050804211610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d9061301f565b60405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e019190612cca565b602060405180830381865afa158015610e1c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e409190613051565b90505f8111610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b906130c6565b60405180910390fd5b610ed0338260035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f28f7085edc4326842bba65e64a665381cb385e4cde79258f8ba6d9ebe43bdc2482604051610f169190612af9565b60405180910390a25050565b62278d0081565b5f62093a808203610f3e576107d09050610f6a565b6213c6808203610f5257610fa09050610f6a565b62278d008203610f66576117709050610f6a565b5f90505b919050565b60095481565b6234bc0081565b610f846122b9565b610f8c612275565b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050811061100e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100590612d9d565b60405180910390fd5b5f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20828154811061105e5761105d612dbb565b5b905f5260205f2090600602016040518060c00160405290815f82015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505090505f816040015182602001516110c79190612f3a565b90508042101561110c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111039061312e565b60405180910390fd5b5f62278d00600d5461111e9190612f3a565b90505f81831061112e5781611130565b825b90505f61113c82612508565b90505f670de0b6b3a76400008660a00151836111589190612eb3565b87608001516111679190612e15565b6111719190612e83565b905060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111cd9190612cca565b602060405180830381865afa1580156111e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120c9190613051565b81111561124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590613196565b60405180910390fd5b855f015160055f8282546112629190612eb3565b925050819055505f600654111561129057856080015160065f8282546112889190612eb3565b925050819055505b6001600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506112dd9190612eb3565b871461142357600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061136d9190612eb3565b8154811061137e5761137d612dbb565b5b905f5260205f209060060201600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2088815481106113d9576113d8612dbb565b5b905f5260205f2090600602015f820154815f015560018201548160010155600282015481600201556003820154816003015560048201548160040155600582015481600501559050505b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806114705761146f612ee6565b5b600190038181905f5260205f2090600602015f5f82015f9055600182015f9055600282015f9055600382015f9055600482015f9055600582015f9055505090556114b86123d1565b6114c1816126a2565b61151033875f015160025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b61155c338260035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e875f0151836040516115a7929190612f13565b60405180910390a25050505050506115bd6124ff565b50565b610fa081565b60055481565b600e602052815f5260405f2081815481106115e5575f80fd5b905f5260205f2090600602015f9150915050805f0154908060010154908060020154908060030154908060040154908060050154905086565b61177081565b600d5481565b6116326126bd565b61163b5f612744565b565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390612fb7565b60405180910390fd5b5f600d5414611710576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611707906131fe565b60405180910390fd5b42600d8190555042600c81905550565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61174d612275565b6117556122b9565b5f600d541180156117685750600d544210155b6117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e90613266565b60405180910390fd5b62278d00600d546117b89190612f3a565b4211156117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f1906132ce565b60405180910390fd5b5f821161183c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183390613336565b60405180910390fd5b5f64e8d4a51000905080831015611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f906133c4565b60405180910390fd5b600f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490501061190b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119029061342c565b60405180910390fd5b62093a8082148061191e57506213c68082145b8061192b575062278d0082145b61196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196190613494565b60405180910390fd5b5f61197483610f29565b90505f61271082866119869190612e15565b6119909190612e83565b9050600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060c00160405280878152602001428152602001868152602001848152602001838152602001600b54815250908060018154018082558091505060019003905f5260205f2090600602015f909190919091505f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015550508460055f828254611a719190612f3a565b925050819055508060065f828254611a899190612f3a565b92505081905550611a986123d1565b611ae633308760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612807909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed868685604051611b3093929190612ce3565b60405180910390a2505050611b436124ff565b5050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd90612fb7565b60405180910390fd5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611c80575060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb690613522565b60405180910390fd5b611cea33828473ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b5050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62278d0081565b600c5481565b600f8181548110611d32575f80fd5b905f5260205f2090600302015f91509050805f0154908060010154908060020154905083565b60045481565b600b5481565b670de0b6b3a764000081565b611d78612275565b611d806122b9565b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490508110611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df990612d9d565b60405180910390fd5b5f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208281548110611e5257611e51612dbb565b5b905f5260205f20906006020190505f81600201548260010154611e759190612f3a565b90505f62278d00600d54611e899190612f3a565b90505f818310611e995781611e9b565b825b90505f814210611eb557611eae82612508565b9050611ebb565b600b5490505b5f670de0b6b3a7640000866005015483611ed59190612eb3565b8760040154611ee49190612e15565b611eee9190612e83565b90505f8111611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f299061358a565b60405180910390fd5b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f8c9190612cca565b602060405180830381865afa158015611fa7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcb9190613051565b81111561200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200490613196565b60405180910390fd5b612016816126a2565b81866005018190555061206b338260035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241826040516120b19190612af9565b60405180910390a25050505050506120c76124ff565b50565b6213c68081565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490509050919050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121759190612cca565b602060405180830381865afa158015612190573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b49190613051565b905090565b6107d081565b60065481565b6121cd6126bd565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361223d575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016122349190612cca565b60405180910390fd5b61224681612744565b50565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b62093a8081565b60025f54036122b0576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f81905550565b62278d00600d546122ca9190612f3a565b42111580156122da57505f600654115b15612349575f600c54426122ee9190612eb3565b90505f600a546006546123019190612e15565b670de0b6b3a7640000836009546123189190612e15565b6123229190612e15565b61232c9190612e83565b905080600b5f82825461233f9190612f3a565b9250508190555050505b42600c81905550565b6123cc838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016123859291906135a8565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612889565b505050565b5f600f80549050118015612417575042600f6001600f805490506123f59190612eb3565b8154811061240657612405612dbb565b5b905f5260205f2090600302015f0154145b1561249757600654600f6001600f805490506124339190612eb3565b8154811061244457612443612dbb565b5b905f5260205f20906003020160010181905550600b54600f6001600f8054905061246e9190612eb3565b8154811061247f5761247e612dbb565b5b905f5260205f209060030201600201819055506124fd565b600f60405180606001604052804281526020016006548152602001600b54815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f0155602082015181600101556040820151816002015550505b565b60015f81905550565b5f5f600f805490500361251d575f905061269d565b5f5f90505f6001600f805490506125349190612eb3565b90505b808210156125b8575f6002600184846125509190612eb3565b61255a9190612f3a565b6125649190612e83565b8361256f9190612f3a565b905084600f828154811061258657612585612dbb565b5b905f5260205f2090600302015f0154116125a2578092506125b2565b6001816125af9190612eb3565b91505b50612537565b5f600f83815481106125cd576125cc612dbb565b5b905f5260205f2090600302016040518060600160405290815f820154815260200160018201548152602001600282015481525050905084815f01511115612619575f935050505061269d565b5f816020015103612633578060400151935050505061269d565b5f815f0151866126439190612eb3565b90505f600a5483602001516126589190612e15565b670de0b6b3a76400008360095461266f9190612e15565b6126799190612e15565b6126839190612e83565b90508083604001516126959190612f3a565b955050505050505b919050565b8060045f8282546126b39190612f3a565b9250508190555050565b6126c5612924565b73ffffffffffffffffffffffffffffffffffffffff166126e3611cee565b73ffffffffffffffffffffffffffffffffffffffff161461274257612706612924565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016127399190612cca565b60405180910390fd5b565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612883848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161283c939291906135cf565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612889565b50505050565b5f5f60205f8451602086015f885af1806128a8576040513d5f823e3d81fd5b3d92505f519150505f82146128c15760018114156128dc565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561291e57836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016129159190612cca565b60405180910390fd5b50505050565b5f33905090565b5f604051905090565b5f5ffd5b5f819050919050565b61294a81612938565b8114612954575f5ffd5b50565b5f8135905061296581612941565b92915050565b5f602082840312156129805761297f612934565b5b5f61298d84828501612957565b91505092915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6129e08261299a565b810181811067ffffffffffffffff821117156129ff576129fe6129aa565b5b80604052505050565b5f612a1161292b565b9050612a1d82826129d7565b919050565b5f60c08284031215612a3757612a36612996565b5b612a4160c0612a08565b90505f612a5084828501612957565b5f830152506020612a6384828501612957565b6020830152506040612a7784828501612957565b6040830152506060612a8b84828501612957565b6060830152506080612a9f84828501612957565b60808301525060a0612ab384828501612957565b60a08301525092915050565b5f60c08284031215612ad457612ad3612934565b5b5f612ae184828501612a22565b91505092915050565b612af381612938565b82525050565b5f602082019050612b0c5f830184612aea565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612b3b82612b12565b9050919050565b612b4b81612b31565b8114612b55575f5ffd5b50565b5f81359050612b6681612b42565b92915050565b5f5f60408385031215612b8257612b81612934565b5b5f612b8f85828601612b58565b9250506020612ba085828601612957565b9150509250929050565b5f60c082019050612bbd5f830189612aea565b612bca6020830188612aea565b612bd76040830187612aea565b612be46060830186612aea565b612bf16080830185612aea565b612bfe60a0830184612aea565b979650505050505050565b5f819050919050565b5f612c2c612c27612c2284612b12565b612c09565b612b12565b9050919050565b5f612c3d82612c12565b9050919050565b5f612c4e82612c33565b9050919050565b612c5e81612c44565b82525050565b5f602082019050612c775f830184612c55565b92915050565b5f5f60408385031215612c9357612c92612934565b5b5f612ca085828601612957565b9250506020612cb185828601612957565b9150509250929050565b612cc481612b31565b82525050565b5f602082019050612cdd5f830184612cbb565b92915050565b5f606082019050612cf65f830186612aea565b612d036020830185612aea565b612d106040830184612aea565b949350505050565b5f60208284031215612d2d57612d2c612934565b5b5f612d3a84828501612b58565b91505092915050565b5f82825260208201905092915050565b7f496e76616c6964207374616b6520696e646578000000000000000000000000005f82015250565b5f612d87601383612d43565b9150612d9282612d53565b602082019050919050565b5f6020820190508181035f830152612db481612d7b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612e1f82612938565b9150612e2a83612938565b9250828202612e3881612938565b91508282048414831517612e4f57612e4e612de8565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612e8d82612938565b9150612e9883612938565b925082612ea857612ea7612e56565b5b828204905092915050565b5f612ebd82612938565b9150612ec883612938565b9250828203905081811115612ee057612edf612de8565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f604082019050612f265f830185612aea565b612f336020830184612aea565b9392505050565b5f612f4482612938565b9150612f4f83612938565b9250828201905080821115612f6757612f66612de8565b5b92915050565b7f556e6b6e6f772063616c6c6572000000000000000000000000000000000000005f82015250565b5f612fa1600d83612d43565b9150612fac82612f6d565b602082019050919050565b5f6020820190508181035f830152612fce81612f95565b9050919050565b7f537765657020677261636520706572696f64206e6f742079657420656e6465645f82015250565b5f613009602083612d43565b915061301482612fd5565b602082019050919050565b5f6020820190508181035f83015261303681612ffd565b9050919050565b5f8151905061304b81612941565b92915050565b5f6020828403121561306657613065612934565b5b5f6130738482850161303d565b91505092915050565b7f4e6f2072657761726420746f6b656e7320746f207377656570000000000000005f82015250565b5f6130b0601983612d43565b91506130bb8261307c565b602082019050919050565b5f6020820190508181035f8301526130dd816130a4565b9050919050565b7f4c6f636b2d757020706572696f64206e6f7420636f6d706c65746564000000005f82015250565b5f613118601c83612d43565b9150613123826130e4565b602082019050919050565b5f6020820190508181035f8301526131458161310c565b9050919050565b7f496e73756666696369656e74207265776172647320706f6f6c000000000000005f82015250565b5f613180601983612d43565b915061318b8261314c565b602082019050919050565b5f6020820190508181035f8301526131ad81613174565b9050919050565b7f5374616b696e6720616c726561647920737461727465640000000000000000005f82015250565b5f6131e8601783612d43565b91506131f3826131b4565b602082019050919050565b5f6020820190508181035f830152613215816131dc565b9050919050565b7f5374616b696e6720686173206e6f7420737461727465642079657400000000005f82015250565b5f613250601b83612d43565b915061325b8261321c565b602082019050919050565b5f6020820190508181035f83015261327d81613244565b9050919050565b7f5374616b696e6720706572696f642068617320656e64656400000000000000005f82015250565b5f6132b8601883612d43565b91506132c382613284565b602082019050919050565b5f6020820190508181035f8301526132e5816132ac565b9050919050565b7f43616e6e6f74207374616b65207a65726f20746f6b656e7300000000000000005f82015250565b5f613320601883612d43565b915061332b826132ec565b602082019050919050565b5f6020820190508181035f83015261334d81613314565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e206f7220655f8201527f7175616c20746f20313030300000000000000000000000000000000000000000602082015250565b5f6133ae602c83612d43565b91506133b982613354565b604082019050919050565b5f6020820190508181035f8301526133db816133a2565b9050919050565b7f4d6178696d756d207374616b65732072656163686564000000000000000000005f82015250565b5f613416601683612d43565b9150613421826133e2565b602082019050919050565b5f6020820190508181035f8301526134438161340a565b9050919050565b7f496e76616c6964206c6f636b2d757020706572696f64000000000000000000005f82015250565b5f61347e601683612d43565b91506134898261344a565b602082019050919050565b5f6020820190508181035f8301526134ab81613472565b9050919050565b7f43616e6e6f74207265636f766572207374616b696e672f72657761726420746f5f8201527f6b656e7300000000000000000000000000000000000000000000000000000000602082015250565b5f61350c602483612d43565b9150613517826134b2565b604082019050919050565b5f6020820190508181035f83015261353981613500565b9050919050565b7f4e6f207265776172647320746f20636c61696d000000000000000000000000005f82015250565b5f613574601383612d43565b915061357f82613540565b602082019050919050565b5f6020820190508181035f8301526135a181613568565b9050919050565b5f6040820190506135bb5f830185612cbb565b6135c86020830184612aea565b9392505050565b5f6060820190506135e25f830186612cbb565b6135ef6020830185612cbb565b6135fc6040830184612aea565b94935050505056fea264697066735822122027f08ca993022cf6dd7f4714ac2e7973b2f2d7b8ade855dc53673748bae9878e64736f6c634300081c0033000000000000000000000000ebb66a88cedd12bfe3a289df6dfee377f2963f12000000000000000000000000a18b488216235135842478b76acd910787e93a7f000000000000000000000000000000000000000000001483edf5ea768b240000000000000000000000000000a1722996300315f4d6ecd2b46b1f7af2d1ecbc5a0000000000000000000000000ac2b95ab3c988f413fa90d1bea5e7a1028d0540

Deployed Bytecode

0x608060405234801561000f575f5ffd5b506004361061020f575f3560e01c80637b0472f011610123578063ae169a50116100ab578063df674ac51161007a578063df674ac5146105b2578063eed9da1f146105d0578063f2fde38b146105ee578063f7c618c11461060a578063fd26eaa1146106285761020f565b8063ae169a501461052a578063b0e380dd14610546578063cf57ee6914610564578063d854fb75146105945761020f565b8063a3c2710d116100f2578063a3c2710d14610480578063a7a38f0b1461049e578063a87df832146104d0578063aa6bb09a146104ee578063aaf5eb681461050c5761020f565b80637b0472f01461040c5780638980f11f146104285780638da5cb5b14610444578063a21df9f0146104625761020f565b80632e17de78116101a65780635be6d82a116101755780635be6d82a1461039e5780636abfd183146103bc578063715018a6146103da57806371b0cbfa146103e457806372f702f3146103ee5761020f565b80632e17de78146103115780633b84b5081461032d578063567e98f91461034b578063584b62a1146103695761020f565b8063199aca60116101e2578063199aca60146102875780631c407718146102a557806321741f0e146102d55780632412b762146102f35761020f565b8063012ce50114610213578063060164801461022f57806308b26b751461025f5780631061311d1461027d575b5f5ffd5b61022d6004803603810190610228919061296b565b610646565b005b61024960048036038101906102449190612abf565b610b91565b6040516102569190612af9565b60405180910390f35b610267610cad565b6040516102749190612af9565b60405180910390f35b610285610cb3565b005b61028f610f22565b60405161029c9190612af9565b60405180910390f35b6102bf60048036038101906102ba919061296b565b610f29565b6040516102cc9190612af9565b60405180910390f35b6102dd610f6f565b6040516102ea9190612af9565b60405180910390f35b6102fb610f75565b6040516103089190612af9565b60405180910390f35b61032b6004803603810190610326919061296b565b610f7c565b005b6103356115c0565b6040516103429190612af9565b60405180910390f35b6103536115c6565b6040516103609190612af9565b60405180910390f35b610383600480360381019061037e9190612b6c565b6115cc565b60405161039596959493929190612baa565b60405180910390f35b6103a661161e565b6040516103b39190612af9565b60405180910390f35b6103c4611624565b6040516103d19190612af9565b60405180910390f35b6103e261162a565b005b6103ec61163d565b005b6103f6611720565b6040516104039190612c64565b60405180910390f35b61042660048036038101906104219190612c7d565b611745565b005b610442600480360381019061043d9190612b6c565b611b47565b005b61044c611cee565b6040516104599190612cca565b60405180910390f35b61046a611d16565b6040516104779190612af9565b60405180910390f35b610488611d1d565b6040516104959190612af9565b60405180910390f35b6104b860048036038101906104b3919061296b565b611d23565b6040516104c793929190612ce3565b60405180910390f35b6104d8611d58565b6040516104e59190612af9565b60405180910390f35b6104f6611d5e565b6040516105039190612af9565b60405180910390f35b610514611d64565b6040516105219190612af9565b60405180910390f35b610544600480360381019061053f919061296b565b611d70565b005b61054e6120ca565b60405161055b9190612af9565b60405180910390f35b61057e60048036038101906105799190612d18565b6120d1565b60405161058b9190612af9565b60405180910390f35b61059c61211a565b6040516105a99190612af9565b60405180910390f35b6105ba6121b9565b6040516105c79190612af9565b60405180910390f35b6105d86121bf565b6040516105e59190612af9565b60405180910390f35b61060860048036038101906106039190612d18565b6121c5565b005b610612612249565b60405161061f9190612c64565b60405180910390f35b61063061226e565b60405161063d9190612af9565b60405180910390f35b61064e612275565b6106566122b9565b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905081106106d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106cf90612d9d565b60405180910390fd5b5f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20828154811061072857610727612dbb565b5b905f5260205f2090600602016040518060c00160405290815f82015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505090505f6107d090505f61271082845f01516107959190612e15565b61079f9190612e83565b90505f6064604b836107b19190612e15565b6107bb9190612e83565b90505f81836107ca9190612eb3565b90506108263384875f01516107df9190612eb3565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b61089360075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b61090060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b845f015160055f8282546109149190612eb3565b925050819055505f600654111561094257846080015160065f82825461093a9190612eb3565b925050819055505b5f6001600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506109909190612eb3565b9050808714610a8d57600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081815481106109e8576109e7612dbb565b5b905f5260205f209060060201600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208881548110610a4357610a42612dbb565b5b905f5260205f2090600602015f820154815f015560018201548160010155600282015481600201556003820154816003015560048201548160040155600582015481600501559050505b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610ada57610ad9612ee6565b5b600190038181905f5260205f2090600602015f5f82015f9055600182015f9055600282015f9055600382015f9055600482015f9055600582015f905550509055610b226123d1565b3373ffffffffffffffffffffffffffffffffffffffff167f3b1e93c4be42a439cdb9e768b998c1f8181a04e2a02607a8dbc6c64b1ed5662585885f0151610b699190612eb3565b86604051610b78929190612f13565b60405180910390a2505050505050610b8e6124ff565b50565b5f5f82604001518360200151610ba79190612f3a565b90505f62278d00600d54610bbb9190612f3a565b90505f818310610bcb5781610bcd565b825b90505f814210610be757610be082612508565b9050610c70565b600b549050600c5442118015610bfe57505f600654115b8015610c0a5750824211155b15610c6f575f600c5442610c1e9190612eb3565b90505f600a54600654610c319190612e15565b670de0b6b3a764000083600954610c489190612e15565b610c529190612e15565b610c5c9190612e83565b90508083610c6a9190612f3a565b925050505b5b670de0b6b3a76400008660a0015182610c899190612eb3565b8760800151610c989190612e15565b610ca29190612e83565b945050505050919050565b600a5481565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3990612fb7565b60405180910390fd5b5f6234bc0062278d00600d54610d589190612f3a565b610d629190612f3a565b9050804211610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d9061301f565b60405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e019190612cca565b602060405180830381865afa158015610e1c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e409190613051565b90505f8111610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b906130c6565b60405180910390fd5b610ed0338260035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f28f7085edc4326842bba65e64a665381cb385e4cde79258f8ba6d9ebe43bdc2482604051610f169190612af9565b60405180910390a25050565b62278d0081565b5f62093a808203610f3e576107d09050610f6a565b6213c6808203610f5257610fa09050610f6a565b62278d008203610f66576117709050610f6a565b5f90505b919050565b60095481565b6234bc0081565b610f846122b9565b610f8c612275565b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050811061100e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100590612d9d565b60405180910390fd5b5f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20828154811061105e5761105d612dbb565b5b905f5260205f2090600602016040518060c00160405290815f82015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505090505f816040015182602001516110c79190612f3a565b90508042101561110c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111039061312e565b60405180910390fd5b5f62278d00600d5461111e9190612f3a565b90505f81831061112e5781611130565b825b90505f61113c82612508565b90505f670de0b6b3a76400008660a00151836111589190612eb3565b87608001516111679190612e15565b6111719190612e83565b905060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111cd9190612cca565b602060405180830381865afa1580156111e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061120c9190613051565b81111561124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590613196565b60405180910390fd5b855f015160055f8282546112629190612eb3565b925050819055505f600654111561129057856080015160065f8282546112889190612eb3565b925050819055505b6001600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506112dd9190612eb3565b871461142357600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061136d9190612eb3565b8154811061137e5761137d612dbb565b5b905f5260205f209060060201600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2088815481106113d9576113d8612dbb565b5b905f5260205f2090600602015f820154815f015560018201548160010155600282015481600201556003820154816003015560048201548160040155600582015481600501559050505b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806114705761146f612ee6565b5b600190038181905f5260205f2090600602015f5f82015f9055600182015f9055600282015f9055600382015f9055600482015f9055600582015f9055505090556114b86123d1565b6114c1816126a2565b61151033875f015160025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b61155c338260035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e875f0151836040516115a7929190612f13565b60405180910390a25050505050506115bd6124ff565b50565b610fa081565b60055481565b600e602052815f5260405f2081815481106115e5575f80fd5b905f5260205f2090600602015f9150915050805f0154908060010154908060020154908060030154908060040154908060050154905086565b61177081565b600d5481565b6116326126bd565b61163b5f612744565b565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390612fb7565b60405180910390fd5b5f600d5414611710576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611707906131fe565b60405180910390fd5b42600d8190555042600c81905550565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61174d612275565b6117556122b9565b5f600d541180156117685750600d544210155b6117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e90613266565b60405180910390fd5b62278d00600d546117b89190612f3a565b4211156117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f1906132ce565b60405180910390fd5b5f821161183c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183390613336565b60405180910390fd5b5f64e8d4a51000905080831015611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f906133c4565b60405180910390fd5b600f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490501061190b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119029061342c565b60405180910390fd5b62093a8082148061191e57506213c68082145b8061192b575062278d0082145b61196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196190613494565b60405180910390fd5b5f61197483610f29565b90505f61271082866119869190612e15565b6119909190612e83565b9050600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060c00160405280878152602001428152602001868152602001848152602001838152602001600b54815250908060018154018082558091505060019003905f5260205f2090600602015f909190919091505f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015550508460055f828254611a719190612f3a565b925050819055508060065f828254611a899190612f3a565b92505081905550611a986123d1565b611ae633308760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612807909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed868685604051611b3093929190612ce3565b60405180910390a2505050611b436124ff565b5050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd90612fb7565b60405180910390fd5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611c80575060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb690613522565b60405180910390fd5b611cea33828473ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b5050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62278d0081565b600c5481565b600f8181548110611d32575f80fd5b905f5260205f2090600302015f91509050805f0154908060010154908060020154905083565b60045481565b600b5481565b670de0b6b3a764000081565b611d78612275565b611d806122b9565b600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490508110611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df990612d9d565b60405180910390fd5b5f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208281548110611e5257611e51612dbb565b5b905f5260205f20906006020190505f81600201548260010154611e759190612f3a565b90505f62278d00600d54611e899190612f3a565b90505f818310611e995781611e9b565b825b90505f814210611eb557611eae82612508565b9050611ebb565b600b5490505b5f670de0b6b3a7640000866005015483611ed59190612eb3565b8760040154611ee49190612e15565b611eee9190612e83565b90505f8111611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f299061358a565b60405180910390fd5b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f8c9190612cca565b602060405180830381865afa158015611fa7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcb9190613051565b81111561200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200490613196565b60405180910390fd5b612016816126a2565b81866005018190555061206b338260035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166123529092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241826040516120b19190612af9565b60405180910390a25050505050506120c76124ff565b50565b6213c68081565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490509050919050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121759190612cca565b602060405180830381865afa158015612190573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b49190613051565b905090565b6107d081565b60065481565b6121cd6126bd565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361223d575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016122349190612cca565b60405180910390fd5b61224681612744565b50565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b62093a8081565b60025f54036122b0576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f81905550565b62278d00600d546122ca9190612f3a565b42111580156122da57505f600654115b15612349575f600c54426122ee9190612eb3565b90505f600a546006546123019190612e15565b670de0b6b3a7640000836009546123189190612e15565b6123229190612e15565b61232c9190612e83565b905080600b5f82825461233f9190612f3a565b9250508190555050505b42600c81905550565b6123cc838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016123859291906135a8565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612889565b505050565b5f600f80549050118015612417575042600f6001600f805490506123f59190612eb3565b8154811061240657612405612dbb565b5b905f5260205f2090600302015f0154145b1561249757600654600f6001600f805490506124339190612eb3565b8154811061244457612443612dbb565b5b905f5260205f20906003020160010181905550600b54600f6001600f8054905061246e9190612eb3565b8154811061247f5761247e612dbb565b5b905f5260205f209060030201600201819055506124fd565b600f60405180606001604052804281526020016006548152602001600b54815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f0155602082015181600101556040820151816002015550505b565b60015f81905550565b5f5f600f805490500361251d575f905061269d565b5f5f90505f6001600f805490506125349190612eb3565b90505b808210156125b8575f6002600184846125509190612eb3565b61255a9190612f3a565b6125649190612e83565b8361256f9190612f3a565b905084600f828154811061258657612585612dbb565b5b905f5260205f2090600302015f0154116125a2578092506125b2565b6001816125af9190612eb3565b91505b50612537565b5f600f83815481106125cd576125cc612dbb565b5b905f5260205f2090600302016040518060600160405290815f820154815260200160018201548152602001600282015481525050905084815f01511115612619575f935050505061269d565b5f816020015103612633578060400151935050505061269d565b5f815f0151866126439190612eb3565b90505f600a5483602001516126589190612e15565b670de0b6b3a76400008360095461266f9190612e15565b6126799190612e15565b6126839190612e83565b90508083604001516126959190612f3a565b955050505050505b919050565b8060045f8282546126b39190612f3a565b9250508190555050565b6126c5612924565b73ffffffffffffffffffffffffffffffffffffffff166126e3611cee565b73ffffffffffffffffffffffffffffffffffffffff161461274257612706612924565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016127399190612cca565b60405180910390fd5b565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612883848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161283c939291906135cf565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612889565b50505050565b5f5f60205f8451602086015f885af1806128a8576040513d5f823e3d81fd5b3d92505f519150505f82146128c15760018114156128dc565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561291e57836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016129159190612cca565b60405180910390fd5b50505050565b5f33905090565b5f604051905090565b5f5ffd5b5f819050919050565b61294a81612938565b8114612954575f5ffd5b50565b5f8135905061296581612941565b92915050565b5f602082840312156129805761297f612934565b5b5f61298d84828501612957565b91505092915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6129e08261299a565b810181811067ffffffffffffffff821117156129ff576129fe6129aa565b5b80604052505050565b5f612a1161292b565b9050612a1d82826129d7565b919050565b5f60c08284031215612a3757612a36612996565b5b612a4160c0612a08565b90505f612a5084828501612957565b5f830152506020612a6384828501612957565b6020830152506040612a7784828501612957565b6040830152506060612a8b84828501612957565b6060830152506080612a9f84828501612957565b60808301525060a0612ab384828501612957565b60a08301525092915050565b5f60c08284031215612ad457612ad3612934565b5b5f612ae184828501612a22565b91505092915050565b612af381612938565b82525050565b5f602082019050612b0c5f830184612aea565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612b3b82612b12565b9050919050565b612b4b81612b31565b8114612b55575f5ffd5b50565b5f81359050612b6681612b42565b92915050565b5f5f60408385031215612b8257612b81612934565b5b5f612b8f85828601612b58565b9250506020612ba085828601612957565b9150509250929050565b5f60c082019050612bbd5f830189612aea565b612bca6020830188612aea565b612bd76040830187612aea565b612be46060830186612aea565b612bf16080830185612aea565b612bfe60a0830184612aea565b979650505050505050565b5f819050919050565b5f612c2c612c27612c2284612b12565b612c09565b612b12565b9050919050565b5f612c3d82612c12565b9050919050565b5f612c4e82612c33565b9050919050565b612c5e81612c44565b82525050565b5f602082019050612c775f830184612c55565b92915050565b5f5f60408385031215612c9357612c92612934565b5b5f612ca085828601612957565b9250506020612cb185828601612957565b9150509250929050565b612cc481612b31565b82525050565b5f602082019050612cdd5f830184612cbb565b92915050565b5f606082019050612cf65f830186612aea565b612d036020830185612aea565b612d106040830184612aea565b949350505050565b5f60208284031215612d2d57612d2c612934565b5b5f612d3a84828501612b58565b91505092915050565b5f82825260208201905092915050565b7f496e76616c6964207374616b6520696e646578000000000000000000000000005f82015250565b5f612d87601383612d43565b9150612d9282612d53565b602082019050919050565b5f6020820190508181035f830152612db481612d7b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612e1f82612938565b9150612e2a83612938565b9250828202612e3881612938565b91508282048414831517612e4f57612e4e612de8565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612e8d82612938565b9150612e9883612938565b925082612ea857612ea7612e56565b5b828204905092915050565b5f612ebd82612938565b9150612ec883612938565b9250828203905081811115612ee057612edf612de8565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f604082019050612f265f830185612aea565b612f336020830184612aea565b9392505050565b5f612f4482612938565b9150612f4f83612938565b9250828201905080821115612f6757612f66612de8565b5b92915050565b7f556e6b6e6f772063616c6c6572000000000000000000000000000000000000005f82015250565b5f612fa1600d83612d43565b9150612fac82612f6d565b602082019050919050565b5f6020820190508181035f830152612fce81612f95565b9050919050565b7f537765657020677261636520706572696f64206e6f742079657420656e6465645f82015250565b5f613009602083612d43565b915061301482612fd5565b602082019050919050565b5f6020820190508181035f83015261303681612ffd565b9050919050565b5f8151905061304b81612941565b92915050565b5f6020828403121561306657613065612934565b5b5f6130738482850161303d565b91505092915050565b7f4e6f2072657761726420746f6b656e7320746f207377656570000000000000005f82015250565b5f6130b0601983612d43565b91506130bb8261307c565b602082019050919050565b5f6020820190508181035f8301526130dd816130a4565b9050919050565b7f4c6f636b2d757020706572696f64206e6f7420636f6d706c65746564000000005f82015250565b5f613118601c83612d43565b9150613123826130e4565b602082019050919050565b5f6020820190508181035f8301526131458161310c565b9050919050565b7f496e73756666696369656e74207265776172647320706f6f6c000000000000005f82015250565b5f613180601983612d43565b915061318b8261314c565b602082019050919050565b5f6020820190508181035f8301526131ad81613174565b9050919050565b7f5374616b696e6720616c726561647920737461727465640000000000000000005f82015250565b5f6131e8601783612d43565b91506131f3826131b4565b602082019050919050565b5f6020820190508181035f830152613215816131dc565b9050919050565b7f5374616b696e6720686173206e6f7420737461727465642079657400000000005f82015250565b5f613250601b83612d43565b915061325b8261321c565b602082019050919050565b5f6020820190508181035f83015261327d81613244565b9050919050565b7f5374616b696e6720706572696f642068617320656e64656400000000000000005f82015250565b5f6132b8601883612d43565b91506132c382613284565b602082019050919050565b5f6020820190508181035f8301526132e5816132ac565b9050919050565b7f43616e6e6f74207374616b65207a65726f20746f6b656e7300000000000000005f82015250565b5f613320601883612d43565b915061332b826132ec565b602082019050919050565b5f6020820190508181035f83015261334d81613314565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e206f7220655f8201527f7175616c20746f20313030300000000000000000000000000000000000000000602082015250565b5f6133ae602c83612d43565b91506133b982613354565b604082019050919050565b5f6020820190508181035f8301526133db816133a2565b9050919050565b7f4d6178696d756d207374616b65732072656163686564000000000000000000005f82015250565b5f613416601683612d43565b9150613421826133e2565b602082019050919050565b5f6020820190508181035f8301526134438161340a565b9050919050565b7f496e76616c6964206c6f636b2d757020706572696f64000000000000000000005f82015250565b5f61347e601683612d43565b91506134898261344a565b602082019050919050565b5f6020820190508181035f8301526134ab81613472565b9050919050565b7f43616e6e6f74207265636f766572207374616b696e672f72657761726420746f5f8201527f6b656e7300000000000000000000000000000000000000000000000000000000602082015250565b5f61350c602483612d43565b9150613517826134b2565b604082019050919050565b5f6020820190508181035f83015261353981613500565b9050919050565b7f4e6f207265776172647320746f20636c61696d000000000000000000000000005f82015250565b5f613574601383612d43565b915061357f82613540565b602082019050919050565b5f6020820190508181035f8301526135a181613568565b9050919050565b5f6040820190506135bb5f830185612cbb565b6135c86020830184612aea565b9392505050565b5f6060820190506135e25f830186612cbb565b6135ef6020830185612cbb565b6135fc6040830184612aea565b94935050505056fea264697066735822122027f08ca993022cf6dd7f4714ac2e7973b2f2d7b8ade855dc53673748bae9878e64736f6c634300081c0033

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

000000000000000000000000ebb66a88cedd12bfe3a289df6dfee377f2963f12000000000000000000000000a18b488216235135842478b76acd910787e93a7f000000000000000000000000000000000000000000001483edf5ea768b240000000000000000000000000000a1722996300315f4d6ecd2b46b1f7af2d1ecbc5a0000000000000000000000000ac2b95ab3c988f413fa90d1bea5e7a1028d0540

-----Decoded View---------------
Arg [0] : _stakingToken (address): 0xeBb66a88cEdd12bfE3a289df6DFEe377F2963F12
Arg [1] : _rewardToken (address): 0xA18B488216235135842478b76ACD910787e93a7f
Arg [2] : _monthlyDistributionAmount (uint256): 96881000000000000000000
Arg [3] : _penaltyRecipient (address): 0xa1722996300315f4d6eCd2b46b1F7af2d1ecBc5A
Arg [4] : _penaltyRecipient2 (address): 0x0Ac2b95aB3C988f413fA90D1bea5e7a1028d0540

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000ebb66a88cedd12bfe3a289df6dfee377f2963f12
Arg [1] : 000000000000000000000000a18b488216235135842478b76acd910787e93a7f
Arg [2] : 000000000000000000000000000000000000000000001483edf5ea768b240000
Arg [3] : 000000000000000000000000a1722996300315f4d6ecd2b46b1f7af2d1ecbc5a
Arg [4] : 0000000000000000000000000ac2b95ab3c988f413fa90d1bea5e7a1028d0540


Deployed Bytecode Sourcemap

9166:15559:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21324:1390;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19797:1519;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10208:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24077:645;;;:::i;:::-;;10500:54;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23255:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10161:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10063:52;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16409:1895;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9687:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9901:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10784:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;9740:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10462:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7858:103;;;:::i;:::-;;22722:266;;;:::i;:::-;;9286:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14711:1690;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23583:354;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7589:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9512:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10389:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10984:24;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;9817:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10349:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10302:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18312:1456;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9447:47;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23133:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23945:124;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9637:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9940:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7969:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9319:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9387:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21324:1390;8702:21;:19;:21::i;:::-;12636:20:::1;:18;:20::i;:::-;21454:6:::2;:18;21461:10;21454:18;;;;;;;;;;;;;;;:25;;;;21441:10;:38;21433:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;21514:22;21539:6;:18;21546:10;21539:18;;;;;;;;;;;;;;;21558:10;21539:30;;;;;;;;:::i;:::-;;;;;;;;;;;;21514:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;21582:22;21607:4;21582:29;;21631:20;21692:5;21674:14;21655:9;:16;;;:33;;;;:::i;:::-;21654:43;;;;:::i;:::-;21631:66;;21708:31;21764:3;21758:2;21743:12;:17;;;;:::i;:::-;21742:25;;;;:::i;:::-;21708:59;;21778:24;21820:23;21805:12;:38;;;;:::i;:::-;21778:65;;21856:70;21882:10;21913:12;21894:9;:16;;;:31;;;;:::i;:::-;21856:12;;;;;;;;;;;:25;;;;:70;;;;;:::i;:::-;21937:68;21963:16;;;;;;;;;;;21981:23;21937:12;;;;;;;;;;;:25;;;;:68;;;;;:::i;:::-;22016:62;22042:17;;;;;;;;;;;22061:16;22016:12;;;;;;;;;;;:25;;;;:62;;;;;:::i;:::-;22153:9;:16;;;22132:17;;:37;;;;;;;:::i;:::-;;;;;;;;22205:1;22184:18;;:22;22180:100;;;22245:9;:23;;;22223:18;;:45;;;;;;;:::i;:::-;;;;;;;;22180:100;22321:17;22369:1;22341:6;:18;22348:10;22341:18;;;;;;;;;;;;;;;:25;;;;:29;;;;:::i;:::-;22321:49;;22399:9;22385:10;:23;22381:118;;22458:6;:18;22465:10;22458:18;;;;;;;;;;;;;;;22477:9;22458:29;;;;;;;;:::i;:::-;;;;;;;;;;;;22425:6;:18;22432:10;22425:18;;;;;;;;;;;;;;;22444:10;22425:30;;;;;;;;:::i;:::-;;;;;;;;;;;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22381:118;22509:6;:18;22516:10;22509:18;;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22546:16;:14;:16::i;:::-;22612:10;22580:126;;;22656:12;22637:9;:16;;;:31;;;;:::i;:::-;22683:12;22580:126;;;;;;;:::i;:::-;;;;;;;;21422:1292;;;;;;8746:20:::0;:18;:20::i;:::-;21324:1390;:::o;19797:1519::-;19883:7;19903:20;19948:9;:22;;;19926:9;:19;;;:44;;;;:::i;:::-;19903:67;;19981:24;9550:7;20008:16;;:35;;;;:::i;:::-;19981:62;;20144:21;20183:16;20168:12;:31;:91;;20243:16;20168:91;;;20215:12;20168:91;20144:115;;20272:20;20328:13;20309:15;:32;20305:881;;20471:38;20495:13;20471:23;:38::i;:::-;20456:53;;20305:881;;;20663:18;;20648:33;;20736:16;;20718:15;:34;:77;;;;;20794:1;20773:18;;:22;20718:77;:133;;;;;20835:16;20816:15;:35;;20718:133;20696:479;;;20886:17;20924:16;;20906:15;:34;;;;:::i;:::-;20886:54;;20959:15;21095:21;;21074:18;;:42;;;;:::i;:::-;10338:4;21027:9;20978:25;;:58;;;;:::i;:::-;:91;;;;:::i;:::-;20977:140;;;;:::i;:::-;20959:158;;21152:7;21136:23;;;;;:::i;:::-;;;20867:308;;20696:479;20305:881;10338:4;21261:9;:20;;;21246:12;:35;;;;:::i;:::-;21219:9;:23;;;:63;;;;:::i;:::-;21218:90;;;;:::i;:::-;21198:110;;;;;;19797:1519;;;:::o;10208:50::-;;;;:::o;24077:645::-;24157:16;;;;;;;;;;;24143:30;;:10;:30;;;24135:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;24202:23;10108:7;9550;24228:16;;:48;;;;:::i;:::-;:82;;;;:::i;:::-;24202:108;;24363:15;24345;:33;24323:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;24451:24;24478:11;;;;;;;;;;;:21;;;24508:4;24478:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24451:63;;24552:1;24533:16;:20;24525:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;24596:54;24621:10;24633:16;24596:11;;;;;;;;;;;:24;;;;:54;;;;;:::i;:::-;24685:10;24668:46;;;24697:16;24668:46;;;;;;:::i;:::-;;;;;;;;24124:598;;24077:645::o;10500:54::-;9550:7;10500:54;:::o;23255:320::-;23345:7;9424:6;23369:12;:26;23365:51;;9676:4;23397:19;;;;23365:51;9487:7;23431:12;:29;23427:57;;9729:4;23462:22;;;;23427:57;9550:7;23499:12;:27;23495:53;;9780:4;23528:20;;;;23495:53;23566:1;23559:8;;23255:320;;;;:::o;10161:40::-;;;;:::o;10063:52::-;10108:7;10063:52;:::o;16409:1895::-;12636:20;:18;:20::i;:::-;8702:21:::1;:19;:21::i;:::-;16504:6:::2;:18;16511:10;16504:18;;;;;;;;;;;;;;;:25;;;;16496:5;:33;16488:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;16564:22;16589:6;:18;16596:10;16589:18;;;;;;;;;;;;;;;16608:5;16589:25;;;;;;;;:::i;:::-;;;;;;;;;;;;16564:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;16627:20;16672:9;:22;;;16650:9;:19;;;:44;;;;:::i;:::-;16627:67;;16746:12;16727:15;:31;;16705:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;16827:24;9550:7;16854:16;;:35;;;;:::i;:::-;16827:62;;16990:21;17029:16;17014:12;:31;:91;;17089:16;17014:91;;;17061:12;17014:91;16990:115;;17282:16;17301:38;17325:13;17301:23;:38::i;:::-;17282:57;;17352:14;10338:4;17421:9;:20;;;17410:8;:31;;;;:::i;:::-;17370:9;:23;;;:72;;;;:::i;:::-;17369:86;;;;:::i;:::-;17352:103;;17500:11;;;;;;;;;;;:21;;;17530:4;17500:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17490:6;:46;;17468:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;17623:9;:16;;;17602:17;;:37;;;;;;;:::i;:::-;;;;;;;;17675:1;17654:18;;:22;17650:100;;;17715:9;:23;;;17693:18;;:45;;;;;;;:::i;:::-;;;;;;;;17650:100;17803:1;17775:6;:18;17782:10;17775:18;;;;;;;;;;;;;;;:25;;;;:29;;;;:::i;:::-;17766:5;:38;17762:180;;17849:6;:18;17856:10;17849:18;;;;;;;;;;;;;;;17914:1;17886:6;:18;17893:10;17886:18;;;;;;;;;;;;;;;:25;;;;:29;;;;:::i;:::-;17849:81;;;;;;;;:::i;:::-;;;;;;;;;;;;17821:6;:18;17828:10;17821:18;;;;;;;;;;;;;;;17840:5;17821:25;;;;;;;;:::i;:::-;;;;;;;;;;;;:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17762:180;17952:6;:18;17959:10;17952:18;;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17989:16;:14;:16::i;:::-;18016:38;18047:6;18016:30;:38::i;:::-;18122:55;18148:10;18160:9;:16;;;18122:12;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;18188:44;18213:10;18225:6;18188:11;;;;;;;;;;;:24;;;;:44;;;;;:::i;:::-;18259:10;18250:46;;;18271:9;:16;;;18289:6;18250:46;;;;;;;:::i;:::-;;;;;;;;16477:1827;;;;;;8746:20:::1;:18;:20::i;:::-;16409:1895:::0;:::o;9687:46::-;9729:4;9687:46;:::o;9901:32::-;;;;:::o;10784:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9740:44::-;9780:4;9740:44;:::o;10462:31::-;;;;:::o;7858:103::-;7548:13;:11;:13::i;:::-;7923:30:::1;7950:1;7923:18;:30::i;:::-;7858:103::o:0;22722:266::-;22788:16;;;;;;;;;;;22774:30;;:10;:30;;;22766:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;22861:1;22841:16;;:21;22833:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22920:15;22901:16;:34;;;;22965:15;22946:16;:34;;;;22722:266::o;9286:26::-;;;;;;;;;;;;;:::o;14711:1690::-;8702:21;:19;:21::i;:::-;12636:20:::1;:18;:20::i;:::-;14877:1:::2;14858:16;;:20;:59;;;;;14901:16;;14882:15;:35;;14858:59;14836:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;9550:7;15101:16;;:35;;;;:::i;:::-;15082:15;:54;;15060:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;15216:1;15207:6;:10;15199:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;15257:16;15276;15257:35;;15335:8;15325:6;:18;;15303:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;15464:2;15436:6;:18;15443:10;15436:18;;;;;;;;;;;;;;;:25;;;;:30;15428:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;9424:6;15528:12;:26;:76;;;;9487:7;15575:12;:29;15528:76;:124;;;;9550:7;15625:12;:27;15528:124;15506:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;15715:11;15729:35;15751:12;15729:21;:35::i;:::-;15715:49;;15777:16;15813:5;15806:3;15797:6;:12;;;;:::i;:::-;15796:22;;;;:::i;:::-;15777:41;;15831:6;:18;15838:10;15831:18;;;;;;;;;;;;;;;15869:263;;;;;;;;15902:6;15869:263;;;;15938:15;15869:263;;;;15986:12;15869:263;;;;16022:3;15869:263;;;;16059:8;15869:263;;;;16098:18;;15869:263;;::::0;15831:312:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16177:6;16156:17;;:27;;;;;;;:::i;:::-;;;;;;;;16216:8;16194:18;;:30;;;;;;;:::i;:::-;;;;;;;;16237:16;:14;:16::i;:::-;16266:64;16296:10;16316:4;16323:6;16266:12;;;;;;;;;;;:29;;;;:64;;;;;;:::i;:::-;16355:10;16348:45;;;16367:6;16375:12;16389:3;16348:45;;;;;;;;:::i;:::-;;;;;;;;14825:1576;;;8746:20:::0;:18;:20::i;:::-;14711:1690;;:::o;23583:354::-;23678:16;;;;;;;;;;;23664:30;;:10;:30;;;23656:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;23762:12;;;;;;;;;;;23745:30;;:5;:30;;;;:63;;;;;23796:11;;;;;;;;;;;23779:29;;:5;:29;;;;23745:63;23723:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;23883:46;23910:10;23922:6;23890:5;23883:26;;;;:46;;;;;:::i;:::-;23583:354;;:::o;7589:87::-;7635:7;7662:6;;;;;;;;;;;7655:13;;7589:87;:::o;9512:45::-;9550:7;9512:45;:::o;10389:31::-;;;;:::o;10984:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9817:38::-;;;;:::o;10349:33::-;;;;:::o;10302:40::-;10338:4;10302:40;:::o;18312:1456::-;8702:21;:19;:21::i;:::-;12636:20:::1;:18;:20::i;:::-;18411:6:::2;:18;18418:10;18411:18;;;;;;;;;;;;;;;:25;;;;18403:5;:33;18395:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;18471:23;18497:6;:18;18504:10;18497:18;;;;;;;;;;;;;;;18516:5;18497:25;;;;;;;;:::i;:::-;;;;;;;;;;;;18471:51;;18535:20;18580:9;:22;;;18558:9;:19;;;:44;;;;:::i;:::-;18535:67;;18613:24;9550:7;18640:16;;:35;;;;:::i;:::-;18613:62;;18776:21;18815:16;18800:12;:31;:91;;18875:16;18800:91;;;18847:12;18800:91;18776:115;;18904:20;18960:13;18941:15;:32;18937:184;;19005:38;19029:13;19005:23;:38::i;:::-;18990:53;;18937:184;;;19091:18;;19076:33;;18937:184;19168:14;10338:4;19241:9;:20;;;19226:12;:35;;;;:::i;:::-;19186:9;:23;;;:76;;;;:::i;:::-;19185:90;;;;:::i;:::-;19168:107;;19303:1;19294:6;:10;19286:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;19371:11;;;;;;;;;;;:21;;;19401:4;19371:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19361:6;:46;;19339:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;19473:38;19504:6;19473:30;:38::i;:::-;19604:12;19581:9;:20;;:35;;;;19665:44;19690:10;19702:6;19665:11;;;;;;;;;;;:24;;;;:44;;;;;:::i;:::-;19741:10;19727:33;;;19753:6;19727:33;;;;;;:::i;:::-;;;;;;;;18384:1384;;;;;;8746:20:::0;:18;:20::i;:::-;18312:1456;:::o;9447:47::-;9487:7;9447:47;:::o;23133:114::-;23193:7;23220:6;:12;23227:4;23220:12;;;;;;;;;;;;;;;:19;;;;23213:26;;23133:114;;;:::o;23945:124::-;23998:7;24025:11;;;;;;;;;;;:21;;;24055:4;24025:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24018:43;;23945:124;:::o;9637:43::-;9676:4;9637:43;:::o;9940:33::-;;;;:::o;7969:220::-;7548:13;:11;:13::i;:::-;8074:1:::1;8054:22;;:8;:22;;::::0;8050:93:::1;;8128:1;8100:31;;;;;;;;;;;:::i;:::-;;;;;;;;8050:93;8153:28;8172:8;8153:18;:28::i;:::-;7969:220:::0;:::o;9319:25::-;;;;;;;;;;;;;:::o;9387:43::-;9424:6;9387:43;:::o;8782:175::-;8518:1;8836:7;;:18;8832:88;;8878:30;;;;;;;;;;;;;;8832:88;8518:1;8932:7;:17;;;;8782:175::o;12684:523::-;9550:7;12771:16;;:35;;;;:::i;:::-;12752:15;:54;;:93;;;;;12844:1;12823:18;;:22;12752:93;12734:421;;;12872:17;12910:16;;12892:15;:34;;;;:::i;:::-;12872:54;;12941:19;13073:21;;13052:18;;:42;;;;:::i;:::-;10338:4;13009:9;12964:25;;:54;;;;:::i;:::-;:83;;;;:::i;:::-;12963:132;;;;:::i;:::-;12941:154;;13132:11;13110:18;;:33;;;;;;;:::i;:::-;;;;;;;;12857:298;;12734:421;13184:15;13165:16;:34;;;;12684:523::o;398:162::-;481:71;501:5;523;:14;;;540:2;544:5;508:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;481:19;:71::i;:::-;398:162;;;:::o;13215:488::-;13296:1;13279:7;:14;;;;:18;:86;;;;;13350:15;13314:7;13339:1;13322:7;:14;;;;:18;;;;:::i;:::-;13314:27;;;;;;;;:::i;:::-;;;;;;;;;;;;:32;;;:51;13279:86;13261:435;;;13441:18;;13392:7;13417:1;13400:7;:14;;;;:18;;;;:::i;:::-;13392:27;;;;;;;;:::i;:::-;;;;;;;;;;;;:46;;:67;;;;13523:18;;13474:7;13499:1;13482:7;:14;;;;:18;;;;:::i;:::-;13474:27;;;;;;;;:::i;:::-;;;;;;;;;;;;:46;;:67;;;;13261:435;;;13574:7;13605:64;;;;;;;;13613:15;13605:64;;;;13630:18;;13605:64;;;;13650:18;;13605:64;;;13574:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13261:435;13215:488::o;8965:78::-;8475:1;9014:7;:21;;;;8965:78::o;13711:992::-;13803:7;13845:1;13827:7;:14;;;;:19;13823:33;;13855:1;13848:8;;;;13823:33;13941:12;13956:1;13941:16;;13968:13;14001:1;13984:7;:14;;;;:18;;;;:::i;:::-;13968:34;;14013:243;14027:5;14020:4;:12;14013:243;;;14049:11;14091:1;14086;14079:4;14071:5;:12;;;;:::i;:::-;:16;;;;:::i;:::-;14070:22;;;;:::i;:::-;14063:4;:29;;;;:::i;:::-;14049:43;;14132:10;14111:7;14119:3;14111:12;;;;;;;;:::i;:::-;;;;;;;;;;;;:17;;;:31;14107:138;;14170:3;14163:10;;14107:138;;;14228:1;14222:3;:7;;;;:::i;:::-;14214:15;;14107:138;14034:222;14013:243;;;14266:16;14285:7;14293:4;14285:13;;;;;;;;:::i;:::-;;;;;;;;;;;;14266:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14322:10;14313:1;:6;;;:19;14309:33;;;14341:1;14334:8;;;;;;;14309:33;14404:1;14380;:20;;;:25;14376:58;;14414:1;:20;;;14407:27;;;;;;;14376:58;14445:17;14478:1;:6;;;14465:10;:19;;;;:::i;:::-;14445:39;;14495:19;14621:21;;14598:1;:20;;;:44;;;;:::i;:::-;10338:4;14559:9;14518:25;;:50;;;;:::i;:::-;:75;;;;:::i;:::-;14517:126;;;;:::i;:::-;14495:148;;14684:11;14661:1;:20;;;:34;;;;:::i;:::-;14654:41;;;;;;;13711:992;;;;:::o;22996:129::-;23105:12;23078:23;;:39;;;;;;;:::i;:::-;;;;;;;;22996:129;:::o;7684:166::-;7755:12;:10;:12::i;:::-;7744:23;;:7;:5;:7::i;:::-;:23;;;7740:103;;7818:12;:10;:12::i;:::-;7791:40;;;;;;;;;;;:::i;:::-;;;;;;;;7740:103;7684:166::o;8197:191::-;8271:16;8290:6;;;;;;;;;;;8271:25;;8316:8;8307:6;;:17;;;;;;;;;;;;;;;;;;8371:8;8340:40;;8361:8;8340:40;;;;;;;;;;;;8260:128;8197:191;:::o;568:270::-;712:118;746:5;781;:18;;;802:4;808:2;812:5;766:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;712:19;:118::i;:::-;568:270;;;;:::o;3413:896::-;3494:18;3523:19;3783:4;3763:1;3739:4;3733:11;3709:4;3703;3699:15;3679:1;3655:5;3631;3608:194;3856:7;3846:180;;3901:4;3895:11;3947:16;3944:1;3939:3;3924:40;3994:16;3989:3;3982:29;3846:180;4054:16;4040:30;;4105:1;4099:8;4084:23;;3578:540;4162:1;4148:10;:15;:68;;4215:1;4200:11;:16;;4148:68;;;4196:1;4174:5;4166:26;;;:31;4148:68;4130:172;;;4283:5;4250:40;;;;;;;;;;;:::i;:::-;;;;;;;;4130:172;3483:826;;3413:896;;:::o;5106:98::-;5159:7;5186:10;5179:17;;5106:98;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:117::-;1134:1;1131;1124:12;1148:102;1189:6;1240:2;1236:7;1231:2;1224:5;1220:14;1216:28;1206:38;;1148:102;;;:::o;1256:180::-;1304:77;1301:1;1294:88;1401:4;1398:1;1391:15;1425:4;1422:1;1415:15;1442:281;1525:27;1547:4;1525:27;:::i;:::-;1517:6;1513:40;1655:6;1643:10;1640:22;1619:18;1607:10;1604:34;1601:62;1598:88;;;1666:18;;:::i;:::-;1598:88;1706:10;1702:2;1695:22;1485:238;1442:281;;:::o;1729:129::-;1763:6;1790:20;;:::i;:::-;1780:30;;1819:33;1847:4;1839:6;1819:33;:::i;:::-;1729:129;;;:::o;2025:1246::-;2096:5;2140:4;2128:9;2123:3;2119:19;2115:30;2112:117;;;2148:79;;:::i;:::-;2112:117;2247:21;2263:4;2247:21;:::i;:::-;2238:30;;2329:1;2369:49;2414:3;2405:6;2394:9;2390:22;2369:49;:::i;:::-;2362:4;2355:5;2351:16;2344:75;2278:152;2494:2;2535:49;2580:3;2571:6;2560:9;2556:22;2535:49;:::i;:::-;2528:4;2521:5;2517:16;2510:75;2440:156;2663:2;2704:49;2749:3;2740:6;2729:9;2725:22;2704:49;:::i;:::-;2697:4;2690:5;2686:16;2679:75;2606:159;2823:2;2864:49;2909:3;2900:6;2889:9;2885:22;2864:49;:::i;:::-;2857:4;2850:5;2846:16;2839:75;2775:150;2993:3;3035:49;3080:3;3071:6;3060:9;3056:22;3035:49;:::i;:::-;3028:4;3021:5;3017:16;3010:75;2935:161;3161:3;3203:49;3248:3;3239:6;3228:9;3224:22;3203:49;:::i;:::-;3196:4;3189:5;3185:16;3178:75;3106:158;2025:1246;;;;:::o;3277:374::-;3358:6;3407:3;3395:9;3386:7;3382:23;3378:33;3375:120;;;3414:79;;:::i;:::-;3375:120;3534:1;3559:75;3626:7;3617:6;3606:9;3602:22;3559:75;:::i;:::-;3549:85;;3505:139;3277:374;;;;:::o;3657:118::-;3744:24;3762:5;3744:24;:::i;:::-;3739:3;3732:37;3657:118;;:::o;3781:222::-;3874:4;3912:2;3901:9;3897:18;3889:26;;3925:71;3993:1;3982:9;3978:17;3969:6;3925:71;:::i;:::-;3781:222;;;;:::o;4009:126::-;4046:7;4086:42;4079:5;4075:54;4064:65;;4009:126;;;:::o;4141:96::-;4178:7;4207:24;4225:5;4207:24;:::i;:::-;4196:35;;4141:96;;;:::o;4243:122::-;4316:24;4334:5;4316:24;:::i;:::-;4309:5;4306:35;4296:63;;4355:1;4352;4345:12;4296:63;4243:122;:::o;4371:139::-;4417:5;4455:6;4442:20;4433:29;;4471:33;4498:5;4471:33;:::i;:::-;4371:139;;;;:::o;4516:474::-;4584:6;4592;4641:2;4629:9;4620:7;4616:23;4612:32;4609:119;;;4647:79;;:::i;:::-;4609:119;4767:1;4792:53;4837:7;4828:6;4817:9;4813:22;4792:53;:::i;:::-;4782:63;;4738:117;4894:2;4920:53;4965:7;4956:6;4945:9;4941:22;4920:53;:::i;:::-;4910:63;;4865:118;4516:474;;;;;:::o;4996:775::-;5229:4;5267:3;5256:9;5252:19;5244:27;;5281:71;5349:1;5338:9;5334:17;5325:6;5281:71;:::i;:::-;5362:72;5430:2;5419:9;5415:18;5406:6;5362:72;:::i;:::-;5444;5512:2;5501:9;5497:18;5488:6;5444:72;:::i;:::-;5526;5594:2;5583:9;5579:18;5570:6;5526:72;:::i;:::-;5608:73;5676:3;5665:9;5661:19;5652:6;5608:73;:::i;:::-;5691;5759:3;5748:9;5744:19;5735:6;5691:73;:::i;:::-;4996:775;;;;;;;;;:::o;5777:60::-;5805:3;5826:5;5819:12;;5777:60;;;:::o;5843:142::-;5893:9;5926:53;5944:34;5953:24;5971:5;5953:24;:::i;:::-;5944:34;:::i;:::-;5926:53;:::i;:::-;5913:66;;5843:142;;;:::o;5991:126::-;6041:9;6074:37;6105:5;6074:37;:::i;:::-;6061:50;;5991:126;;;:::o;6123:140::-;6187:9;6220:37;6251:5;6220:37;:::i;:::-;6207:50;;6123:140;;;:::o;6269:159::-;6370:51;6415:5;6370:51;:::i;:::-;6365:3;6358:64;6269:159;;:::o;6434:250::-;6541:4;6579:2;6568:9;6564:18;6556:26;;6592:85;6674:1;6663:9;6659:17;6650:6;6592:85;:::i;:::-;6434:250;;;;:::o;6690:474::-;6758:6;6766;6815:2;6803:9;6794:7;6790:23;6786:32;6783:119;;;6821:79;;:::i;:::-;6783:119;6941:1;6966:53;7011:7;7002:6;6991:9;6987:22;6966:53;:::i;:::-;6956:63;;6912:117;7068:2;7094:53;7139:7;7130:6;7119:9;7115:22;7094:53;:::i;:::-;7084:63;;7039:118;6690:474;;;;;:::o;7170:118::-;7257:24;7275:5;7257:24;:::i;:::-;7252:3;7245:37;7170:118;;:::o;7294:222::-;7387:4;7425:2;7414:9;7410:18;7402:26;;7438:71;7506:1;7495:9;7491:17;7482:6;7438:71;:::i;:::-;7294:222;;;;:::o;7522:442::-;7671:4;7709:2;7698:9;7694:18;7686:26;;7722:71;7790:1;7779:9;7775:17;7766:6;7722:71;:::i;:::-;7803:72;7871:2;7860:9;7856:18;7847:6;7803:72;:::i;:::-;7885;7953:2;7942:9;7938:18;7929:6;7885:72;:::i;:::-;7522:442;;;;;;:::o;7970:329::-;8029:6;8078:2;8066:9;8057:7;8053:23;8049:32;8046:119;;;8084:79;;:::i;:::-;8046:119;8204:1;8229:53;8274:7;8265:6;8254:9;8250:22;8229:53;:::i;:::-;8219:63;;8175:117;7970:329;;;;:::o;8305:169::-;8389:11;8423:6;8418:3;8411:19;8463:4;8458:3;8454:14;8439:29;;8305:169;;;;:::o;8480:::-;8620:21;8616:1;8608:6;8604:14;8597:45;8480:169;:::o;8655:366::-;8797:3;8818:67;8882:2;8877:3;8818:67;:::i;:::-;8811:74;;8894:93;8983:3;8894:93;:::i;:::-;9012:2;9007:3;9003:12;8996:19;;8655:366;;;:::o;9027:419::-;9193:4;9231:2;9220:9;9216:18;9208:26;;9280:9;9274:4;9270:20;9266:1;9255:9;9251:17;9244:47;9308:131;9434:4;9308:131;:::i;:::-;9300:139;;9027:419;;;:::o;9452:180::-;9500:77;9497:1;9490:88;9597:4;9594:1;9587:15;9621:4;9618:1;9611:15;9638:180;9686:77;9683:1;9676:88;9783:4;9780:1;9773:15;9807:4;9804:1;9797:15;9824:410;9864:7;9887:20;9905:1;9887:20;:::i;:::-;9882:25;;9921:20;9939:1;9921:20;:::i;:::-;9916:25;;9976:1;9973;9969:9;9998:30;10016:11;9998:30;:::i;:::-;9987:41;;10177:1;10168:7;10164:15;10161:1;10158:22;10138:1;10131:9;10111:83;10088:139;;10207:18;;:::i;:::-;10088:139;9872:362;9824:410;;;;:::o;10240:180::-;10288:77;10285:1;10278:88;10385:4;10382:1;10375:15;10409:4;10406:1;10399:15;10426:185;10466:1;10483:20;10501:1;10483:20;:::i;:::-;10478:25;;10517:20;10535:1;10517:20;:::i;:::-;10512:25;;10556:1;10546:35;;10561:18;;:::i;:::-;10546:35;10603:1;10600;10596:9;10591:14;;10426:185;;;;:::o;10617:194::-;10657:4;10677:20;10695:1;10677:20;:::i;:::-;10672:25;;10711:20;10729:1;10711:20;:::i;:::-;10706:25;;10755:1;10752;10748:9;10740:17;;10779:1;10773:4;10770:11;10767:37;;;10784:18;;:::i;:::-;10767:37;10617:194;;;;:::o;10817:180::-;10865:77;10862:1;10855:88;10962:4;10959:1;10952:15;10986:4;10983:1;10976:15;11003:332;11124:4;11162:2;11151:9;11147:18;11139:26;;11175:71;11243:1;11232:9;11228:17;11219:6;11175:71;:::i;:::-;11256:72;11324:2;11313:9;11309:18;11300:6;11256:72;:::i;:::-;11003:332;;;;;:::o;11341:191::-;11381:3;11400:20;11418:1;11400:20;:::i;:::-;11395:25;;11434:20;11452:1;11434:20;:::i;:::-;11429:25;;11477:1;11474;11470:9;11463:16;;11498:3;11495:1;11492:10;11489:36;;;11505:18;;:::i;:::-;11489:36;11341:191;;;;:::o;11538:163::-;11678:15;11674:1;11666:6;11662:14;11655:39;11538:163;:::o;11707:366::-;11849:3;11870:67;11934:2;11929:3;11870:67;:::i;:::-;11863:74;;11946:93;12035:3;11946:93;:::i;:::-;12064:2;12059:3;12055:12;12048:19;;11707:366;;;:::o;12079:419::-;12245:4;12283:2;12272:9;12268:18;12260:26;;12332:9;12326:4;12322:20;12318:1;12307:9;12303:17;12296:47;12360:131;12486:4;12360:131;:::i;:::-;12352:139;;12079:419;;;:::o;12504:182::-;12644:34;12640:1;12632:6;12628:14;12621:58;12504:182;:::o;12692:366::-;12834:3;12855:67;12919:2;12914:3;12855:67;:::i;:::-;12848:74;;12931:93;13020:3;12931:93;:::i;:::-;13049:2;13044:3;13040:12;13033:19;;12692:366;;;:::o;13064:419::-;13230:4;13268:2;13257:9;13253:18;13245:26;;13317:9;13311:4;13307:20;13303:1;13292:9;13288:17;13281:47;13345:131;13471:4;13345:131;:::i;:::-;13337:139;;13064:419;;;:::o;13489:143::-;13546:5;13577:6;13571:13;13562:22;;13593:33;13620:5;13593:33;:::i;:::-;13489:143;;;;:::o;13638:351::-;13708:6;13757:2;13745:9;13736:7;13732:23;13728:32;13725:119;;;13763:79;;:::i;:::-;13725:119;13883:1;13908:64;13964:7;13955:6;13944:9;13940:22;13908:64;:::i;:::-;13898:74;;13854:128;13638:351;;;;:::o;13995:175::-;14135:27;14131:1;14123:6;14119:14;14112:51;13995:175;:::o;14176:366::-;14318:3;14339:67;14403:2;14398:3;14339:67;:::i;:::-;14332:74;;14415:93;14504:3;14415:93;:::i;:::-;14533:2;14528:3;14524:12;14517:19;;14176:366;;;:::o;14548:419::-;14714:4;14752:2;14741:9;14737:18;14729:26;;14801:9;14795:4;14791:20;14787:1;14776:9;14772:17;14765:47;14829:131;14955:4;14829:131;:::i;:::-;14821:139;;14548:419;;;:::o;14973:178::-;15113:30;15109:1;15101:6;15097:14;15090:54;14973:178;:::o;15157:366::-;15299:3;15320:67;15384:2;15379:3;15320:67;:::i;:::-;15313:74;;15396:93;15485:3;15396:93;:::i;:::-;15514:2;15509:3;15505:12;15498:19;;15157:366;;;:::o;15529:419::-;15695:4;15733:2;15722:9;15718:18;15710:26;;15782:9;15776:4;15772:20;15768:1;15757:9;15753:17;15746:47;15810:131;15936:4;15810:131;:::i;:::-;15802:139;;15529:419;;;:::o;15954:175::-;16094:27;16090:1;16082:6;16078:14;16071:51;15954:175;:::o;16135:366::-;16277:3;16298:67;16362:2;16357:3;16298:67;:::i;:::-;16291:74;;16374:93;16463:3;16374:93;:::i;:::-;16492:2;16487:3;16483:12;16476:19;;16135:366;;;:::o;16507:419::-;16673:4;16711:2;16700:9;16696:18;16688:26;;16760:9;16754:4;16750:20;16746:1;16735:9;16731:17;16724:47;16788:131;16914:4;16788:131;:::i;:::-;16780:139;;16507:419;;;:::o;16932:173::-;17072:25;17068:1;17060:6;17056:14;17049:49;16932:173;:::o;17111:366::-;17253:3;17274:67;17338:2;17333:3;17274:67;:::i;:::-;17267:74;;17350:93;17439:3;17350:93;:::i;:::-;17468:2;17463:3;17459:12;17452:19;;17111:366;;;:::o;17483:419::-;17649:4;17687:2;17676:9;17672:18;17664:26;;17736:9;17730:4;17726:20;17722:1;17711:9;17707:17;17700:47;17764:131;17890:4;17764:131;:::i;:::-;17756:139;;17483:419;;;:::o;17908:177::-;18048:29;18044:1;18036:6;18032:14;18025:53;17908:177;:::o;18091:366::-;18233:3;18254:67;18318:2;18313:3;18254:67;:::i;:::-;18247:74;;18330:93;18419:3;18330:93;:::i;:::-;18448:2;18443:3;18439:12;18432:19;;18091:366;;;:::o;18463:419::-;18629:4;18667:2;18656:9;18652:18;18644:26;;18716:9;18710:4;18706:20;18702:1;18691:9;18687:17;18680:47;18744:131;18870:4;18744:131;:::i;:::-;18736:139;;18463:419;;;:::o;18888:174::-;19028:26;19024:1;19016:6;19012:14;19005:50;18888:174;:::o;19068:366::-;19210:3;19231:67;19295:2;19290:3;19231:67;:::i;:::-;19224:74;;19307:93;19396:3;19307:93;:::i;:::-;19425:2;19420:3;19416:12;19409:19;;19068:366;;;:::o;19440:419::-;19606:4;19644:2;19633:9;19629:18;19621:26;;19693:9;19687:4;19683:20;19679:1;19668:9;19664:17;19657:47;19721:131;19847:4;19721:131;:::i;:::-;19713:139;;19440:419;;;:::o;19865:174::-;20005:26;20001:1;19993:6;19989:14;19982:50;19865:174;:::o;20045:366::-;20187:3;20208:67;20272:2;20267:3;20208:67;:::i;:::-;20201:74;;20284:93;20373:3;20284:93;:::i;:::-;20402:2;20397:3;20393:12;20386:19;;20045:366;;;:::o;20417:419::-;20583:4;20621:2;20610:9;20606:18;20598:26;;20670:9;20664:4;20660:20;20656:1;20645:9;20641:17;20634:47;20698:131;20824:4;20698:131;:::i;:::-;20690:139;;20417:419;;;:::o;20842:231::-;20982:34;20978:1;20970:6;20966:14;20959:58;21051:14;21046:2;21038:6;21034:15;21027:39;20842:231;:::o;21079:366::-;21221:3;21242:67;21306:2;21301:3;21242:67;:::i;:::-;21235:74;;21318:93;21407:3;21318:93;:::i;:::-;21436:2;21431:3;21427:12;21420:19;;21079:366;;;:::o;21451:419::-;21617:4;21655:2;21644:9;21640:18;21632:26;;21704:9;21698:4;21694:20;21690:1;21679:9;21675:17;21668:47;21732:131;21858:4;21732:131;:::i;:::-;21724:139;;21451:419;;;:::o;21876:172::-;22016:24;22012:1;22004:6;22000:14;21993:48;21876:172;:::o;22054:366::-;22196:3;22217:67;22281:2;22276:3;22217:67;:::i;:::-;22210:74;;22293:93;22382:3;22293:93;:::i;:::-;22411:2;22406:3;22402:12;22395:19;;22054:366;;;:::o;22426:419::-;22592:4;22630:2;22619:9;22615:18;22607:26;;22679:9;22673:4;22669:20;22665:1;22654:9;22650:17;22643:47;22707:131;22833:4;22707:131;:::i;:::-;22699:139;;22426:419;;;:::o;22851:172::-;22991:24;22987:1;22979:6;22975:14;22968:48;22851:172;:::o;23029:366::-;23171:3;23192:67;23256:2;23251:3;23192:67;:::i;:::-;23185:74;;23268:93;23357:3;23268:93;:::i;:::-;23386:2;23381:3;23377:12;23370:19;;23029:366;;;:::o;23401:419::-;23567:4;23605:2;23594:9;23590:18;23582:26;;23654:9;23648:4;23644:20;23640:1;23629:9;23625:17;23618:47;23682:131;23808:4;23682:131;:::i;:::-;23674:139;;23401:419;;;:::o;23826:223::-;23966:34;23962:1;23954:6;23950:14;23943:58;24035:6;24030:2;24022:6;24018:15;24011:31;23826:223;:::o;24055:366::-;24197:3;24218:67;24282:2;24277:3;24218:67;:::i;:::-;24211:74;;24294:93;24383:3;24294:93;:::i;:::-;24412:2;24407:3;24403:12;24396:19;;24055:366;;;:::o;24427:419::-;24593:4;24631:2;24620:9;24616:18;24608:26;;24680:9;24674:4;24670:20;24666:1;24655:9;24651:17;24644:47;24708:131;24834:4;24708:131;:::i;:::-;24700:139;;24427:419;;;:::o;24852:169::-;24992:21;24988:1;24980:6;24976:14;24969:45;24852:169;:::o;25027:366::-;25169:3;25190:67;25254:2;25249:3;25190:67;:::i;:::-;25183:74;;25266:93;25355:3;25266:93;:::i;:::-;25384:2;25379:3;25375:12;25368:19;;25027:366;;;:::o;25399:419::-;25565:4;25603:2;25592:9;25588:18;25580:26;;25652:9;25646:4;25642:20;25638:1;25627:9;25623:17;25616:47;25680:131;25806:4;25680:131;:::i;:::-;25672:139;;25399:419;;;:::o;25824:332::-;25945:4;25983:2;25972:9;25968:18;25960:26;;25996:71;26064:1;26053:9;26049:17;26040:6;25996:71;:::i;:::-;26077:72;26145:2;26134:9;26130:18;26121:6;26077:72;:::i;:::-;25824:332;;;;;:::o;26162:442::-;26311:4;26349:2;26338:9;26334:18;26326:26;;26362:71;26430:1;26419:9;26415:17;26406:6;26362:71;:::i;:::-;26443:72;26511:2;26500:9;26496:18;26487:6;26443:72;:::i;:::-;26525;26593:2;26582:9;26578:18;26569:6;26525:72;:::i;:::-;26162:442;;;;;;:::o

Swarm Source

ipfs://27f08ca993022cf6dd7f4714ac2e7973b2f2d7b8ade855dc53673748bae9878e

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.