Contract

0x2B266a72CA344253f8a00d5A1dEA08bC67820F0f

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

-

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StakingContractV2

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at SonicScan.org on 2024-12-18
*/

// Sources flattened with hardhat v2.13.0 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File contracts/StakingContractV2.sol

pragma solidity ^0.8.0;


// custom errors
error StakingFailed(address caller);
error UnstakingFailed(address caller);
error WithdrawingFailed();

contract StakingContractV2 is Ownable {
    IERC20 public sFSToken;
    address public fsTokenAddress;
    // holds the factors responsible for calculating rewards
    struct CalculationFactors {
        uint256[] lockupPeriods; // period for which token will be locked e.g. 0 is 30 days, 1 is 180 days, and so on
        uint256[] rewardFactors; // will be used to calculate reward e.g. 0 is 331 (for an APY of 3000% and locked for 30 days)
    }
    // holds information about a stake
    struct Stake {
        uint256 poolIndex; // 0 if staked for pool at index 0
        uint8 lockIndex; // 0 if locked for 30, 1 if locked for 180 days, and so on
        uint256 lockedAmount; // amount of tokens locked e.g., fs, pgk
        uint256 sFSLockedAmount; // amount of sFS locked e.g., sFS
        uint256 reward; // amount of tokens user will receive as reward
        uint256 timestamp; // time at which user staked tokens
        uint256 unstakeTimestamp; // time at which user can unstake tokens
        bool unstake; // true, if user unstaked their locked tokens
    }
    // array of stakes
    Stake[] public stakes;
    // holds information about pool
    struct Pool {
        IERC20 depositToken;
        IERC20 rewardToken;
        uint256 stakedSoFar; // token staked so far
        uint256 maxStake; // maximum amount of token that can be staked
        CalculationFactors calculationFactors; // factors that will influence reward
        bool pausePool; // will pause the pool and stop accepting new stakers
        uint256 rewardsToBePaid; // amount of rewward token that needs to be paid
    }
    // array of pools
    Pool[] public pools;

    // maps address with the pools
    mapping(address => uint256[]) public poolsOfAddress;
    // maps address with the stakes
    mapping(address => uint256[]) public stakesOfAddress;
    // maps index of stake with owner
    mapping(uint256 => address) public ownerOfIndex;
    // maps addresses with pool
    mapping(uint256 => address[]) public stakersOfPool;

    // events
    event tokenStaked(
        address indexed staker,
        uint256 indexed poolIndex,
        uint256 amountStaked,
        uint256 claimableReward,
        uint256 unstakeTimestamp
    );
    event tokenUnstaked(
        address indexed staker,
        uint256 stakeIndex,
        uint256 indexed poolIndex,
        uint256 reward
    );
    event rewardsWithdrawn(
        address indexed owner,
        uint256 indexed poolIndex,
        uint256 timestamp,
        uint256 withdrawnAmount
    );
    event poolInitialized(
        uint256 indexed poolIndex,
        address depositToken,
        address rewardToken,
        uint256 maxStake,
        uint256[] lockupPeriods,
        uint256[] rewardFactors
    );

    constructor(IERC20 _sFSToken, address _fsTokenAddress) {
        sFSToken = _sFSToken;
        fsTokenAddress = _fsTokenAddress;
        // dead stack
        stakes.push(
            Stake({
                poolIndex: 0,
                lockIndex: 0,
                lockedAmount: 0,
                sFSLockedAmount: 0,
                reward: 0,
                timestamp: block.timestamp,
                unstakeTimestamp: block.timestamp,
                unstake: true
            })
        );
    }

    /// @dev Allows owner to add new reward pool
    /// @param _depositToken deposit token contract
    /// @param _rewardToken reward token contract
    /// @param _maxStake max amount of token that can be staked in the pool
    /// @param _lockupPeriods array of lockup periods eg. 0 is 30 days, 1 is 90 days, and so on
    /// @param _rewardFactors array of reward factors eg. 0 is 3313, 1 is 13596, and so on (for APY 3000%)
    function initializePool(
        IERC20 _depositToken,
        IERC20 _rewardToken,
        uint256 _maxStake,
        uint256[] memory _lockupPeriods,
        uint256[] memory _rewardFactors
    ) public onlyOwner {
        require(
            _lockupPeriods.length == _rewardFactors.length,
            "Lockup Periods and Reward Factors must have same length!"
        );
        pools.push(
            Pool({
                depositToken: _depositToken,
                rewardToken: _rewardToken,
                stakedSoFar: 0,
                maxStake: _maxStake,
                calculationFactors: CalculationFactors({
                    lockupPeriods: _lockupPeriods,
                    rewardFactors: _rewardFactors
                }),
                pausePool: false,
                rewardsToBePaid: 0
            })
        );
        // emit event
        emit poolInitialized(
            pools.length - 1,
            address(_depositToken),
            address(_rewardToken),
            _maxStake,
            _lockupPeriods,
            _rewardFactors
        );
    }

    /// @dev Throws if pool is not valid
    modifier isValidPool(uint256 _poolIndex) {
        require(_poolIndex < pools.length, "Not a valid pool index!");
        _;
    }

    /// @dev Throws if lockup period index is not valid for the pool
    modifier isValidLockupPeriod(uint256 _poolIndex, uint8 _lockIndex) {
        require(
            _lockIndex <
                pools[_poolIndex].calculationFactors.lockupPeriods.length,
            "Doesn't match a valid lockup period!"
        );
        _;
    }

    /// @dev Throws if someone is already staking in the given pool
    modifier noOneStaked(uint256 _poolIndex) {
        require(pools[_poolIndex].stakedSoFar == 0, "Staking Started!");
        _;
    }

    /* Checks */
    /// @dev Allows user to check if user is staking in the pool
    /// @param _poolIndex index of the pool
    /// @param _user address of the user
    /// @return returns true if user is staking, else false
    function isStakingIn(
        uint256 _poolIndex,
        address _user
    ) public view returns (bool) {
        uint256[] memory _pools = poolsOfAddress[_user];
        for (uint256 index = 0; index < _pools.length; index++) {
            if (_pools[index] == _poolIndex) {
                uint256 stakeIndex = stakesOfAddress[_user][index];
                Stake memory stake = stakes[stakeIndex];
                if (!stake.unstake) {
                    return true;
                }
            }
        }
        return false;
    }

    /// @dev Checks if tokenAddress is the address of FS token
    /// @param _tokenAddress address of the token
    /// @return returns true if tokenAddress is the address of FS token, else false
    function isFSToken(address _tokenAddress) public view returns (bool) {
        return _tokenAddress == fsTokenAddress;
    }

    /* Setters */
    /// @dev Allows owner to updates the maximum amount of tokens that can be staked for a given pool
    /// @param _poolIndex index of the pool
    /// @param _maxStake amount to which maxStake will get initialized to
    function updateMaxStake(
        uint256 _poolIndex,
        uint256 _maxStake
    ) external onlyOwner isValidPool(_poolIndex) noOneStaked(_poolIndex) {
        pools[_poolIndex].maxStake = _maxStake;
    }

    /// @dev Allows owner to update the lockupPeriods and rewardFactors for the given pool
    /// @param _poolIndex index of the pool
    /// @param _lockupPeriods array of lockup periods eg. 0 is 30 days, 1 is 90 days, and so on
    /// @param _rewardFactors array of reward factors eg. 0 is 3313, 1 is 13596, and so on (for APY 3000%)
    function updateCalculationFactors(
        uint256 _poolIndex,
        uint256[] memory _lockupPeriods,
        uint256[] memory _rewardFactors
    ) public onlyOwner isValidPool(_poolIndex) noOneStaked(_poolIndex) {
        require(
            _lockupPeriods.length == _rewardFactors.length,
            "Lockup Periods and Reward Factors must have same length!"
        );
        pools[_poolIndex].calculationFactors = CalculationFactors({
            lockupPeriods: _lockupPeriods,
            rewardFactors: _rewardFactors
        });
    }

    /// @dev Allows owner to toggle pause for the given pool
    /// @param _poolIndex index of the pool
    function togglePausePoolFor(
        uint256 _poolIndex
    ) public onlyOwner isValidPool(_poolIndex) {
        pools[_poolIndex].pausePool = !pools[_poolIndex].pausePool;
    }

    /* Getters */
    /// @dev Returns array of pools
    /// @return pools array of pools
    function getPools() public view returns (Pool[] memory) {
        return pools;
    }

    /// @dev Returns address of all the staker who has staked their tokens
    /// @param _poolIndex index of the pool
    /// @return stakers array of addresses
    function getStakersOf(
        uint256 _poolIndex
    ) public view returns (address[] memory) {
        return stakersOfPool[_poolIndex];
    }

    /// @dev Returns stake infos for a staker
    /// @param _staker address for which stake info is returned
    /// @return _stakes stakes of the user
    function getStakesOf(address _staker) public view returns (Stake[] memory) {
        uint256[] memory _stakeIndexs = stakesOfAddress[_staker];
        Stake[] memory _stakes = new Stake[](_stakeIndexs.length);
        for (uint256 index = 0; index < _stakes.length; index++) {
            _stakes[index] = stakes[_stakeIndexs[index]];
        }
        return _stakes;
    }

    /// @dev Returns max reward token required for the given pool
    /// @param _poolIndex index of the pool
    /// @return maxReward amount of reward token that might need for the pool
    function getMaxRewards(
        uint256 _poolIndex
    ) public view isValidPool(_poolIndex) returns (uint256) {
        uint256 maxReward = calculateReward(
            pools[_poolIndex].maxStake,
            _poolIndex,
            uint8(pools[_poolIndex].calculationFactors.rewardFactors.length - 1)
        );
        return maxReward;
    }

    /// @dev Allows user to return the index of stake in stakes for the given pool
    /// @param _poolIndex index of the pool
    /// @param _user address of the user
    /// @return stakeIndex the return variables of a contract’s function state variable
    function getStakeIndex(
        uint256 _poolIndex,
        address _user
    ) public view returns (uint256) {
        uint256[] memory stakeIndexes = stakesOfAddress[_user];
        require(stakeIndexes.length != 0, "Haven't staked any tokens!");
        uint256[] memory _pools = poolsOfAddress[_user];
        uint256 stakeIndex;
        for (uint256 index = 0; index < _pools.length; index++) {
            if (_pools[index] == _poolIndex) {
                stakeIndex = stakeIndexes[index];
            }
        }
        return stakeIndex;
    }

    /* Business Logic */
    /// @dev Calculates and returns rewards that user can get for the given pool
    /// @param _amount amount of tokens for which rewards will be calculated
    /// @param _poolIndex amount of tokens for which rewards will be calculated
    /// @param _lockIndex index in lockupPeriods[], and rewardFactors[] eg. for 0 lockupPeriod is 30 days and rewardFactor is 3313(for APY 3000%)
    /// @return reward amount of token user can get
    function calculateReward(
        uint256 _amount,
        uint256 _poolIndex,
        uint8 _lockIndex
    )
        public
        view
        isValidPool(_poolIndex)
        isValidLockupPeriod(_poolIndex, _lockIndex)
        returns (uint256)
    {
        uint256 rewardFactor = pools[_poolIndex]
            .calculationFactors
            .rewardFactors[_lockIndex];
        return (_amount * rewardFactor) / 10000;
    }

    /// @dev Allow user to stake tokens for a selected period for the given pool
    /// @param _amount amount of token user will stake
    /// @param _poolIndex index of the pool
    /// @param _lockIndex selected period index in lockupPeriods[] eg. 0 is 30 days
    function stakeTokens(
        uint256 _amount,
        uint256 _sFSAmount,
        uint256 _poolIndex,
        uint8 _lockIndex
    )
        public
        isValidPool(_poolIndex)
        isValidLockupPeriod(_poolIndex, _lockIndex)
    {
        // checks
        require(_amount > 0, "Cannot stake 0 tokens!");
        require(!isStakingIn(_poolIndex, msg.sender), "Can't stake twice!");
        require(
            pools[_poolIndex].stakedSoFar + _amount <
                pools[_poolIndex].maxStake,
            "Staking limit reached!"
        );
        if (!isFSToken(address(pools[_poolIndex].depositToken))) {
            _sFSAmount = 0;
        }
        // calculations
        uint256 _lockingPeriod = pools[_poolIndex]
            .calculationFactors
            .lockupPeriods[_lockIndex];
        uint256 _reward = calculateReward(_amount, _poolIndex, _lockIndex);
        Stake memory stake = Stake({
            poolIndex: _poolIndex,
            lockIndex: _lockIndex,
            lockedAmount: _amount,
            sFSLockedAmount: _sFSAmount,
            reward: _reward,
            timestamp: block.timestamp,
            unstakeTimestamp: block.timestamp + _lockingPeriod * (1 days),
            unstake: false
        });
        stakersOfPool[_poolIndex].push(msg.sender);
        poolsOfAddress[msg.sender].push(_poolIndex);
        stakesOfAddress[msg.sender].push(stakes.length);
        ownerOfIndex[stakes.length] = msg.sender;
        stakes.push(stake);
        pools[_poolIndex].stakedSoFar += _amount;
        pools[_poolIndex].rewardsToBePaid += _reward;
        // transfer deposit token
        if (_sFSAmount > 0) {
            bool sFSSuccess = sFSToken.transferFrom(
                msg.sender,
                address(this),
                _sFSAmount
            );
            if (!sFSSuccess) {
                revert StakingFailed(msg.sender);
            }
        }
        bool success = pools[_poolIndex].depositToken.transferFrom(
            msg.sender,
            address(this),
            _amount - _sFSAmount
        );
        if (!success) {
            revert StakingFailed(msg.sender);
        }
        emit tokenStaked(
            msg.sender,
            _poolIndex,
            _amount,
            _reward,
            block.timestamp + _lockingPeriod * (1 days)
        );
    }

    /// @dev Allows user to unstake deposited tokens and withdraw rewards once lockup period is finished for the given pool
    /// @param _poolIndex index of the pool
    function unstakeTokens(uint256 _poolIndex) public isValidPool(_poolIndex) {
        // checks
        require(
            isStakingIn(_poolIndex, msg.sender),
            "Haven't staked any tokens!"
        );
        uint256 stakeIndex = getStakeIndex(_poolIndex, msg.sender);
        require(
            msg.sender == ownerOfIndex[stakeIndex],
            "You're not the owner of the stake!"
        );
        Stake storage _stake = stakes[stakeIndex];
        require(
            _stake.unstakeTimestamp < block.timestamp,
            "Lockup period not finished!"
        );
        // update state
        uint256 _reward = _stake.reward;
        uint256 _lockedAmount = _stake.lockedAmount;
        uint256 _sFSLockedAmount = _stake.sFSLockedAmount;
        _stake.unstake = true;
        pools[_poolIndex].rewardsToBePaid -= _reward;
        // transfer tokens
        if (_sFSLockedAmount > 0) {
            bool sFSSuccess = sFSToken.transfer(msg.sender, _sFSLockedAmount);
            if (!sFSSuccess) {
                revert UnstakingFailed(msg.sender);
            }
        }
        bool success = (pools[_poolIndex].depositToken.transfer(
            msg.sender,
            _lockedAmount - _sFSLockedAmount
        ) && pools[_poolIndex].rewardToken.transfer(msg.sender, _reward));
        if (!success) {
            revert UnstakingFailed(msg.sender);
        }
        emit tokenUnstaked(msg.sender, stakeIndex, _poolIndex, _reward);
    }

    /// @dev Allows owner to withdraw rewards by substracting rewards that needs to be paid, and pause staking
    /// @param _poolIndex index of the pool
    function withdrawRewards(
        uint256 _poolIndex
    ) external onlyOwner isValidPool(_poolIndex) {
        uint256 _balance = pools[_poolIndex].rewardToken.balanceOf(
            address(this)
        ) - pools[_poolIndex].rewardsToBePaid;
        require(
            _balance > 0,
            "Balance is less or equal to rewards to be paid!"
        );
        // pause staking
        if (!pools[_poolIndex].pausePool) {
            togglePausePoolFor(_poolIndex);
        }
        // transfer
        bool success = pools[_poolIndex].rewardToken.transfer(
            msg.sender,
            _balance
        );
        if (!success) {
            revert WithdrawingFailed();
        }
        emit rewardsWithdrawn(
            msg.sender,
            _poolIndex,
            block.timestamp,
            _balance
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_sFSToken","type":"address"},{"internalType":"address","name":"_fsTokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"StakingFailed","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"UnstakingFailed","type":"error"},{"inputs":[],"name":"WithdrawingFailed","type":"error"},{"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":"uint256","name":"poolIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"depositToken","type":"address"},{"indexed":false,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"maxStake","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"lockupPeriods","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"rewardFactors","type":"uint256[]"}],"name":"poolInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawnAmount","type":"uint256"}],"name":"rewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claimableReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeTimestamp","type":"uint256"}],"name":"tokenStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"poolIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"tokenUnstaked","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_poolIndex","type":"uint256"},{"internalType":"uint8","name":"_lockIndex","type":"uint8"}],"name":"calculateReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fsTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"}],"name":"getMaxRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPools","outputs":[{"components":[{"internalType":"contract IERC20","name":"depositToken","type":"address"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"stakedSoFar","type":"uint256"},{"internalType":"uint256","name":"maxStake","type":"uint256"},{"components":[{"internalType":"uint256[]","name":"lockupPeriods","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardFactors","type":"uint256[]"}],"internalType":"struct StakingContractV2.CalculationFactors","name":"calculationFactors","type":"tuple"},{"internalType":"bool","name":"pausePool","type":"bool"},{"internalType":"uint256","name":"rewardsToBePaid","type":"uint256"}],"internalType":"struct StakingContractV2.Pool[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getStakeIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"}],"name":"getStakersOf","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"getStakesOf","outputs":[{"components":[{"internalType":"uint256","name":"poolIndex","type":"uint256"},{"internalType":"uint8","name":"lockIndex","type":"uint8"},{"internalType":"uint256","name":"lockedAmount","type":"uint256"},{"internalType":"uint256","name":"sFSLockedAmount","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"unstakeTimestamp","type":"uint256"},{"internalType":"bool","name":"unstake","type":"bool"}],"internalType":"struct StakingContractV2.Stake[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_depositToken","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_maxStake","type":"uint256"},{"internalType":"uint256[]","name":"_lockupPeriods","type":"uint256[]"},{"internalType":"uint256[]","name":"_rewardFactors","type":"uint256[]"}],"name":"initializePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"isFSToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"isStakingIn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOfIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"contract IERC20","name":"depositToken","type":"address"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"stakedSoFar","type":"uint256"},{"internalType":"uint256","name":"maxStake","type":"uint256"},{"components":[{"internalType":"uint256[]","name":"lockupPeriods","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardFactors","type":"uint256[]"}],"internalType":"struct StakingContractV2.CalculationFactors","name":"calculationFactors","type":"tuple"},{"internalType":"bool","name":"pausePool","type":"bool"},{"internalType":"uint256","name":"rewardsToBePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolsOfAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sFSToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_sFSAmount","type":"uint256"},{"internalType":"uint256","name":"_poolIndex","type":"uint256"},{"internalType":"uint8","name":"_lockIndex","type":"uint8"}],"name":"stakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakersOfPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"poolIndex","type":"uint256"},{"internalType":"uint8","name":"lockIndex","type":"uint8"},{"internalType":"uint256","name":"lockedAmount","type":"uint256"},{"internalType":"uint256","name":"sFSLockedAmount","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"unstakeTimestamp","type":"uint256"},{"internalType":"bool","name":"unstake","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakesOfAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"}],"name":"togglePausePoolFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"}],"name":"unstakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"},{"internalType":"uint256[]","name":"_lockupPeriods","type":"uint256[]"},{"internalType":"uint256[]","name":"_rewardFactors","type":"uint256[]"}],"name":"updateCalculationFactors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"},{"internalType":"uint256","name":"_maxStake","type":"uint256"}],"name":"updateMaxStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolIndex","type":"uint256"}],"name":"withdrawRewards","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002cb138038062002cb1833981016040819052620000349162000280565b6200003f3362000217565b600180546001600160a01b039384166001600160a01b03199182161782556002805493909416921691909117909155604080516101008101825260008082526020820181815292820181815260608301828152608084018381524260a0860181815260c0870191825260e08701898152600380549a8b018155909652955160089098027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b81019890985595517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c8801805460ff9290921660ff1992831617905592517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d88015590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e870155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f86015591517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f86085015591517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f86184015590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f862909201805492151592909116919091179055620002bf565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200027d57600080fd5b50565b600080604083850312156200029457600080fd5b8251620002a18162000267565b6020840151909250620002b48162000267565b809150509250929050565b6129e280620002cf6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063914b0d67116100de578063b8514d7011610097578063d29e769711610071578063d29e7697146103ac578063d5a44f86146103bf578063f2fde38b14610411578063fafc08c41461042457600080fd5b8063b8514d701461035d578063b96437b414610370578063c32daa271461038357600080fd5b8063914b0d67146102cb5780639342c8f4146102de578063a7916e80146102f1578063ac4afa3814610304578063b50e98441461032a578063b77865521461034a57600080fd5b8063674b5e511161014b5780637eedbf32116101255780637eedbf3214610281578063850877ba1461029457806388b3685c146102a75780638da5cb5b146102ba57600080fd5b8063674b5e5114610226578063715018a61461025857806376a25c5c1461026057600080fd5b80631c59601a146101935780632185d3e3146101a85780634cb5e40a146101bb57806351411307146101ce578063608e4dd0146101fe578063673a2a1f14610211575b600080fd5b6101a66101a136600461225f565b610444565b005b6101a66101b636600461234f565b610b33565b6101a66101c93660046123bc565b610c5f565b6002546101e1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a661020c3660046123de565b610d21565b610219611147565b6040516101f59190612469565b610248610234366004612539565b6002546001600160a01b0391821691161490565b60405190151581526020016101f5565b6101a66112b2565b61027361026e36600461255d565b6112c6565b6040519081526020016101f5565b6101a661028f366004612592565b6113a5565b6101a66102a23660046123de565b6115c1565b6102736102b5366004612625565b611658565b6000546001600160a01b03166101e1565b6102736102d9366004612625565b611689565b6101a66102ec3660046123de565b6116a5565b6102736102ff366004612651565b611930565b6103176103123660046123de565b611ab8565b6040516101f59796959493929190612681565b61033d6103383660046123de565b611bc8565b6040516101f591906126d1565b6101e16103583660046123bc565b611c34565b61024861036b366004612651565b611c6c565b6001546101e1906001600160a01b031681565b6101e16103913660046123de565b6007602052600090815260409020546001600160a01b031681565b6102736103ba3660046123de565b611df3565b6103d26103cd3660046123de565b611e7f565b6040805198895260ff9097166020890152958701949094526060860192909252608085015260a084015260c0830152151560e0820152610100016101f5565b6101a661041f366004612539565b611edc565b610437610432366004612539565b611f55565b6040516101f5919061271e565b600454829081106104705760405162461bcd60e51b8152600401610467906127b0565b60405180910390fd5b828260048281548110610485576104856127e7565b600091825260209091206004600890920201015460ff8216106104ba5760405162461bcd60e51b8152600401610467906127fd565b600087116105035760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74207374616b65203020746f6b656e732160501b6044820152606401610467565b61050d8533611c6c565b1561054f5760405162461bcd60e51b815260206004820152601260248201527143616e2774207374616b652074776963652160701b6044820152606401610467565b60048581548110610562576105626127e7565b9060005260206000209060080201600301548760048781548110610588576105886127e7565b9060005260206000209060080201600201546105a49190612857565b106105ea5760405162461bcd60e51b81526020600482015260166024820152755374616b696e67206c696d697420726561636865642160501b6044820152606401610467565b61062560048681548110610600576106006127e7565b60009182526020909120600890910201546002546001600160a01b0390811691161490565b61062e57600095505b600060048681548110610643576106436127e7565b90600052602060002090600802016004016000018560ff168154811061066b5761066b6127e7565b9060005260206000200154905060006106858988886112c6565b905060006040518061010001604052808981526020018860ff1681526020018b81526020018a815260200183815260200142815260200184620151806106cb919061286a565b6106d59042612857565b815260200160001515815250905060086000898152602001908152602001600020339080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b0316021790555060056000336001600160a01b03166001600160a01b0316815260200190815260200160002088908060018154018082558091505060019003906000526020600020016000909190919091505560066000336001600160a01b03166001600160a01b0316815260200190815260200160002060038054905090806001815401808255809150506001900390600052602060002001600090919091909150553360076000600380549050815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060038190806001815401808255809150506001900390600052602060002090600802016000909190919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff021916908315150217905550505089600489815481106108d6576108d66127e7565b906000526020600020906008020160020160008282546108f69190612857565b925050819055508160048981548110610911576109116127e7565b906000526020600020906008020160070160008282546109319190612857565b909155505088156109dc576001546040516323b872dd60e01b8152336004820152306024820152604481018b90526000916001600160a01b0316906323b872dd906064016020604051808303816000875af1158015610994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b89190612881565b9050806109da5760405163321ac46360e21b8152336004820152602401610467565b505b6000600489815481106109f1576109f16127e7565b906000526020600020906008020160000160009054906101000a90046001600160a01b03166001600160a01b03166323b872dd33308d8f610a3291906128a3565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa9190612881565b905080610acc5760405163321ac46360e21b8152336004820152602401610467565b88337f623a52ead62bbd868a56635a27a328daa4f25aca7c858db37bafd648d3222d088d86610afe896201518061286a565b610b089042612857565b6040805193845260208401929092529082015260600160405180910390a35050505050505050505050565b610b3b61213f565b60045483908110610b5e5760405162461bcd60e51b8152600401610467906127b0565b8360048181548110610b7257610b726127e7565b906000526020600020906008020160020154600014610bc65760405162461bcd60e51b815260206004820152601060248201526f5374616b696e6720537461727465642160801b6044820152606401610467565b8251845114610be75760405162461bcd60e51b8152600401610467906128b6565b60405180604001604052808581526020018481525060048681548110610c0f57610c0f6127e7565b90600052602060002090600802016004016000820151816000019080519060200190610c3c9291906121e9565b506020828101518051610c5592600185019201906121e9565b5050505050505050565b610c6761213f565b60045482908110610c8a5760405162461bcd60e51b8152600401610467906127b0565b8260048181548110610c9e57610c9e6127e7565b906000526020600020906008020160020154600014610cf25760405162461bcd60e51b815260206004820152601060248201526f5374616b696e6720537461727465642160801b6044820152606401610467565b8260048581548110610d0657610d066127e7565b90600052602060002090600802016003018190555050505050565b60045481908110610d445760405162461bcd60e51b8152600401610467906127b0565b610d4e8233611c6c565b610d9a5760405162461bcd60e51b815260206004820152601a60248201527f486176656e2774207374616b656420616e7920746f6b656e73210000000000006044820152606401610467565b6000610da68333611930565b6000818152600760205260409020549091506001600160a01b03163314610e1a5760405162461bcd60e51b815260206004820152602260248201527f596f75277265206e6f7420746865206f776e6572206f6620746865207374616b604482015261652160f01b6064820152608401610467565b600060038281548110610e2f57610e2f6127e7565b9060005260206000209060080201905042816006015410610e925760405162461bcd60e51b815260206004820152601b60248201527f4c6f636b757020706572696f64206e6f742066696e69736865642100000000006044820152606401610467565b6004808201546002830154600384015460078501805460ff191660011790558354929391929091849189908110610ecb57610ecb6127e7565b90600052602060002090600802016007016000828254610eeb91906128a3565b90915550508015610f905760015460405163a9059cbb60e01b8152336004820152602481018390526000916001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c9190612881565b905080610f8e576040516306eebc9160e41b8152336004820152602401610467565b505b600060048881548110610fa557610fa56127e7565b60009182526020909120600890910201546001600160a01b031663a9059cbb33610fcf85876128a3565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103e9190612881565b80156110de575060048881548110611058576110586127e7565b600091825260209091206008909102016001015460405163a9059cbb60e01b8152336004820152602481018690526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156110ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110de9190612881565b905080611100576040516306eebc9160e41b8152336004820152602401610467565b6040805187815260208101869052899133917f38e08fefabca105df8107822c6ebaebecb9e77dec2fd3b2e1ef075b32ffa0f47910160405180910390a35050505050505050565b60606004805480602002602001604051908101604052809291908181526020016000905b828210156112a95760008481526020908190206040805160e0810182526008860290920180546001600160a01b0390811684526001820154168385015260028101548383015260038101546060808501919091528251600483018054968702820183018552938101868152949592946080870194919391928492849184018282801561121657602002820191906000526020600020905b815481526020019060010190808311611202575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561126e57602002820191906000526020600020905b81548152602001906001019080831161125a575b505050919092525050508152600682015460ff161515602080830191909152600790920154604090910152908252600192909201910161116b565b50505050905090565b6112ba61213f565b6112c46000612199565b565b600454600090839081106112ec5760405162461bcd60e51b8152600401610467906127b0565b838360048281548110611301576113016127e7565b600091825260209091206004600890920201015460ff8216106113365760405162461bcd60e51b8152600401610467906127fd565b60006004878154811061134b5761134b6127e7565b90600052602060002090600802016004016001018660ff1681548110611373576113736127e7565b90600052602060002001549050612710818961138f919061286a565b6113999190612913565b98975050505050505050565b6113ad61213f565b80518251146113ce5760405162461bcd60e51b8152600401610467906128b6565b6040805160e0810182526001600160a01b03808816825286811660208084019182526000848601818152606086018a815287518089019098528988528784018990526080870197885260a0870183905260c08701839052600480546001810182559352865160089093027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b810180549488166001600160a01b031995861617815595517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c8201805491909816941693909317909555517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d82015592517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e8401559351805180519495929491937f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f019261152c928492909101906121e9565b50602082810151805161154592600185019201906121e9565b50505060a082015160068201805460ff191691151591909117905560c09091015160079091015560045461157b906001906128a3565b7fbba45e87f800dd9fa0cce76cb99a81e5458db6733b8505e248dae3e4ebcdd99c86868686866040516115b2959493929190612935565b60405180910390a25050505050565b6115c961213f565b600454819081106115ec5760405162461bcd60e51b8152600401610467906127b0565b600482815481106115ff576115ff6127e7565b906000526020600020906008020160060160009054906101000a900460ff161560048381548110611632576116326127e7565b60009182526020909120600890910201600601805460ff19169115159190911790555050565b6006602052816000526040600020818154811061167457600080fd5b90600052602060002001600091509150505481565b6005602052816000526040600020818154811061167457600080fd5b6116ad61213f565b600454819081106116d05760405162461bcd60e51b8152600401610467906127b0565b6000600483815481106116e5576116e56127e7565b9060005260206000209060080201600701546004848154811061170a5761170a6127e7565b60009182526020909120600890910201600101546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611763573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611787919061297a565b61179191906128a3565b9050600081116117fb5760405162461bcd60e51b815260206004820152602f60248201527f42616c616e6365206973206c657373206f7220657175616c20746f207265776160448201526e72647320746f20626520706169642160881b6064820152608401610467565b6004838154811061180e5761180e6127e7565b600091825260209091206006600890920201015460ff1661183257611832836115c1565b600060048481548110611847576118476127e7565b600091825260209091206008909102016001015460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156118a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cd9190612881565b9050806118ed57604051636415e05160e01b815260040160405180910390fd5b6040805142815260208101849052859133917f13ccef0d32e8b13efb514a5943610a8397131b1baf329cc70f8db5944c5a882b910160405180910390a350505050565b6001600160a01b03811660009081526006602090815260408083208054825181850281018501909352808352849383018282801561198d57602002820191906000526020600020905b815481526020019060010190808311611979575b5050505050905080516000036119e55760405162461bcd60e51b815260206004820152601a60248201527f486176656e2774207374616b656420616e7920746f6b656e73210000000000006044820152606401610467565b6001600160a01b038316600090815260056020908152604080832080548251818502810185019093528083529192909190830182828015611a4557602002820191906000526020600020905b815481526020019060010190808311611a31575b50505050509050600080600090505b8251811015611aac5786838281518110611a7057611a706127e7565b602002602001015103611a9a57838181518110611a8f57611a8f6127e7565b602002602001015191505b80611aa481612993565b915050611a54565b50925050505b92915050565b60048181548110611ac857600080fd5b6000918252602091829020600890910201805460018201546002830154600384015460408051600487018054606099810283018a0184529282018381526001600160a01b039788169a509590961697939692959294909384928491840182828015611b5257602002820191906000526020600020905b815481526020019060010190808311611b3e575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611baa57602002820191906000526020600020905b815481526020019060010190808311611b96575b505050919092525050506006820154600790920154909160ff169087565b600081815260086020908152604091829020805483518184028101840190945280845260609392830182828015611c2857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c0a575b50505050509050919050565b60086020528160005260406000208181548110611c5057600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b038116600090815260056020908152604080832080548251818502810185019093528083528493830182828015611cc957602002820191906000526020600020905b815481526020019060010190808311611cb5575b5050505050905060005b8151811015611de85784828281518110611cef57611cef6127e7565b602002602001015103611dd6576001600160a01b0384166000908152600660205260408120805483908110611d2657611d266127e7565b90600052602060002001549050600060038281548110611d4857611d486127e7565b60009182526020918290206040805161010081018252600890930290910180548352600181015460ff908116948401949094526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c083015260070154909116151560e08201819052909150611dd3576001945050505050611ab2565b50505b80611de081612993565b915050611cd3565b506000949350505050565b60045460009082908110611e195760405162461bcd60e51b8152600401610467906127b0565b6000611e7760048581548110611e3157611e316127e7565b90600052602060002090600802016003015485600160048881548110611e5957611e596127e7565b600091825260209091206005600890920201015461026e91906128a3565b949350505050565b60038181548110611e8f57600080fd5b60009182526020909120600890910201805460018201546002830154600384015460048501546005860154600687015460079097015495975060ff94851696939592949193909290911688565b611ee461213f565b6001600160a01b038116611f495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610467565b611f5281612199565b50565b6001600160a01b0381166000908152600660209081526040808320805482518185028101850190935280835260609493830182828015611fb457602002820191906000526020600020905b815481526020019060010190808311611fa0575b505050505090506000815167ffffffffffffffff811115611fd757611fd761229e565b60405190808252806020026020018201604052801561205557816020015b61204260405180610100016040528060008152602001600060ff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b815260200190600190039081611ff55790505b50905060005b8151811015612137576003838281518110612078576120786127e7565b602002602001015181548110612090576120906127e7565b60009182526020918290206040805161010081018252600890930290910180548352600181015460ff908116948401949094526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c083015260070154909116151560e08201528251839083908110612119576121196127e7565b6020026020010181905250808061212f90612993565b91505061205b565b509392505050565b6000546001600160a01b031633146112c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610467565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215612224579160200282015b82811115612224578251825591602001919060010190612209565b50612230929150612234565b5090565b5b808211156122305760008155600101612235565b803560ff8116811461225a57600080fd5b919050565b6000806000806080858703121561227557600080fd5b84359350602085013592506040850135915061229360608601612249565b905092959194509250565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126122c557600080fd5b8135602067ffffffffffffffff808311156122e2576122e261229e565b8260051b604051601f19603f830116810181811084821117156123075761230761229e565b60405293845285810183019383810192508785111561232557600080fd5b83870191505b848210156123445781358352918301919083019061232b565b979650505050505050565b60008060006060848603121561236457600080fd5b83359250602084013567ffffffffffffffff8082111561238357600080fd5b61238f878388016122b4565b935060408601359150808211156123a557600080fd5b506123b2868287016122b4565b9150509250925092565b600080604083850312156123cf57600080fd5b50508035926020909101359150565b6000602082840312156123f057600080fd5b5035919050565b600081518084526020808501945080840160005b838110156124275781518752958201959082019060010161240b565b509495945050505050565b600081516040845261244760408501826123f7565b90506020830151848203602086015261246082826123f7565b95945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561251657888303603f19018552815180516001600160a01b03908116855288820151168885015286810151878501526060808201519085015260808082015160e082870181905291906124e983880182612432565b60a08581015115159089015260c09485015194909701939093525050509386019390860190600101612490565b509098975050505050505050565b6001600160a01b0381168114611f5257600080fd5b60006020828403121561254b57600080fd5b813561255681612524565b9392505050565b60008060006060848603121561257257600080fd5b833592506020840135915061258960408501612249565b90509250925092565b600080600080600060a086880312156125aa57600080fd5b85356125b581612524565b945060208601356125c581612524565b935060408601359250606086013567ffffffffffffffff808211156125e957600080fd5b6125f589838a016122b4565b9350608088013591508082111561260b57600080fd5b50612618888289016122b4565b9150509295509295909350565b6000806040838503121561263857600080fd5b823561264381612524565b946020939093013593505050565b6000806040838503121561266457600080fd5b82359150602083013561267681612524565b809150509250929050565b6001600160a01b03888116825287166020820152604081018690526060810185905260e0608082018190526000906126bb90830186612432565b93151560a08301525060c0015295945050505050565b6020808252825182820181905260009190848201906040850190845b818110156127125783516001600160a01b0316835292840192918401916001016126ed565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156127a3578151805185528681015160ff16878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e090810151151590850152610100909301929085019060010161273b565b5091979650505050505050565b60208082526017908201527f4e6f7420612076616c696420706f6f6c20696e64657821000000000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526024908201527f446f65736e2774206d6174636820612076616c6964206c6f636b757020706572604082015263696f642160e01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115611ab257611ab2612841565b8082028115828204841417611ab257611ab2612841565b60006020828403121561289357600080fd5b8151801515811461255657600080fd5b81810381811115611ab257611ab2612841565b60208082526038908201527f4c6f636b757020506572696f647320616e642052657761726420466163746f7260408201527f73206d75737420686176652073616d65206c656e677468210000000000000000606082015260800190565b60008261293057634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b038681168252851660208201526040810184905260a060608201819052600090612968908301856123f7565b828103608084015261139981856123f7565b60006020828403121561298c57600080fd5b5051919050565b6000600182016129a5576129a5612841565b506001019056fea2646970667358221220d66d6a7264e80ccb0bd4b84a8926e01e1857808ddd54550249e2e5b5c671b5fd64736f6c63430008120033000000000000000000000000a81b289dc053c242b43aed38f2b77e30dd459ec1000000000000000000000000bc0d0650412ef353d672c0bbd12efff90591b251

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063914b0d67116100de578063b8514d7011610097578063d29e769711610071578063d29e7697146103ac578063d5a44f86146103bf578063f2fde38b14610411578063fafc08c41461042457600080fd5b8063b8514d701461035d578063b96437b414610370578063c32daa271461038357600080fd5b8063914b0d67146102cb5780639342c8f4146102de578063a7916e80146102f1578063ac4afa3814610304578063b50e98441461032a578063b77865521461034a57600080fd5b8063674b5e511161014b5780637eedbf32116101255780637eedbf3214610281578063850877ba1461029457806388b3685c146102a75780638da5cb5b146102ba57600080fd5b8063674b5e5114610226578063715018a61461025857806376a25c5c1461026057600080fd5b80631c59601a146101935780632185d3e3146101a85780634cb5e40a146101bb57806351411307146101ce578063608e4dd0146101fe578063673a2a1f14610211575b600080fd5b6101a66101a136600461225f565b610444565b005b6101a66101b636600461234f565b610b33565b6101a66101c93660046123bc565b610c5f565b6002546101e1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101a661020c3660046123de565b610d21565b610219611147565b6040516101f59190612469565b610248610234366004612539565b6002546001600160a01b0391821691161490565b60405190151581526020016101f5565b6101a66112b2565b61027361026e36600461255d565b6112c6565b6040519081526020016101f5565b6101a661028f366004612592565b6113a5565b6101a66102a23660046123de565b6115c1565b6102736102b5366004612625565b611658565b6000546001600160a01b03166101e1565b6102736102d9366004612625565b611689565b6101a66102ec3660046123de565b6116a5565b6102736102ff366004612651565b611930565b6103176103123660046123de565b611ab8565b6040516101f59796959493929190612681565b61033d6103383660046123de565b611bc8565b6040516101f591906126d1565b6101e16103583660046123bc565b611c34565b61024861036b366004612651565b611c6c565b6001546101e1906001600160a01b031681565b6101e16103913660046123de565b6007602052600090815260409020546001600160a01b031681565b6102736103ba3660046123de565b611df3565b6103d26103cd3660046123de565b611e7f565b6040805198895260ff9097166020890152958701949094526060860192909252608085015260a084015260c0830152151560e0820152610100016101f5565b6101a661041f366004612539565b611edc565b610437610432366004612539565b611f55565b6040516101f5919061271e565b600454829081106104705760405162461bcd60e51b8152600401610467906127b0565b60405180910390fd5b828260048281548110610485576104856127e7565b600091825260209091206004600890920201015460ff8216106104ba5760405162461bcd60e51b8152600401610467906127fd565b600087116105035760405162461bcd60e51b815260206004820152601660248201527543616e6e6f74207374616b65203020746f6b656e732160501b6044820152606401610467565b61050d8533611c6c565b1561054f5760405162461bcd60e51b815260206004820152601260248201527143616e2774207374616b652074776963652160701b6044820152606401610467565b60048581548110610562576105626127e7565b9060005260206000209060080201600301548760048781548110610588576105886127e7565b9060005260206000209060080201600201546105a49190612857565b106105ea5760405162461bcd60e51b81526020600482015260166024820152755374616b696e67206c696d697420726561636865642160501b6044820152606401610467565b61062560048681548110610600576106006127e7565b60009182526020909120600890910201546002546001600160a01b0390811691161490565b61062e57600095505b600060048681548110610643576106436127e7565b90600052602060002090600802016004016000018560ff168154811061066b5761066b6127e7565b9060005260206000200154905060006106858988886112c6565b905060006040518061010001604052808981526020018860ff1681526020018b81526020018a815260200183815260200142815260200184620151806106cb919061286a565b6106d59042612857565b815260200160001515815250905060086000898152602001908152602001600020339080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b0316021790555060056000336001600160a01b03166001600160a01b0316815260200190815260200160002088908060018154018082558091505060019003906000526020600020016000909190919091505560066000336001600160a01b03166001600160a01b0316815260200190815260200160002060038054905090806001815401808255809150506001900390600052602060002001600090919091909150553360076000600380549050815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060038190806001815401808255809150506001900390600052602060002090600802016000909190919091506000820151816000015560208201518160010160006101000a81548160ff021916908360ff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff021916908315150217905550505089600489815481106108d6576108d66127e7565b906000526020600020906008020160020160008282546108f69190612857565b925050819055508160048981548110610911576109116127e7565b906000526020600020906008020160070160008282546109319190612857565b909155505088156109dc576001546040516323b872dd60e01b8152336004820152306024820152604481018b90526000916001600160a01b0316906323b872dd906064016020604051808303816000875af1158015610994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b89190612881565b9050806109da5760405163321ac46360e21b8152336004820152602401610467565b505b6000600489815481106109f1576109f16127e7565b906000526020600020906008020160000160009054906101000a90046001600160a01b03166001600160a01b03166323b872dd33308d8f610a3291906128a3565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa9190612881565b905080610acc5760405163321ac46360e21b8152336004820152602401610467565b88337f623a52ead62bbd868a56635a27a328daa4f25aca7c858db37bafd648d3222d088d86610afe896201518061286a565b610b089042612857565b6040805193845260208401929092529082015260600160405180910390a35050505050505050505050565b610b3b61213f565b60045483908110610b5e5760405162461bcd60e51b8152600401610467906127b0565b8360048181548110610b7257610b726127e7565b906000526020600020906008020160020154600014610bc65760405162461bcd60e51b815260206004820152601060248201526f5374616b696e6720537461727465642160801b6044820152606401610467565b8251845114610be75760405162461bcd60e51b8152600401610467906128b6565b60405180604001604052808581526020018481525060048681548110610c0f57610c0f6127e7565b90600052602060002090600802016004016000820151816000019080519060200190610c3c9291906121e9565b506020828101518051610c5592600185019201906121e9565b5050505050505050565b610c6761213f565b60045482908110610c8a5760405162461bcd60e51b8152600401610467906127b0565b8260048181548110610c9e57610c9e6127e7565b906000526020600020906008020160020154600014610cf25760405162461bcd60e51b815260206004820152601060248201526f5374616b696e6720537461727465642160801b6044820152606401610467565b8260048581548110610d0657610d066127e7565b90600052602060002090600802016003018190555050505050565b60045481908110610d445760405162461bcd60e51b8152600401610467906127b0565b610d4e8233611c6c565b610d9a5760405162461bcd60e51b815260206004820152601a60248201527f486176656e2774207374616b656420616e7920746f6b656e73210000000000006044820152606401610467565b6000610da68333611930565b6000818152600760205260409020549091506001600160a01b03163314610e1a5760405162461bcd60e51b815260206004820152602260248201527f596f75277265206e6f7420746865206f776e6572206f6620746865207374616b604482015261652160f01b6064820152608401610467565b600060038281548110610e2f57610e2f6127e7565b9060005260206000209060080201905042816006015410610e925760405162461bcd60e51b815260206004820152601b60248201527f4c6f636b757020706572696f64206e6f742066696e69736865642100000000006044820152606401610467565b6004808201546002830154600384015460078501805460ff191660011790558354929391929091849189908110610ecb57610ecb6127e7565b90600052602060002090600802016007016000828254610eeb91906128a3565b90915550508015610f905760015460405163a9059cbb60e01b8152336004820152602481018390526000916001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c9190612881565b905080610f8e576040516306eebc9160e41b8152336004820152602401610467565b505b600060048881548110610fa557610fa56127e7565b60009182526020909120600890910201546001600160a01b031663a9059cbb33610fcf85876128a3565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561101a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103e9190612881565b80156110de575060048881548110611058576110586127e7565b600091825260209091206008909102016001015460405163a9059cbb60e01b8152336004820152602481018690526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156110ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110de9190612881565b905080611100576040516306eebc9160e41b8152336004820152602401610467565b6040805187815260208101869052899133917f38e08fefabca105df8107822c6ebaebecb9e77dec2fd3b2e1ef075b32ffa0f47910160405180910390a35050505050505050565b60606004805480602002602001604051908101604052809291908181526020016000905b828210156112a95760008481526020908190206040805160e0810182526008860290920180546001600160a01b0390811684526001820154168385015260028101548383015260038101546060808501919091528251600483018054968702820183018552938101868152949592946080870194919391928492849184018282801561121657602002820191906000526020600020905b815481526020019060010190808311611202575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561126e57602002820191906000526020600020905b81548152602001906001019080831161125a575b505050919092525050508152600682015460ff161515602080830191909152600790920154604090910152908252600192909201910161116b565b50505050905090565b6112ba61213f565b6112c46000612199565b565b600454600090839081106112ec5760405162461bcd60e51b8152600401610467906127b0565b838360048281548110611301576113016127e7565b600091825260209091206004600890920201015460ff8216106113365760405162461bcd60e51b8152600401610467906127fd565b60006004878154811061134b5761134b6127e7565b90600052602060002090600802016004016001018660ff1681548110611373576113736127e7565b90600052602060002001549050612710818961138f919061286a565b6113999190612913565b98975050505050505050565b6113ad61213f565b80518251146113ce5760405162461bcd60e51b8152600401610467906128b6565b6040805160e0810182526001600160a01b03808816825286811660208084019182526000848601818152606086018a815287518089019098528988528784018990526080870197885260a0870183905260c08701839052600480546001810182559352865160089093027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b810180549488166001600160a01b031995861617815595517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c8201805491909816941693909317909555517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d82015592517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e8401559351805180519495929491937f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f019261152c928492909101906121e9565b50602082810151805161154592600185019201906121e9565b50505060a082015160068201805460ff191691151591909117905560c09091015160079091015560045461157b906001906128a3565b7fbba45e87f800dd9fa0cce76cb99a81e5458db6733b8505e248dae3e4ebcdd99c86868686866040516115b2959493929190612935565b60405180910390a25050505050565b6115c961213f565b600454819081106115ec5760405162461bcd60e51b8152600401610467906127b0565b600482815481106115ff576115ff6127e7565b906000526020600020906008020160060160009054906101000a900460ff161560048381548110611632576116326127e7565b60009182526020909120600890910201600601805460ff19169115159190911790555050565b6006602052816000526040600020818154811061167457600080fd5b90600052602060002001600091509150505481565b6005602052816000526040600020818154811061167457600080fd5b6116ad61213f565b600454819081106116d05760405162461bcd60e51b8152600401610467906127b0565b6000600483815481106116e5576116e56127e7565b9060005260206000209060080201600701546004848154811061170a5761170a6127e7565b60009182526020909120600890910201600101546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611763573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611787919061297a565b61179191906128a3565b9050600081116117fb5760405162461bcd60e51b815260206004820152602f60248201527f42616c616e6365206973206c657373206f7220657175616c20746f207265776160448201526e72647320746f20626520706169642160881b6064820152608401610467565b6004838154811061180e5761180e6127e7565b600091825260209091206006600890920201015460ff1661183257611832836115c1565b600060048481548110611847576118476127e7565b600091825260209091206008909102016001015460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156118a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cd9190612881565b9050806118ed57604051636415e05160e01b815260040160405180910390fd5b6040805142815260208101849052859133917f13ccef0d32e8b13efb514a5943610a8397131b1baf329cc70f8db5944c5a882b910160405180910390a350505050565b6001600160a01b03811660009081526006602090815260408083208054825181850281018501909352808352849383018282801561198d57602002820191906000526020600020905b815481526020019060010190808311611979575b5050505050905080516000036119e55760405162461bcd60e51b815260206004820152601a60248201527f486176656e2774207374616b656420616e7920746f6b656e73210000000000006044820152606401610467565b6001600160a01b038316600090815260056020908152604080832080548251818502810185019093528083529192909190830182828015611a4557602002820191906000526020600020905b815481526020019060010190808311611a31575b50505050509050600080600090505b8251811015611aac5786838281518110611a7057611a706127e7565b602002602001015103611a9a57838181518110611a8f57611a8f6127e7565b602002602001015191505b80611aa481612993565b915050611a54565b50925050505b92915050565b60048181548110611ac857600080fd5b6000918252602091829020600890910201805460018201546002830154600384015460408051600487018054606099810283018a0184529282018381526001600160a01b039788169a509590961697939692959294909384928491840182828015611b5257602002820191906000526020600020905b815481526020019060010190808311611b3e575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611baa57602002820191906000526020600020905b815481526020019060010190808311611b96575b505050919092525050506006820154600790920154909160ff169087565b600081815260086020908152604091829020805483518184028101840190945280845260609392830182828015611c2857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c0a575b50505050509050919050565b60086020528160005260406000208181548110611c5057600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b038116600090815260056020908152604080832080548251818502810185019093528083528493830182828015611cc957602002820191906000526020600020905b815481526020019060010190808311611cb5575b5050505050905060005b8151811015611de85784828281518110611cef57611cef6127e7565b602002602001015103611dd6576001600160a01b0384166000908152600660205260408120805483908110611d2657611d266127e7565b90600052602060002001549050600060038281548110611d4857611d486127e7565b60009182526020918290206040805161010081018252600890930290910180548352600181015460ff908116948401949094526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c083015260070154909116151560e08201819052909150611dd3576001945050505050611ab2565b50505b80611de081612993565b915050611cd3565b506000949350505050565b60045460009082908110611e195760405162461bcd60e51b8152600401610467906127b0565b6000611e7760048581548110611e3157611e316127e7565b90600052602060002090600802016003015485600160048881548110611e5957611e596127e7565b600091825260209091206005600890920201015461026e91906128a3565b949350505050565b60038181548110611e8f57600080fd5b60009182526020909120600890910201805460018201546002830154600384015460048501546005860154600687015460079097015495975060ff94851696939592949193909290911688565b611ee461213f565b6001600160a01b038116611f495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610467565b611f5281612199565b50565b6001600160a01b0381166000908152600660209081526040808320805482518185028101850190935280835260609493830182828015611fb457602002820191906000526020600020905b815481526020019060010190808311611fa0575b505050505090506000815167ffffffffffffffff811115611fd757611fd761229e565b60405190808252806020026020018201604052801561205557816020015b61204260405180610100016040528060008152602001600060ff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b815260200190600190039081611ff55790505b50905060005b8151811015612137576003838281518110612078576120786127e7565b602002602001015181548110612090576120906127e7565b60009182526020918290206040805161010081018252600890930290910180548352600181015460ff908116948401949094526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c083015260070154909116151560e08201528251839083908110612119576121196127e7565b6020026020010181905250808061212f90612993565b91505061205b565b509392505050565b6000546001600160a01b031633146112c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610467565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215612224579160200282015b82811115612224578251825591602001919060010190612209565b50612230929150612234565b5090565b5b808211156122305760008155600101612235565b803560ff8116811461225a57600080fd5b919050565b6000806000806080858703121561227557600080fd5b84359350602085013592506040850135915061229360608601612249565b905092959194509250565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126122c557600080fd5b8135602067ffffffffffffffff808311156122e2576122e261229e565b8260051b604051601f19603f830116810181811084821117156123075761230761229e565b60405293845285810183019383810192508785111561232557600080fd5b83870191505b848210156123445781358352918301919083019061232b565b979650505050505050565b60008060006060848603121561236457600080fd5b83359250602084013567ffffffffffffffff8082111561238357600080fd5b61238f878388016122b4565b935060408601359150808211156123a557600080fd5b506123b2868287016122b4565b9150509250925092565b600080604083850312156123cf57600080fd5b50508035926020909101359150565b6000602082840312156123f057600080fd5b5035919050565b600081518084526020808501945080840160005b838110156124275781518752958201959082019060010161240b565b509495945050505050565b600081516040845261244760408501826123f7565b90506020830151848203602086015261246082826123f7565b95945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561251657888303603f19018552815180516001600160a01b03908116855288820151168885015286810151878501526060808201519085015260808082015160e082870181905291906124e983880182612432565b60a08581015115159089015260c09485015194909701939093525050509386019390860190600101612490565b509098975050505050505050565b6001600160a01b0381168114611f5257600080fd5b60006020828403121561254b57600080fd5b813561255681612524565b9392505050565b60008060006060848603121561257257600080fd5b833592506020840135915061258960408501612249565b90509250925092565b600080600080600060a086880312156125aa57600080fd5b85356125b581612524565b945060208601356125c581612524565b935060408601359250606086013567ffffffffffffffff808211156125e957600080fd5b6125f589838a016122b4565b9350608088013591508082111561260b57600080fd5b50612618888289016122b4565b9150509295509295909350565b6000806040838503121561263857600080fd5b823561264381612524565b946020939093013593505050565b6000806040838503121561266457600080fd5b82359150602083013561267681612524565b809150509250929050565b6001600160a01b03888116825287166020820152604081018690526060810185905260e0608082018190526000906126bb90830186612432565b93151560a08301525060c0015295945050505050565b6020808252825182820181905260009190848201906040850190845b818110156127125783516001600160a01b0316835292840192918401916001016126ed565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b828110156127a3578151805185528681015160ff16878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e090810151151590850152610100909301929085019060010161273b565b5091979650505050505050565b60208082526017908201527f4e6f7420612076616c696420706f6f6c20696e64657821000000000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526024908201527f446f65736e2774206d6174636820612076616c6964206c6f636b757020706572604082015263696f642160e01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115611ab257611ab2612841565b8082028115828204841417611ab257611ab2612841565b60006020828403121561289357600080fd5b8151801515811461255657600080fd5b81810381811115611ab257611ab2612841565b60208082526038908201527f4c6f636b757020506572696f647320616e642052657761726420466163746f7260408201527f73206d75737420686176652073616d65206c656e677468210000000000000000606082015260800190565b60008261293057634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b038681168252851660208201526040810184905260a060608201819052600090612968908301856123f7565b828103608084015261139981856123f7565b60006020828403121561298c57600080fd5b5051919050565b6000600182016129a5576129a5612841565b506001019056fea2646970667358221220d66d6a7264e80ccb0bd4b84a8926e01e1857808ddd54550249e2e5b5c671b5fd64736f6c63430008120033

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

000000000000000000000000a81b289dc053c242b43aed38f2b77e30dd459ec1000000000000000000000000bc0d0650412ef353d672c0bbd12efff90591b251

-----Decoded View---------------
Arg [0] : _sFSToken (address): 0xa81b289dc053c242B43aed38F2B77E30dd459Ec1
Arg [1] : _fsTokenAddress (address): 0xBC0d0650412EF353D672c0Bbd12eFFF90591B251

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a81b289dc053c242b43aed38f2b77e30dd459ec1
Arg [1] : 000000000000000000000000bc0d0650412ef353d672c0bbd12efff90591b251


Deployed Bytecode Sourcemap

6784:17242:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18894:2414;;;;;;:::i;:::-;;:::i;:::-;;14398:559;;;;;;:::i;:::-;;:::i;13836:212::-;;;;;;:::i;:::-;;:::i;6858:29::-;;;;;-1:-1:-1;;;;;6858:29:0;;;;;;-1:-1:-1;;;;;2691:32:1;;;2673:51;;2661:2;2646:18;6858:29:0;;;;;;;;21486:1502;;;;;;:::i;:::-;;:::i;15356:87::-;;;:::i;:::-;;;;;;;:::i;13460:126::-;;;;;;:::i;:::-;13564:14;;-1:-1:-1;;;;;13547:31:0;;;13564:14;;13547:31;;13460:126;;;;5907:14:1;;5900:22;5882:41;;5870:2;5855:18;13460:126:0;5742:187:1;2882:103:0;;;:::i;18174:444::-;;;;;;:::i;:::-;;:::i;:::-;;;6403:25:1;;;6391:2;6376:18;18174:444:0;6257:177:1;10585:1126:0;;;;;;:::i;:::-;;:::i;15072:182::-;;;;;;:::i;:::-;;:::i;8611:52::-;;;;;;:::i;:::-;;:::i;2234:87::-;2280:7;2307:6;-1:-1:-1;;;;;2307:6:0;2234:87;;8516:51;;;;;;:::i;:::-;;:::i;23153:870::-;;;;;;:::i;:::-;;:::i;17132:567::-;;;;;;:::i;:::-;;:::i;8452:19::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;15616:148::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8796:50::-;;;;;;:::i;:::-;;:::i;12695:557::-;;;;;;:::i;:::-;;:::i;6829:22::-;;;;;-1:-1:-1;;;;;6829:22:0;;;8709:47;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;8709:47:0;;;16508:354;;;;;;:::i;:::-;;:::i;7905:21::-;;;;;;:::i;:::-;;:::i;:::-;;;;10090:25:1;;;10163:4;10151:17;;;10146:2;10131:18;;10124:45;10185:18;;;10178:34;;;;10243:2;10228:18;;10221:34;;;;10286:3;10271:19;;10264:35;10330:3;10315:19;;10308:35;10374:3;10359:19;;10352:35;10431:14;10424:22;10418:3;10403:19;;10396:51;10077:3;10062:19;7905:21:0;9757:696:1;3140:201:0;;;;;;:::i;:::-;;:::i;15928:381::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18894:2414::-;11834:5;:12;19070:10;;11821:25;;11813:61;;;;-1:-1:-1;;;11813:61:0;;;;;;;:::i;:::-;;;;;;;;;19111:10:::1;19123;12102:5;12108:10;12102:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:36:::1;:17;::::0;;::::1;;:36;:57:::0;12072:87:::1;::::0;::::1;;12050:173;;;;-1:-1:-1::0;;;12050:173:0::1;;;;;;;:::i;:::-;19188:1:::2;19178:7;:11;19170:46;;;::::0;-1:-1:-1;;;19170:46:0;;12820:2:1;19170:46:0::2;::::0;::::2;12802:21:1::0;12859:2;12839:18;;;12832:30;-1:-1:-1;;;12878:18:1;;;12871:52;12940:18;;19170:46:0::2;12618:346:1::0;19170:46:0::2;19236:35;19248:10;19260;19236:11;:35::i;:::-;19235:36;19227:67;;;::::0;-1:-1:-1;;;19227:67:0;;13171:2:1;19227:67:0::2;::::0;::::2;13153:21:1::0;13210:2;13190:18;;;13183:30;-1:-1:-1;;;13229:18:1;;;13222:48;13287:18;;19227:67:0::2;12969:342:1::0;19227:67:0::2;19386:5;19392:10;19386:17;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;19359:7;19327:5;19333:10;19327:17;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;:39;;;;:::i;:::-;:85;19305:157;;;::::0;-1:-1:-1;;;19305:157:0;;13780:2:1;19305:157:0::2;::::0;::::2;13762:21:1::0;13819:2;13799:18;;;13792:30;-1:-1:-1;;;13838:18:1;;;13831:52;13900:18;;19305:157:0::2;13578:346:1::0;19305:157:0::2;19478:50;19496:5;19502:10;19496:17;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:30:::0;13564:14;;-1:-1:-1;;;;;13564:14:0;;;19496:30;::::2;13547:31:::0;;13460:126;19478:50:::2;19473:98;;19558:1;19545:14;;19473:98;19606:22;19631:5;19637:10;19631:17;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;:78;;19710:10;19631:90;;;;;;;;;;:::i;:::-;;;;;;;;;19606:115;;19732:15;19750:48;19766:7;19775:10;19787;19750:15;:48::i;:::-;19732:66;;19809:18;19830:344;;;;;;;;19862:10;19830:344;;;;19898:10;19830:344;;;;;;19937:7;19830:344;;;;19976:10;19830:344;;;;20009:7;19830:344;;;;20042:15;19830:344;;;;20108:14;20126:6;20108:25;;;;:::i;:::-;20090:43;::::0;:15:::2;:43;:::i;:::-;19830:344;;;;20157:5;19830:344;;;;::::0;19809:365:::2;;20185:13;:25;20199:10;20185:25;;;;;;;;;;;20216:10;20185:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20185:42:0::2;;;;;-1:-1:-1::0;;;;;20185:42:0::2;;;;;;20238:14;:26;20253:10;-1:-1:-1::0;;;;;20238:26:0::2;-1:-1:-1::0;;;;;20238:26:0::2;;;;;;;;;;;;20270:10;20238:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20292:15;:27;20308:10;-1:-1:-1::0;;;;;20292:27:0::2;-1:-1:-1::0;;;;;20292:27:0::2;;;;;;;;;;;;20325:6;:13;;;;20292:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20380:10;20350:12;:27;20363:6;:13;;;;20350:27;;;;;;;;;;;;:40;;;;;-1:-1:-1::0;;;;;20350:40:0::2;;;;;-1:-1:-1::0;;;;;20350:40:0::2;;;;;;20401:6;20413:5;20401:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20463:7;20430:5;20436:10;20430:17;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;:40;;;;;;;:::i;:::-;;;;;;;;20518:7;20481:5;20487:10;20481:17;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;:44;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;20575:14:0;;20571:289:::2;;20624:8;::::0;:126:::2;::::0;-1:-1:-1;;;20624:126:0;;20664:10:::2;20624:126;::::0;::::2;14342:34:1::0;20701:4:0::2;14392:18:1::0;;;14385:43;14444:18;;;14437:34;;;20606:15:0::2;::::0;-1:-1:-1;;;;;20624:8:0::2;::::0;:21:::2;::::0;14277:18:1;;20624:126:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20606:144;;20770:10;20765:84;;20808:25;::::0;-1:-1:-1;;;20808:25:0;;20822:10:::2;20808:25;::::0;::::2;2673:51:1::0;2646:18;;20808:25:0::2;2527:203:1::0;20765:84:0::2;20591:269;20571:289;20870:12;20885:5;20891:10;20885:17;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;;;;;;;;;-1:-1:-1::0;;;;;20885:30:0::2;-1:-1:-1::0;;;;;20885:43:0::2;;20943:10;20976:4;21006:10;20996:7;:20;;;;:::i;:::-;20885:142;::::0;-1:-1:-1;;;;;;20885:142:0::2;::::0;;;;;;-1:-1:-1;;;;;14360:15:1;;;20885:142:0::2;::::0;::::2;14342:34:1::0;14412:15;;;;14392:18;;;14385:43;14444:18;;;14437:34;14277:18;;20885:142:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20870:157;;21043:7;21038:73;;21074:25;::::0;-1:-1:-1;;;21074:25:0;;21088:10:::2;21074:25;::::0;::::2;2673:51:1::0;2646:18;;21074:25:0::2;2527:203:1::0;21038:73:0::2;21177:10:::0;21152::::2;21126:174;21202:7:::0;21224;21264:25:::2;:14:::0;21282:6:::2;21264:25;:::i;:::-;21246:43;::::0;:15:::2;:43;:::i;:::-;21126:174;::::0;;15099:25:1;;;15155:2;15140:18;;15133:34;;;;15183:18;;;15176:34;15087:2;15072:18;21126:174:0::2;;;;;;;19140:2168;;;;11885:1:::1;;18894:2414:::0;;;;;:::o;14398:559::-;2120:13;:11;:13::i;:::-;11834:5:::1;:12:::0;14581:10;;11821:25;::::1;11813:61;;;;-1:-1:-1::0;;;11813:61:0::1;;;;;;;:::i;:::-;14605:10:::2;12380:5;12386:10;12380:17;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;12413:1;12380:34;12372:63;;;::::0;-1:-1:-1;;;12372:63:0;;15423:2:1;12372:63:0::2;::::0;::::2;15405:21:1::0;15462:2;15442:18;;;15435:30;-1:-1:-1;;;15481:18:1;;;15474:46;15537:18;;12372:63:0::2;15221:340:1::0;12372:63:0::2;14675:14:::3;:21;14650:14;:21;:46;14628:152;;;;-1:-1:-1::0;;;14628:152:0::3;;;;;;;:::i;:::-;14830:119;;;;;;;;14879:14;14830:119;;;;14923:14;14830:119;;::::0;14791:5:::3;14797:10;14791:17;;;;;;;;:::i;:::-;;;;;;;;;;;:36;;:158;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;14791:158:0::3;::::0;;::::3;::::0;;;::::3;::::0;::::3;::::0;::::3;::::0;::::3;::::0;::::3;:::i;:::-;-1:-1:-1::0;;;;;;;;14398:559:0:o;13836:212::-;2120:13;:11;:13::i;:::-;11834:5:::1;:12:::0;13955:10;;11821:25;::::1;11813:61;;;;-1:-1:-1::0;;;11813:61:0::1;;;;;;;:::i;:::-;13979:10:::2;12380:5;12386:10;12380:17;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;12413:1;12380:34;12372:63;;;::::0;-1:-1:-1;;;12372:63:0;;15423:2:1;12372:63:0::2;::::0;::::2;15405:21:1::0;15462:2;15442:18;;;15435:30;-1:-1:-1;;;15481:18:1;;;15474:46;15537:18;;12372:63:0::2;15221:340:1::0;12372:63:0::2;14031:9:::3;14002:5;14008:10;14002:17;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;:38;;;;11885:1:::2;2144::::1;13836:212:::0;;:::o;21486:1502::-;11834:5;:12;21548:10;;11821:25;;11813:61;;;;-1:-1:-1;;;11813:61:0;;;;;;;:::i;:::-;21612:35:::1;21624:10;21636;21612:11;:35::i;:::-;21590:111;;;::::0;-1:-1:-1;;;21590:111:0;;16193:2:1;21590:111:0::1;::::0;::::1;16175:21:1::0;16232:2;16212:18;;;16205:30;16271:28;16251:18;;;16244:56;16317:18;;21590:111:0::1;15991:350:1::0;21590:111:0::1;21712:18;21733:37;21747:10;21759;21733:13;:37::i;:::-;21817:24;::::0;;;:12:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;;21817:24:0::1;21803:10;:38;21781:122;;;::::0;-1:-1:-1;;;21781:122:0;;16548:2:1;21781:122:0::1;::::0;::::1;16530:21:1::0;16587:2;16567:18;;;16560:30;16626:34;16606:18;;;16599:62;-1:-1:-1;;;16677:18:1;;;16670:32;16719:19;;21781:122:0::1;16346:398:1::0;21781:122:0::1;21914:20;21937:6;21944:10;21937:18;;;;;;;;:::i;:::-;;;;;;;;;;;21914:41;;22014:15;21988:6;:23;;;:41;21966:118;;;::::0;-1:-1:-1;;;21966:118:0;;16951:2:1;21966:118:0::1;::::0;::::1;16933:21:1::0;16990:2;16970:18;;;16963:30;17029:29;17009:18;;;17002:57;17076:18;;21966:118:0::1;16749:351:1::0;21966:118:0::1;22138:13;::::0;;::::1;::::0;22186:19:::1;::::0;::::1;::::0;22243:22:::1;::::0;::::1;::::0;22276:14:::1;::::0;::::1;:21:::0;;-1:-1:-1;;22276:21:0::1;22293:4;22276:21;::::0;;22308:17;;22138:13;;22186:19;;22243:22;;22138:13;;22314:10;;22308:17;::::1;;;;;:::i;:::-;;;;;;;;;;;:33;;;:44;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;22395:20:0;;22391:218:::1;;22450:8;::::0;:47:::1;::::0;-1:-1:-1;;;22450:47:0;;22468:10:::1;22450:47;::::0;::::1;17279:51:1::0;17346:18;;;17339:34;;;22432:15:0::1;::::0;-1:-1:-1;;;;;22450:8:0::1;::::0;:17:::1;::::0;17252:18:1;;22450:47:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22432:65;;22517:10;22512:86;;22555:27;::::0;-1:-1:-1;;;22555:27:0;;22571:10:::1;22555:27;::::0;::::1;2673:51:1::0;2646:18;;22555:27:0::1;2527:203:1::0;22512:86:0::1;22417:192;22391:218;22619:12;22635:5;22641:10;22635:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:30:::0;-1:-1:-1;;;;;22635:30:0::1;:39;22689:10;22714:32;22730:16:::0;22714:13;:32:::1;:::i;:::-;22635:122;::::0;-1:-1:-1;;;;;;22635:122:0::1;::::0;;;;;;-1:-1:-1;;;;;17297:32:1;;;22635:122:0::1;::::0;::::1;17279:51:1::0;17346:18;;;17339:34;17252:18;;22635:122:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:185;;;;;22761:5;22767:10;22761:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:29;;::::0;:59:::1;::::0;-1:-1:-1;;;22761:59:0;;22800:10:::1;22761:59;::::0;::::1;17279:51:1::0;17346:18;;;17339:34;;;-1:-1:-1;;;;;22761:29:0;;::::1;::::0;:38:::1;::::0;17252:18:1;;22761:59:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22619:202;;22837:7;22832:75;;22868:27;::::0;-1:-1:-1;;;22868:27:0;;22884:10:::1;22868:27;::::0;::::1;2673:51:1::0;2646:18;;22868:27:0::1;2527:203:1::0;22832:75:0::1;22922:58;::::0;;17558:25:1;;;17614:2;17599:18;;17592:34;;;22960:10:0;;22936::::1;::::0;22922:58:::1;::::0;17531:18:1;22922:58:0::1;;;;;;;21560:1428;;;;;;21486:1502:::0;;:::o;15356:87::-;15397:13;15430:5;15423:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15423:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15423:12:0;;;;-1:-1:-1;;;15423:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15356:87;:::o;2882:103::-;2120:13;:11;:13::i;:::-;2947:30:::1;2974:1;2947:18;:30::i;:::-;2882:103::o:0;18174:444::-;11834:5;:12;18422:7;;18339:10;;11821:25;;11813:61;;;;-1:-1:-1;;;11813:61:0;;;;;;;:::i;:::-;18380:10:::1;18392;12102:5;12108:10;12102:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:36:::1;:17;::::0;;::::1;;:36;:57:::0;12072:87:::1;::::0;::::1;;12050:173;;;;-1:-1:-1::0;;;12050:173:0::1;;;;;;;:::i;:::-;18447:20:::2;18470:5;18476:10;18470:17;;;;;;;;:::i;:::-;;;;;;;;;;;:50;;:78;;18549:10;18470:90;;;;;;;;;;:::i;:::-;;;;;;;;;18447:113;;18605:5;18589:12;18579:7;:22;;;;:::i;:::-;18578:32;;;;:::i;:::-;18571:39:::0;18174:444;-1:-1:-1;;;;;;;;18174:444:0:o;10585:1126::-;2120:13;:11;:13::i;:::-;10864:14:::1;:21;10839:14;:21;:46;10817:152;;;;-1:-1:-1::0;;;10817:152:0::1;;;;;;;:::i;:::-;11005:436;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;11005:436:0;;::::1;::::0;;;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;11005:436:0;;;;;;;;;;;;11210:143;;;;::::1;::::0;;;;;;;;::::1;::::0;;;11005:436;;;;;;;;;;;;;;;;;;10980:5:::1;:472:::0;;11005:436;10980:472;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;10980:472:0;;::::1;;::::0;;;;;;;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;11005:436;;10980:472;;;;;;;::::1;::::0;;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;10980:472:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;10980:472:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;10980:472:0::1;::::0;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;11521:5:::1;:12:::0;:16:::1;::::0;-1:-1:-1;;11521:16:0::1;:::i;:::-;11491:212;11560:13;11597:12;11625:9;11649:14;11678;11491:212;;;;;;;;;;:::i;:::-;;;;;;;;10585:1126:::0;;;;;:::o;15072:182::-;2120:13;:11;:13::i;:::-;11834:5:::1;:12:::0;15165:10;;11821:25;::::1;11813:61;;;;-1:-1:-1::0;;;11813:61:0::1;;;;;;;:::i;:::-;15219:5:::2;15225:10;15219:17;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;;;;;;;;;;15218:28;15188:5;15194:10;15188:17;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:27;;:58:::0;;-1:-1:-1;;15188:58:0::2;::::0;::::2;;::::0;;;::::2;::::0;;-1:-1:-1;;15072:182:0:o;8611:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8516:51::-;;;;;;;;;;;;;;;;;;;;23153:870;2120:13;:11;:13::i;:::-;11834:5:::1;:12:::0;23245:10;;11821:25;::::1;11813:61;;;;-1:-1:-1::0;;;11813:61:0::1;;;;;;;:::i;:::-;23268:16:::2;23368:5;23374:10;23368:17;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;23287:5;23293:10;23287:17;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:29;;::::0;:78:::2;::::0;-1:-1:-1;;;23287:78:0;;23349:4:::2;23287:78;::::0;::::2;2673:51:1::0;-1:-1:-1;;;;;23287:29:0;;::::2;::::0;:39:::2;::::0;2646:18:1;;23287:78:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:114;;;;:::i;:::-;23268:133;;23445:1;23434:8;:12;23412:109;;;::::0;-1:-1:-1;;;23412:109:0;;19432:2:1;23412:109:0::2;::::0;::::2;19414:21:1::0;19471:2;19451:18;;;19444:30;19510:34;19490:18;;;19483:62;-1:-1:-1;;;19561:18:1;;;19554:45;19616:19;;23412:109:0::2;19230:411:1::0;23412:109:0::2;23563:5;23569:10;23563:17;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:27:::2;:17;::::0;;::::2;;:27;::::0;::::2;;23558:91;;23607:30;23626:10;23607:18;:30::i;:::-;23680:12;23695:5;23701:10;23695:17;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:29;;::::0;:97:::2;::::0;-1:-1:-1;;;23695:97:0;;23748:10:::2;23695:97;::::0;::::2;17279:51:1::0;17346:18;;;17339:34;;;-1:-1:-1;;;;;23695:29:0;;::::2;::::0;:38:::2;::::0;17252:18:1;;23695:97:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23680:112;;23808:7;23803:67;;23839:19;;-1:-1:-1::0;;;23839:19:0::2;;;;;;;;;;;23803:67;23885:130;::::0;;23966:15:::2;17558:25:1::0;;17614:2;17599:18;;17592:34;;;23941:10:0;;23916::::2;::::0;23885:130:::2;::::0;17531:18:1;23885:130:0::2;;;;;;;23257:766;;2144:1:::1;23153:870:::0;:::o;17132:567::-;-1:-1:-1;;;;;17288:22:0;;17236:7;17288:22;;;:15;:22;;;;;;;;17256:54;;;;;;;;;;;;;;;;;17236:7;;17256:54;;17288:22;17256:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17329:12;:19;17352:1;17329:24;17321:63;;;;-1:-1:-1;;;17321:63:0;;16193:2:1;17321:63:0;;;16175:21:1;16232:2;16212:18;;;16205:30;16271:28;16251:18;;;16244:56;16317:18;;17321:63:0;15991:350:1;17321:63:0;-1:-1:-1;;;;;17421:21:0;;17395:23;17421:21;;;:14;:21;;;;;;;;17395:47;;;;;;;;;;;;;;;;;;;17421:21;;17395:47;;;17421:21;17395:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17453:18;17487:13;17503:1;17487:17;;17482:182;17514:6;:13;17506:5;:21;17482:182;;;17574:10;17557:6;17564:5;17557:13;;;;;;;;:::i;:::-;;;;;;;:27;17553:100;;17618:12;17631:5;17618:19;;;;;;;;:::i;:::-;;;;;;;17605:32;;17553:100;17529:7;;;;:::i;:::-;;;;17482:182;;;-1:-1:-1;17681:10:0;-1:-1:-1;;;17132:567:0;;;;;:::o;8452:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8452:19:0;;;;-1:-1:-1;8452:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8452:19:0;;;;-1:-1:-1;;;8452:19:0;;;;;;;;;;;;;;;:::o;15616:148::-;15731:25;;;;:13;:25;;;;;;;;;15724:32;;;;;;;;;;;;;;;;;15695:16;;15724:32;;;15731:25;15724:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15724:32:0;;;;;;;;;;;;;;;;;;;;;;;15616:148;;;:::o;8796:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8796:50:0;;-1:-1:-1;8796:50:0;;-1:-1:-1;8796:50:0:o;12695:557::-;-1:-1:-1;;;;;12840:21:0;;12797:4;12840:21;;;:14;:21;;;;;;;;12814:47;;;;;;;;;;;;;;;;;12797:4;;12814:47;;12840:21;12814:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12877:13;12872:350;12904:6;:13;12896:5;:21;12872:350;;;12964:10;12947:6;12954:5;12947:13;;;;;;;;:::i;:::-;;;;;;;:27;12943:268;;-1:-1:-1;;;;;13016:22:0;;12995:18;13016:22;;;:15;:22;;;;;:29;;13039:5;;13016:29;;;;;;:::i;:::-;;;;;;;;;12995:50;;13064:18;13085:6;13092:10;13085:18;;;;;;;;:::i;:::-;;;;;;;;;;13064:39;;;;;;;;13085:18;;;;;;;13064:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13122:74:0;;13172:4;13165:11;;;;;;;;13122:74;12976:235;;12943:268;12919:7;;;;:::i;:::-;;;;12872:350;;;-1:-1:-1;13239:5:0;;12695:557;-1:-1:-1;;;;12695:557:0:o;16508:354::-;11834:5;:12;16612:7;;16591:10;;11821:25;;11813:61;;;;-1:-1:-1;;;11813:61:0;;;;;;;:::i;:::-;16632:17:::1;16652:175;16682:5;16688:10;16682:17;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;16723:10;16814:1;16754:5;16760:10;16754:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:50;:17:::1;::::0;;::::1;;:50:::0;:57;:61:::1;::::0;;::::1;:::i;16652:175::-;16632:195:::0;16508:354;-1:-1:-1;;;;16508:354:0:o;7905:21::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7905:21:0;;;;;;;;;;;;;;;;;:::o;3140:201::-;2120:13;:11;:13::i;:::-;-1:-1:-1;;;;;3229:22:0;::::1;3221:73;;;::::0;-1:-1:-1;;;3221:73:0;;19988:2:1;3221:73:0::1;::::0;::::1;19970:21:1::0;20027:2;20007:18;;;20000:30;20066:34;20046:18;;;20039:62;-1:-1:-1;;;20117:18:1;;;20110:36;20163:19;;3221:73:0::1;19786:402:1::0;3221:73:0::1;3305:28;3324:8;3305:18;:28::i;:::-;3140:201:::0;:::o;15928:381::-;-1:-1:-1;;;;;16046:24:0;;16014:29;16046:24;;;:15;:24;;;;;;;;16014:56;;;;;;;;;;;;;;;;;15987:14;;16014:29;:56;;16046:24;16014:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16081:22;16118:12;:19;16106:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16106:32:0;;;;;;;;;;;;;;;;;16081:57;;16154:13;16149:128;16181:7;:14;16173:5;:22;16149:128;;;16238:6;16245:12;16258:5;16245:19;;;;;;;;:::i;:::-;;;;;;;16238:27;;;;;;;;:::i;:::-;;;;;;;;;;16221:44;;;;;;;;16238:27;;;;;;;16221:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;;:7;;16229:5;;16221:14;;;;;;:::i;:::-;;;;;;:44;;;;16197:7;;;;;:::i;:::-;;;;16149:128;;;-1:-1:-1;16294:7:0;15928:381;-1:-1:-1;;;15928:381:0:o;2399:132::-;2280:7;2307:6;-1:-1:-1;;;;;2307:6:0;861:10;2463:23;2455:68;;;;-1:-1:-1;;;2455:68:0;;20395:2:1;2455:68:0;;;20377:21:1;;;20414:18;;;20407:30;20473:34;20453:18;;;20446:62;20525:18;;2455:68:0;20193:356:1;3501:191:0;3575:16;3594:6;;-1:-1:-1;;;;;3611:17:0;;;-1:-1:-1;;;;;;3611:17:0;;;;;;3644:40;;3594:6;;;;;;;3644:40;;3575:16;3644:40;3564:128;3501:191;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:156:1;80:20;;140:4;129:16;;119:27;;109:55;;160:1;157;150:12;109:55;14:156;;;:::o;175:387::-;259:6;267;275;283;336:3;324:9;315:7;311:23;307:33;304:53;;;353:1;350;343:12;304:53;389:9;376:23;366:33;;446:2;435:9;431:18;418:32;408:42;;497:2;486:9;482:18;469:32;459:42;;520:36;552:2;541:9;537:18;520:36;:::i;:::-;510:46;;175:387;;;;;;;:::o;567:127::-;628:10;623:3;619:20;616:1;609:31;659:4;656:1;649:15;683:4;680:1;673:15;699:902;753:5;806:3;799:4;791:6;787:17;783:27;773:55;;824:1;821;814:12;773:55;860:6;847:20;886:4;909:18;946:2;942;939:10;936:36;;;952:18;;:::i;:::-;998:2;995:1;991:10;1030:2;1024:9;1093:2;1089:7;1084:2;1080;1076:11;1072:25;1064:6;1060:38;1148:6;1136:10;1133:22;1128:2;1116:10;1113:18;1110:46;1107:72;;;1159:18;;:::i;:::-;1195:2;1188:22;1245:18;;;1321:15;;;1317:24;;;1279:15;;;;-1:-1:-1;1353:15:1;;;1350:35;;;1381:1;1378;1371:12;1350:35;1417:2;1409:6;1405:15;1394:26;;1429:142;1445:6;1440:3;1437:15;1429:142;;;1511:17;;1499:30;;1549:12;;;;1462;;;;1429:142;;;1589:6;699:902;-1:-1:-1;;;;;;;699:902:1:o;1606:663::-;1733:6;1741;1749;1802:2;1790:9;1781:7;1777:23;1773:32;1770:52;;;1818:1;1815;1808:12;1770:52;1854:9;1841:23;1831:33;;1915:2;1904:9;1900:18;1887:32;1938:18;1979:2;1971:6;1968:14;1965:34;;;1995:1;1992;1985:12;1965:34;2018:61;2071:7;2062:6;2051:9;2047:22;2018:61;:::i;:::-;2008:71;;2132:2;2121:9;2117:18;2104:32;2088:48;;2161:2;2151:8;2148:16;2145:36;;;2177:1;2174;2167:12;2145:36;;2200:63;2255:7;2244:8;2233:9;2229:24;2200:63;:::i;:::-;2190:73;;;1606:663;;;;;:::o;2274:248::-;2342:6;2350;2403:2;2391:9;2382:7;2378:23;2374:32;2371:52;;;2419:1;2416;2409:12;2371:52;-1:-1:-1;;2442:23:1;;;2512:2;2497:18;;;2484:32;;-1:-1:-1;2274:248:1:o;2735:180::-;2794:6;2847:2;2835:9;2826:7;2822:23;2818:32;2815:52;;;2863:1;2860;2853:12;2815:52;-1:-1:-1;2886:23:1;;2735:180;-1:-1:-1;2735:180:1:o;2920:446::-;2984:3;3022:5;3016:12;3049:6;3044:3;3037:19;3075:4;3104:2;3099:3;3095:12;3088:19;;3141:2;3134:5;3130:14;3162:1;3172:169;3186:6;3183:1;3180:13;3172:169;;;3247:13;;3235:26;;3281:12;;;;3316:15;;;;3208:1;3201:9;3172:169;;;-1:-1:-1;3357:3:1;;2920:446;-1:-1:-1;;;;;2920:446:1:o;3371:411::-;3432:3;3476:5;3470:12;3503:4;3498:3;3491:17;3529:69;3592:4;3587:3;3583:14;3569:12;3529:69;:::i;:::-;3517:81;;3646:4;3639:5;3635:16;3629:23;3694:3;3688:4;3684:14;3677:4;3672:3;3668:14;3661:38;3715:61;3771:4;3755:14;3715:61;:::i;:::-;3708:68;3371:411;-1:-1:-1;;;;;3371:411:1:o;3787:1562::-;3971:4;4000:2;4040;4029:9;4025:18;4070:2;4059:9;4052:21;4093:6;4128;4122:13;4159:6;4151;4144:22;4185:2;4175:12;;4218:2;4207:9;4203:18;4196:25;;4280:2;4270:6;4267:1;4263:14;4252:9;4248:30;4244:39;4318:2;4310:6;4306:15;4339:1;4349:971;4363:6;4360:1;4357:13;4349:971;;;4428:22;;;-1:-1:-1;;4424:36:1;4412:49;;4484:13;;4598:9;;-1:-1:-1;;;;;4594:18:1;;;4579:34;;4660:11;;;4654:18;4650:27;4633:15;;;4626:52;4721:11;;;4715:18;4698:15;;;4691:43;4757:4;4804:11;;;4798:18;4781:15;;;4774:43;4840:4;4883:11;;;4877:18;4520:4;4915:15;;;4908:27;;;4520:4;4840;4962:67;5013:15;;;4877:18;4962:67;:::i;:::-;5052:4;5113:11;;;5107:18;5100:26;5093:34;5076:15;;;5069:59;5151:4;5198:11;;;5192:18;5175:15;;;;5168:43;;;;-1:-1:-1;;;5298:12:1;;;;5263:15;;;;4385:1;4378:9;4349:971;;;-1:-1:-1;5337:6:1;;3787:1562;-1:-1:-1;;;;;;;;3787:1562:1:o;5354:131::-;-1:-1:-1;;;;;5429:31:1;;5419:42;;5409:70;;5475:1;5472;5465:12;5490:247;5549:6;5602:2;5590:9;5581:7;5577:23;5573:32;5570:52;;;5618:1;5615;5608:12;5570:52;5657:9;5644:23;5676:31;5701:5;5676:31;:::i;:::-;5726:5;5490:247;-1:-1:-1;;;5490:247:1:o;5934:318::-;6009:6;6017;6025;6078:2;6066:9;6057:7;6053:23;6049:32;6046:52;;;6094:1;6091;6084:12;6046:52;6130:9;6117:23;6107:33;;6187:2;6176:9;6172:18;6159:32;6149:42;;6210:36;6242:2;6231:9;6227:18;6210:36;:::i;:::-;6200:46;;5934:318;;;;;:::o;6439:969::-;6612:6;6620;6628;6636;6644;6697:3;6685:9;6676:7;6672:23;6668:33;6665:53;;;6714:1;6711;6704:12;6665:53;6753:9;6740:23;6772:31;6797:5;6772:31;:::i;:::-;6822:5;-1:-1:-1;6879:2:1;6864:18;;6851:32;6892:33;6851:32;6892:33;:::i;:::-;6944:7;-1:-1:-1;6998:2:1;6983:18;;6970:32;;-1:-1:-1;7053:2:1;7038:18;;7025:32;7076:18;7106:14;;;7103:34;;;7133:1;7130;7123:12;7103:34;7156:61;7209:7;7200:6;7189:9;7185:22;7156:61;:::i;:::-;7146:71;;7270:3;7259:9;7255:19;7242:33;7226:49;;7300:2;7290:8;7287:16;7284:36;;;7316:1;7313;7306:12;7284:36;;7339:63;7394:7;7383:8;7372:9;7368:24;7339:63;:::i;:::-;7329:73;;;6439:969;;;;;;;;:::o;7413:315::-;7481:6;7489;7542:2;7530:9;7521:7;7517:23;7513:32;7510:52;;;7558:1;7555;7548:12;7510:52;7597:9;7584:23;7616:31;7641:5;7616:31;:::i;:::-;7666:5;7718:2;7703:18;;;;7690:32;;-1:-1:-1;;;7413:315:1:o;7733:::-;7801:6;7809;7862:2;7850:9;7841:7;7837:23;7833:32;7830:52;;;7878:1;7875;7868:12;7830:52;7914:9;7901:23;7891:33;;7974:2;7963:9;7959:18;7946:32;7987:31;8012:5;7987:31;:::i;:::-;8037:5;8027:15;;;7733:315;;;;;:::o;8053:814::-;-1:-1:-1;;;;;8480:15:1;;;8462:34;;8532:15;;8527:2;8512:18;;8505:43;8579:2;8564:18;;8557:34;;;8622:2;8607:18;;8600:34;;;8671:3;8665;8650:19;;8643:32;;;8405:4;;8692:65;;8737:19;;8729:6;8692:65;:::i;:::-;8801:14;;8794:22;8788:3;8773:19;;8766:51;-1:-1:-1;8848:3:1;8833:19;8826:35;8684:73;8053:814;-1:-1:-1;;;;;8053:814:1:o;8872:658::-;9043:2;9095:21;;;9165:13;;9068:18;;;9187:22;;;9014:4;;9043:2;9266:15;;;;9240:2;9225:18;;;9014:4;9309:195;9323:6;9320:1;9317:13;9309:195;;;9388:13;;-1:-1:-1;;;;;9384:39:1;9372:52;;9479:15;;;;9444:12;;;;9420:1;9338:9;9309:195;;;-1:-1:-1;9521:3:1;;8872:658;-1:-1:-1;;;;;;8872:658:1:o;10458:1266::-;10673:2;10725:21;;;10795:13;;10698:18;;;10817:22;;;10644:4;;10673:2;10858;;10876:18;;;;10917:15;;;10644:4;10960:738;10974:6;10971:1;10968:13;10960:738;;;11033:13;;11071:9;;11059:22;;11125:11;;;11119:18;11139:4;11115:29;11101:12;;;11094:51;11185:11;;;11179:18;11165:12;;;11158:40;11221:4;11265:11;;;11259:18;11245:12;;;11238:40;11301:4;11345:11;;;11339:18;11325:12;;;11318:40;11381:4;11425:11;;;11419:18;11405:12;;;11398:40;11461:4;11505:11;;;11499:18;11485:12;;;11478:40;11541:4;11599:11;;;11593:18;11586:26;11579:34;11565:12;;;11558:56;11643:6;11634:16;;;;11673:15;;;;10996:1;10989:9;10960:738;;;-1:-1:-1;11715:3:1;;10458:1266;-1:-1:-1;;;;;;;10458:1266:1:o;11729:347::-;11931:2;11913:21;;;11970:2;11950:18;;;11943:30;12009:25;12004:2;11989:18;;11982:53;12067:2;12052:18;;11729:347::o;12081:127::-;12142:10;12137:3;12133:20;12130:1;12123:31;12173:4;12170:1;12163:15;12197:4;12194:1;12187:15;12213:400;12415:2;12397:21;;;12454:2;12434:18;;;12427:30;12493:34;12488:2;12473:18;;12466:62;-1:-1:-1;;;12559:2:1;12544:18;;12537:34;12603:3;12588:19;;12213:400::o;13316:127::-;13377:10;13372:3;13368:20;13365:1;13358:31;13408:4;13405:1;13398:15;13432:4;13429:1;13422:15;13448:125;13513:9;;;13534:10;;;13531:36;;;13547:18;;:::i;13929:168::-;14002:9;;;14033;;14050:15;;;14044:22;;14030:37;14020:71;;14071:18;;:::i;14482:277::-;14549:6;14602:2;14590:9;14581:7;14577:23;14573:32;14570:52;;;14618:1;14615;14608:12;14570:52;14650:9;14644:16;14703:5;14696:13;14689:21;14682:5;14679:32;14669:60;;14725:1;14722;14715:12;14764:128;14831:9;;;14852:11;;;14849:37;;;14866:18;;:::i;15566:420::-;15768:2;15750:21;;;15807:2;15787:18;;;15780:30;15846:34;15841:2;15826:18;;15819:62;15917:26;15912:2;15897:18;;15890:54;15976:3;15961:19;;15566:420::o;17637:217::-;17677:1;17703;17693:132;;17747:10;17742:3;17738:20;17735:1;17728:31;17782:4;17779:1;17772:15;17810:4;17807:1;17800:15;17693:132;-1:-1:-1;17839:9:1;;17637:217::o;18299:737::-;-1:-1:-1;;;;;18678:15:1;;;18660:34;;18730:15;;18725:2;18710:18;;18703:43;18777:2;18762:18;;18755:34;;;18640:3;18820:2;18805:18;;18798:31;;;18603:4;;18852:57;;18889:19;;18881:6;18852:57;:::i;:::-;18958:9;18950:6;18946:22;18940:3;18929:9;18925:19;18918:51;18986:44;19023:6;19015;18986:44;:::i;19041:184::-;19111:6;19164:2;19152:9;19143:7;19139:23;19135:32;19132:52;;;19180:1;19177;19170:12;19132:52;-1:-1:-1;19203:16:1;;19041:184;-1:-1:-1;19041:184:1:o;19646:135::-;19685:3;19706:17;;;19703:43;;19726:18;;:::i;:::-;-1:-1:-1;19773:1:1;19762:13;;19646:135::o

Swarm Source

ipfs://d66d6a7264e80ccb0bd4b84a8926e01e1857808ddd54550249e2e5b5c671b5fd

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits

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.