ETH Price: $3,340.32 (-0.79%)
Gas: 4 Gwei

Contract

0x6d74Fb624e5e9961d934b9378Ca6b5B55296704f
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw All162919712022-12-29 17:41:23578 days ago1672335683IN
0x6d74Fb62...55296704f
0 ETH0.0064587721.94056169
Withdraw158532842022-10-29 11:01:35639 days ago1667041295IN
0x6d74Fb62...55296704f
0 ETH0.0077114628.6439474
Withdraw153510502022-08-16 7:34:29714 days ago1660635269IN
0x6d74Fb62...55296704f
0 ETH0.001540697.1487046
Withdraw153508912022-08-16 6:56:28714 days ago1660632988IN
0x6d74Fb62...55296704f
0 ETH0.0023262110
Withdraw152524412022-07-31 20:37:20729 days ago1659299840IN
0x6d74Fb62...55296704f
0 ETH0.00160817.11656346
Withdraw151608652022-07-17 15:08:39743 days ago1658070519IN
0x6d74Fb62...55296704f
0 ETH0.0072946233.26123868
Withdraw149052782022-06-04 21:02:34786 days ago1654376554IN
0x6d74Fb62...55296704f
0 ETH0.011785555.41974353
Withdraw148804622022-05-31 19:13:05790 days ago1654024385IN
0x6d74Fb62...55296704f
0 ETH0.0138991866.39781255
Withdraw148053752022-05-19 14:09:43802 days ago1652969383IN
0x6d74Fb62...55296704f
0 ETH0.0096489746.83853282
Withdraw147896232022-05-17 1:20:22805 days ago1652750422IN
0x6d74Fb62...55296704f
0 ETH0.0054873427.07418987
Withdraw147799202022-05-15 12:19:47806 days ago1652617187IN
0x6d74Fb62...55296704f
0 ETH0.0040267519.86775977
Withdraw147581352022-05-12 0:55:48810 days ago1652316948IN
0x6d74Fb62...55296704f
0 ETH0.02854117140.82027799
Withdraw147466842022-05-10 5:02:34812 days ago1652158954IN
0x6d74Fb62...55296704f
0 ETH0.0085033742.65529719
Withdraw147444642022-05-09 20:28:05812 days ago1652128085IN
0x6d74Fb62...55296704f
0 ETH0.0133566367.00057258
Withdraw147412032022-05-09 7:43:38813 days ago1652082218IN
0x6d74Fb62...55296704f
0 ETH0.0052290925.8
Withdraw147340762022-05-08 4:50:36814 days ago1651985436IN
0x6d74Fb62...55296704f
0 ETH0.0040459419.96245012
Withdraw146975752022-05-02 9:38:37819 days ago1651484317IN
0x6d74Fb62...55296704f
0 ETH0.0084563842.41955574
Withdraw146939742022-05-01 20:08:19820 days ago1651435699IN
0x6d74Fb62...55296704f
0 ETH0.0133816267.12595937
Withdraw146694702022-04-27 23:41:54824 days ago1651102914IN
0x6d74Fb62...55296704f
0 ETH0.007548837.24532367
Withdraw146475472022-04-24 12:50:12827 days ago1650804612IN
0x6d74Fb62...55296704f
0 ETH0.006010529.65721447
Withdraw146331572022-04-22 6:48:44830 days ago1650610124IN
0x6d74Fb62...55296704f
0 ETH0.0063229531.19702297
Withdraw146331522022-04-22 6:47:56830 days ago1650610076IN
0x6d74Fb62...55296704f
0 ETH0.0063398931.28063787
Withdraw146311662022-04-21 23:15:14830 days ago1650582914IN
0x6d74Fb62...55296704f
0 ETH0.0103629951.13032315
Withdraw146310702022-04-21 22:56:16830 days ago1650581776IN
0x6d74Fb62...55296704f
0 ETH0.010227450.4613392
Withdraw146195112022-04-20 3:27:45832 days ago1650425265IN
0x6d74Fb62...55296704f
0 ETH0.0113319756.84432347
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
142883232022-02-27 12:51:16883 days ago1645966276  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Gauge

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-27
*/

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

// File srcBuild/Gauge.sol

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

library Math {
    function max(uint a, uint b) internal pure returns (uint) {
        return a >= b ? a : b;
    }
    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }
}

interface erc20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function approve(address spender, uint value) external returns (bool);
}

interface ve {
    function token() external view returns (address);
    function balanceOfNFT(uint) external view returns (uint);
    function isApprovedOrOwner(address, uint) external view returns (bool);
    function isUnlocked() external view returns (bool);
    function locked__end(uint) external view returns (uint);
    function create_lock_for(uint, uint, address) external returns (uint);
    function deposit_for(uint, uint) external;
    function ownerOf(uint) external view returns (address);
    function transferFrom(address, address, uint) external;
}

interface IBribe {
    function notifyRewardAmount(address token, uint amount) external;
    function left(address token) external view returns (uint);
}

interface Voter {
    function attachTokenToGauge(uint _tokenId, address account) external;
    function detachTokenFromGauge(uint _tokenId, address account) external;
    function emitDeposit(uint _tokenId, address account, uint amount) external;
    function emitWithdraw(uint _tokenId, address account, uint amount) external;
    function distribute(address _gauge) external;
}

// Gauges are used to incentivize pools, they emit reward tokens over 7 days for staked LP tokens
contract Gauge {

    address public immutable stake; // the asset token that needs to be staked for rewards
    address public immutable _ve; // the ve token used for gauges
    address public immutable bribe;
    address public immutable voter;

    bool internal depositsOpen;
    uint public derivedSupply;
    mapping(address => uint) public derivedBalances;

    uint internal constant DURATION = 7 days; // rewards are released over 7 days
    uint internal constant PRECISION = 10 ** 18;

    // default snx staking contract implementation
    mapping(address => uint) public rewardRate;
    mapping(address => uint) public periodFinish;
    mapping(address => uint) public lastUpdateTime;
    mapping(address => uint) public rewardPerTokenStored;

    mapping(address => mapping(address => uint)) public lastEarn;
    mapping(address => mapping(address => uint)) public userRewardPerTokenStored;

    mapping(address => uint) public tokenIds;

    uint public totalSupply;
    mapping(address => uint) public balanceOf;

    address[] public rewards;
    mapping(address => bool) public isReward;

    /// @notice A checkpoint for marking balance
    struct Checkpoint {
        uint timestamp;
        uint balanceOf;
    }

    /// @notice A checkpoint for marking reward rate
    struct RewardPerTokenCheckpoint {
        uint timestamp;
        uint rewardPerToken;
    }

    /// @notice A checkpoint for marking supply
    struct SupplyCheckpoint {
        uint timestamp;
        uint supply;
    }

    /// @notice A record of balance checkpoints for each account, by index
    mapping (address => mapping (uint => Checkpoint)) public checkpoints;
    /// @notice The number of checkpoints for each account
    mapping (address => uint) public numCheckpoints;
    /// @notice A record of balance checkpoints for each token, by index
    mapping (uint => SupplyCheckpoint) public supplyCheckpoints;
    /// @notice The number of checkpoints
    uint public supplyNumCheckpoints;
    /// @notice A record of balance checkpoints for each token, by index
    mapping (address => mapping (uint => RewardPerTokenCheckpoint)) public rewardPerTokenCheckpoints;
    /// @notice The number of checkpoints for each token
    mapping (address => uint) public rewardPerTokenNumCheckpoints;

    event Deposit(address indexed from, uint tokenId, uint amount);
    event Withdraw(address indexed from, uint tokenId, uint amount);
    event NotifyReward(address indexed from, address indexed reward, uint amount);
    event ClaimRewards(address indexed from, address indexed reward, uint amount);

    constructor(address _stake, address _bribe, address __ve, address _voter) {
        stake = _stake;
        bribe = _bribe;
        _ve = __ve;
        voter = _voter;
        depositsOpen = true;
        _safeApprove(ve(__ve).token(), __ve, type(uint).max);
    }

    modifier whenDepositsOpen() {
        require(depositsOpen, "This gauge is not open for deposits");
        _;
    }

    function stopDeposits() external {
        require(msg.sender == voter, "must be from voter");
        depositsOpen = false;
    }

    function openDeposits() external {
        require(msg.sender == voter, "must be from voter");
        depositsOpen = true;
    }

    function isDepositsOpen() external view returns (bool) {
        return depositsOpen;
    }

    // simple re-entrancy check
    uint internal _unlocked = 1;
    modifier lock() {
        require(_unlocked == 1);
        _unlocked = 2;
        _;
        _unlocked = 1;
    }

    /**
    * @notice Determine the prior balance for an account as of a block number
    * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
    * @param account The address of the account to check
    * @param timestamp The timestamp to get the balance at
    * @return The balance the account had as of the given block
    */
    function getPriorBalanceIndex(address account, uint timestamp) public view returns (uint) {
        uint nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].timestamp <= timestamp) {
            return (nCheckpoints - 1);
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].timestamp > timestamp) {
            return 0;
        }

        uint lower = 0;
        uint upper = nCheckpoints - 1;
        while (upper > lower) {
            uint center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.timestamp == timestamp) {
                return center;
            } else if (cp.timestamp < timestamp) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return lower;
    }

    function getPriorSupplyIndex(uint timestamp) public view returns (uint) {
        uint nCheckpoints = supplyNumCheckpoints;
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (supplyCheckpoints[nCheckpoints - 1].timestamp <= timestamp) {
            return (nCheckpoints - 1);
        }

        // Next check implicit zero balance
        if (supplyCheckpoints[0].timestamp > timestamp) {
            return 0;
        }

        uint lower = 0;
        uint upper = nCheckpoints - 1;
        while (upper > lower) {
            uint center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            SupplyCheckpoint memory cp = supplyCheckpoints[center];
            if (cp.timestamp == timestamp) {
                return center;
            } else if (cp.timestamp < timestamp) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return lower;
    }

    function getPriorRewardPerToken(address token, uint timestamp) public view returns (uint, uint) {
        uint nCheckpoints = rewardPerTokenNumCheckpoints[token];
        if (nCheckpoints == 0) {
            return (0,0);
        }

        // First check most recent balance
        if (rewardPerTokenCheckpoints[token][nCheckpoints - 1].timestamp <= timestamp) {
            return (rewardPerTokenCheckpoints[token][nCheckpoints - 1].rewardPerToken, rewardPerTokenCheckpoints[token][nCheckpoints - 1].timestamp);
        }

        // Next check implicit zero balance
        if (rewardPerTokenCheckpoints[token][0].timestamp > timestamp) {
            return (0,0);
        }

        uint lower = 0;
        uint upper = nCheckpoints - 1;
        while (upper > lower) {
            uint center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            RewardPerTokenCheckpoint memory cp = rewardPerTokenCheckpoints[token][center];
            if (cp.timestamp == timestamp) {
                return (cp.rewardPerToken, cp.timestamp);
            } else if (cp.timestamp < timestamp) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return (rewardPerTokenCheckpoints[token][lower].rewardPerToken, rewardPerTokenCheckpoints[token][lower].timestamp);
    }

    function _writeCheckpoint(address account, uint balance) internal {
        uint _timestamp = block.timestamp;
        uint _nCheckPoints = numCheckpoints[account];

        if (_nCheckPoints > 0 && checkpoints[account][_nCheckPoints - 1].timestamp == _timestamp) {
            checkpoints[account][_nCheckPoints - 1].balanceOf = balance;
        } else {
            checkpoints[account][_nCheckPoints] = Checkpoint(_timestamp, balance);
            numCheckpoints[account] = _nCheckPoints + 1;
        }
    }

    function _writeRewardPerTokenCheckpoint(address token, uint reward, uint timestamp) internal {
        uint _nCheckPoints = rewardPerTokenNumCheckpoints[token];

        if (_nCheckPoints > 0 && rewardPerTokenCheckpoints[token][_nCheckPoints - 1].timestamp == timestamp) {
            rewardPerTokenCheckpoints[token][_nCheckPoints - 1].rewardPerToken = reward;
        } else {
            rewardPerTokenCheckpoints[token][_nCheckPoints] = RewardPerTokenCheckpoint(timestamp, reward);
            rewardPerTokenNumCheckpoints[token] = _nCheckPoints + 1;
        }
    }

    function _writeSupplyCheckpoint() internal {
        uint _nCheckPoints = supplyNumCheckpoints;
        uint _timestamp = block.timestamp;

        if (_nCheckPoints > 0 && supplyCheckpoints[_nCheckPoints - 1].timestamp == _timestamp) {
            supplyCheckpoints[_nCheckPoints - 1].supply = derivedSupply;
        } else {
            supplyCheckpoints[_nCheckPoints] = SupplyCheckpoint(_timestamp, derivedSupply);
            supplyNumCheckpoints = _nCheckPoints + 1;
        }
    }

    function rewardsListLength() external view returns (uint) {
        return rewards.length;
    }

    // returns the last time the reward was modified or periodFinish if the reward has ended
    function lastTimeRewardApplicable(address token) public view returns (uint) {
        return Math.min(block.timestamp, periodFinish[token]);
    }

    function getReward(address account, address[] memory tokens) external lock {
        require(msg.sender == account || msg.sender == voter);
        _unlocked = 1;
        Voter(voter).distribute(address(this));
        _unlocked = 2;

        for (uint i = 0; i < tokens.length; i++) {
            (rewardPerTokenStored[tokens[i]], lastUpdateTime[tokens[i]]) = _updateRewardPerToken(tokens[i]);

            uint _reward = earned(tokens[i], account);
            lastEarn[tokens[i]][account] = block.timestamp;
            userRewardPerTokenStored[tokens[i]][account] = rewardPerTokenStored[tokens[i]];
            if (_reward > 0) {
                //setup gauges to send you veAPHRA while token is unlocked
              if (ve(_ve).isUnlocked()) {
                  _safeTransfer(tokens[i], account, _reward);
              } else {
                  uint tokenId = tokenIds[msg.sender];

                  if (tokenId == 0 || block.timestamp > ve(_ve).locked__end(tokenId)) {

                      //set initial lock for 8 weeks
                      tokenIds[msg.sender] = ve(_ve).create_lock_for(_reward, DURATION * 8, msg.sender);
                  } else {
                      ve(_ve).deposit_for(tokenId, _reward);
                  }
              }
            }
            emit ClaimRewards(msg.sender, tokens[i], _reward);
        }

        uint _derivedBalance = derivedBalances[account];
        derivedSupply -= _derivedBalance;
        _derivedBalance = derivedBalance(account);
        derivedBalances[account] = _derivedBalance;
        derivedSupply += _derivedBalance;

        _writeCheckpoint(account, derivedBalances[account]);
        _writeSupplyCheckpoint();
    }

    function rewardPerToken(address token) public view returns (uint) {
        if (derivedSupply == 0) {
            return rewardPerTokenStored[token];
        }
        return rewardPerTokenStored[token] + ((lastTimeRewardApplicable(token) - Math.min(lastUpdateTime[token], periodFinish[token])) * rewardRate[token] * PRECISION / derivedSupply);
    }

    function derivedBalance(address account) public view returns (uint) {
        uint _tokenId = tokenIds[account];
        uint _balance = balanceOf[account];
        uint _derived = _balance * 40 / 100;
        uint _adjusted = 0;
        uint _supply = erc20(_ve).totalSupply();
        //only activate boosts on ve unlock
        if (account == ve(_ve).ownerOf(_tokenId) && _supply > 0 && ve(_ve).isUnlocked()) {
            _adjusted = ve(_ve).balanceOfNFT(_tokenId);
            _adjusted = (totalSupply * _adjusted / _supply) * 60 / 100;
        }
        return Math.min((_derived + _adjusted), _balance);
    }

    function batchRewardPerToken(address token, uint maxRuns) external {
        (rewardPerTokenStored[token], lastUpdateTime[token])  = _batchRewardPerToken(token, maxRuns);
    }

    function _batchRewardPerToken(address token, uint maxRuns) internal returns (uint, uint) {
        uint _startTimestamp = lastUpdateTime[token];
        uint reward = rewardPerTokenStored[token];

        if (supplyNumCheckpoints == 0) {
            return (reward, _startTimestamp);
        }

        if (rewardRate[token] == 0) {
            return (reward, block.timestamp);
        }

        uint _startIndex = getPriorSupplyIndex(_startTimestamp);
        uint _endIndex = Math.min(supplyNumCheckpoints-1, maxRuns);

        for (uint i = _startIndex; i < _endIndex; i++) {
            SupplyCheckpoint memory sp0 = supplyCheckpoints[i];
            if (sp0.supply > 0) {
                SupplyCheckpoint memory sp1 = supplyCheckpoints[i+1];
                (uint _reward, uint _endTime) = _calcRewardPerToken(token, sp1.timestamp, sp0.timestamp, sp0.supply, _startTimestamp);
                reward += _reward;
                _writeRewardPerTokenCheckpoint(token, reward, _endTime);
                _startTimestamp = _endTime;
            }
        }

        return (reward, _startTimestamp);
    }

    function _calcRewardPerToken(address token, uint timestamp1, uint timestamp0, uint supply, uint startTimestamp) internal view returns (uint, uint) {
        uint endTime = Math.max(timestamp1, startTimestamp);
        return (((Math.min(endTime, periodFinish[token]) - Math.min(Math.max(timestamp0, startTimestamp), periodFinish[token])) * rewardRate[token] * PRECISION / supply), endTime);
    }

    function _updateRewardPerToken(address token) internal returns (uint, uint) {
        uint _startTimestamp = lastUpdateTime[token];
        uint reward = rewardPerTokenStored[token];

        if (supplyNumCheckpoints == 0) {
            return (reward, _startTimestamp);
        }

        if (rewardRate[token] == 0) {
            return (reward, block.timestamp);
        }

        uint _startIndex = getPriorSupplyIndex(_startTimestamp);
        uint _endIndex = supplyNumCheckpoints-1;

        if (_endIndex - _startIndex > 1) {
            for (uint i = _startIndex; i < _endIndex-1; i++) {
                SupplyCheckpoint memory sp0 = supplyCheckpoints[i];
                if (sp0.supply > 0) {
                    SupplyCheckpoint memory sp1 = supplyCheckpoints[i+1];
                    (uint _reward, uint _endTime) = _calcRewardPerToken(token, sp1.timestamp, sp0.timestamp, sp0.supply, _startTimestamp);
                    reward += _reward;
                    _writeRewardPerTokenCheckpoint(token, reward, _endTime);
                    _startTimestamp = _endTime;
                }
            }
        }

        SupplyCheckpoint memory sp = supplyCheckpoints[_endIndex];
        if (sp.supply > 0) {
            (uint _reward,) = _calcRewardPerToken(token, lastTimeRewardApplicable(token), Math.max(sp.timestamp, _startTimestamp), sp.supply, _startTimestamp);
            reward += _reward;
            _writeRewardPerTokenCheckpoint(token, reward, block.timestamp);
            _startTimestamp = block.timestamp;
        }

        return (reward, _startTimestamp);
    }

    // earned is an estimation, it won't be exact till the supply > rewardPerToken calculations have run
    function earned(address token, address account) public view returns (uint) {
        uint _startTimestamp = Math.max(lastEarn[token][account], rewardPerTokenCheckpoints[token][0].timestamp);
        if (numCheckpoints[account] == 0) {
            return 0;
        }

        uint _startIndex = getPriorBalanceIndex(account, _startTimestamp);
        uint _endIndex = numCheckpoints[account]-1;

        uint reward = 0;

        if (_endIndex - _startIndex > 1) {
            for (uint i = _startIndex; i < _endIndex-1; i++) {
                Checkpoint memory cp0 = checkpoints[account][i];
                Checkpoint memory cp1 = checkpoints[account][i+1];
                (uint _rewardPerTokenStored0,) = getPriorRewardPerToken(token, cp0.timestamp);
                (uint _rewardPerTokenStored1,) = getPriorRewardPerToken(token, cp1.timestamp);
                reward += cp0.balanceOf * (_rewardPerTokenStored1 - _rewardPerTokenStored0) / PRECISION;
            }
        }

        Checkpoint memory cp = checkpoints[account][_endIndex];
        (uint _rewardPerTokenStored,) = getPriorRewardPerToken(token, cp.timestamp);
        reward += cp.balanceOf * (rewardPerToken(token) - Math.max(_rewardPerTokenStored, userRewardPerTokenStored[token][account])) / PRECISION;

        return reward;
    }

    function depositAll(uint tokenId) external {
        deposit(erc20(stake).balanceOf(msg.sender), tokenId);
    }

    function deposit(uint amount, uint tokenId) public whenDepositsOpen lock {
        require(amount > 0);

        _safeTransferFrom(stake, msg.sender, address(this), amount);
        totalSupply += amount;
        balanceOf[msg.sender] += amount;

        if (tokenId > 0) {
            require(ve(_ve).ownerOf(tokenId) == msg.sender);
            if (tokenIds[msg.sender] == 0) {
                tokenIds[msg.sender] = tokenId;
                Voter(voter).attachTokenToGauge(tokenId, msg.sender);
            }
            require(tokenIds[msg.sender] == tokenId);
        } else {
            tokenId = tokenIds[msg.sender];
        }

        uint _derivedBalance = derivedBalances[msg.sender];
        derivedSupply -= _derivedBalance;
        _derivedBalance = derivedBalance(msg.sender);
        derivedBalances[msg.sender] = _derivedBalance;
        derivedSupply += _derivedBalance;

        _writeCheckpoint(msg.sender, _derivedBalance);
        _writeSupplyCheckpoint();

        Voter(voter).emitDeposit(tokenId, msg.sender, amount);
        emit Deposit(msg.sender, tokenId, amount);
    }

    function withdrawAll() external {
        withdraw(balanceOf[msg.sender]);
    }

    function withdraw(uint amount) public {
        uint tokenId = 0;
        if (amount == balanceOf[msg.sender]) {
            tokenId = tokenIds[msg.sender];
        }
        withdrawToken(amount, tokenId);
    }

    function withdrawToken(uint amount, uint tokenId) public lock {
        totalSupply -= amount;
        balanceOf[msg.sender] -= amount;
        _safeTransfer(stake, msg.sender, amount);

        if (tokenId > 0) {
            require(tokenId == tokenIds[msg.sender]);
            tokenIds[msg.sender] = 0;
            Voter(voter).detachTokenFromGauge(tokenId, msg.sender);
        } else {
            tokenId = tokenIds[msg.sender];
        }

        uint _derivedBalance = derivedBalances[msg.sender];
        derivedSupply -= _derivedBalance;
        _derivedBalance = derivedBalance(msg.sender);
        derivedBalances[msg.sender] = _derivedBalance;
        derivedSupply += _derivedBalance;

        _writeCheckpoint(msg.sender, derivedBalances[msg.sender]);
        _writeSupplyCheckpoint();

        Voter(voter).emitWithdraw(tokenId, msg.sender, amount);
        emit Withdraw(msg.sender, tokenId, amount);
    }

    function left(address token) external view returns (uint) {
        if (block.timestamp >= periodFinish[token]) return 0;
        uint _remaining = periodFinish[token] - block.timestamp;
        return _remaining * rewardRate[token];
    }

    function notifyRewardAmount(address token, uint amount) external lock {
        require(token != stake);
        require(amount > 0);
        if (rewardRate[token] == 0) _writeRewardPerTokenCheckpoint(token, 0, block.timestamp);
        (rewardPerTokenStored[token], lastUpdateTime[token]) = _updateRewardPerToken(token);

        if (block.timestamp >= periodFinish[token]) {
            _safeTransferFrom(token, msg.sender, address(this), amount);
            rewardRate[token] = amount / DURATION;
        } else {
            uint _remaining = periodFinish[token] - block.timestamp;
            uint _left = _remaining * rewardRate[token];
            require(amount > _left);
            _safeTransferFrom(token, msg.sender, address(this), amount);
            rewardRate[token] = (amount + _left) / DURATION;
        }
        require(rewardRate[token] > 0);
        uint balance = erc20(token).balanceOf(address(this));
        require(rewardRate[token] <= balance / DURATION, "Provided reward too high");
        periodFinish[token] = block.timestamp + DURATION;
        if (!isReward[token]) {
            isReward[token] = true;
            rewards.push(token);
        }

        emit NotifyReward(msg.sender, token, amount);
    }

    function _safeTransfer(address token, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(erc20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function _safeTransferFrom(address token, address from, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(erc20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function _safeApprove(address token, address spender, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(erc20.approve.selector, spender, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }
}

contract GaugeFactory {
    address public last_gauge;

    function createGauge(address _asset, address _bribe, address _ve) external returns (address) {
        last_gauge = address(new Gauge(_asset, _bribe, _ve, msg.sender));
        return last_gauge;
    }

    function createGaugeSingle(address _asset, address _bribe, address _ve, address _voter) external returns (address) {
        last_gauge = address(new Gauge(_asset, _bribe, _ve, _voter));
        return last_gauge;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_stake","type":"address"},{"internalType":"address","name":"_bribe","type":"address"},{"internalType":"address","name":"__ve","type":"address"},{"internalType":"address","name":"_voter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NotifyReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"maxRuns","type":"uint256"}],"name":"batchRewardPerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bribe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"checkpoints","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"balanceOf","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"derivedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"derivedBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"derivedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getPriorBalanceIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getPriorRewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getPriorSupplyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isDepositsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"lastEarn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"left","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPerTokenCheckpoints","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"rewardPerToken","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardPerTokenNumCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stake","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyCheckpoints","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyNumCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61010060405260016014553480156200001757600080fd5b5060405162003486380380620034868339810160408190526200003a91620001fa565b6001600160a01b0380851660805283811660c05282811660a081905290821660e0526000805460ff1916600117905560408051637e062a3560e11b81529051620000da929163fc0c546a9160048083019260209291908290030181865afa158015620000aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d0919062000257565b83600019620000e4565b50505050620002de565b6000836001600160a01b03163b11620000fc57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b17905291516000928392908716916200015a91906200027c565b6000604051808303816000865af19150503d806000811462000199576040519150601f19603f3d011682016040523d82523d6000602084013e6200019e565b606091505b5091509150818015620001cc575080511580620001cc575080806020019051810190620001cc9190620002ba565b620001d657600080fd5b5050505050565b80516001600160a01b0381168114620001f557600080fd5b919050565b600080600080608085870312156200021157600080fd5b6200021c85620001dd565b93506200022c60208601620001dd565b92506200023c60408601620001dd565b91506200024c60608601620001dd565b905092959194509250565b6000602082840312156200026a57600080fd5b6200027582620001dd565b9392505050565b6000825160005b818110156200029f576020818601810151858301520162000283565b81811115620002af576000828501525b509190910192915050565b600060208284031215620002cd57600080fd5b815180151581146200027557600080fd5b60805160a05160c05160e0516130db620003ab6000396000818161042701528181610b5b01528181610ba0015281816111e3015281816117cb01528181611d7d01528181611ea20152818161232c01526124440152600061039601526000818161052a01528181610de301528181610ebf01528181610f440152818161101701528181611914015281816119ad01528181611a4901528181611ae40152611cb30152600081816103d5015281816114510152818161185501528181611c2b01526122ad01526130db6000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c8063853828b611610151578063d7da4bb0116100c3578063f122977711610087578063f122977714610663578063f301af4214610676578063f7412baf14610689578063fc97a303146106b0578063fd314098146106d0578063fdb483c7146106e357600080fd5b8063d7da4bb014610616578063da09d19d1461061f578063e2bbb1581461063f578063e688639614610652578063e8111a121461065a57600080fd5b8063a495e5b511610115578063a495e5b51461058a578063aa479652146105b5578063b66503cf146105d5578063c3f81cc5146105e8578063c6f678bd146105f0578063d35e25441461060357600080fd5b8063853828b61461051d5780638dd598fb1461052557806399bcc0521461054c5780639ce43f901461055f578063a09eebd81461057f57600080fd5b80633a4b66f1116101ea5780635cbe86bc116101ae5780635cbe86bc1461048f578063638634ee1461049757806363fb415b146104aa5780636fcfff45146104ca57806370a08231146104ea57806376f4be361461050a57600080fd5b80633a4b66f1146103d05780633ca068b6146103f757806346c96aac146104225780634d5ce038146104495780635a45d0521461047c57600080fd5b8063221ca18c11610231578063221ca18c146103295780632ce9aead146103495780632e1a7d4d1461036957806331279d3d1461037e57806337d0208c1461039157600080fd5b806301316ddf1461026e5780630cdfebfa146102ba578063115c6f39146102ec57806318160ddd1461030d578063211dc32d14610316575b600080fd5b6102a061027c366004612dae565b60126020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152015b60405180910390f35b6102a06102c8366004612dae565b600e6020908152600092835260408084209091529082529020805460019091015482565b6102ff6102fa366004612dae565b6106f6565b6040519081526020016102b1565b6102ff600a5481565b6102ff610324366004612dda565b610863565b6102ff610337366004612e13565b60036020526000908152604090205481565b6102ff610357366004612e13565b60056020526000908152604090205481565b61037c610377366004612e30565b610af3565b005b61037c61038c366004612e5f565b610b2a565b6103b87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102b1565b6103b87f000000000000000000000000000000000000000000000000000000000000000081565b6102ff610405366004612dda565b600860209081526000928352604080842090915290825290205481565b6103b87f000000000000000000000000000000000000000000000000000000000000000081565b61046c610457366004612e13565b600d6020526000908152604090205460ff1681565b60405190151581526020016102b1565b61037c61048a366004612dae565b6111a0565b61037c6111d8565b6102ff6104a5366004612e13565b611256565b6102ff6104b8366004612e13565b60026020526000908152604090205481565b6102ff6104d8366004612e13565b600f6020526000908152604090205481565b6102ff6104f8366004612e13565b600b6020526000908152604090205481565b6102ff610518366004612e30565b61127a565b61037c6113ac565b6103b87f000000000000000000000000000000000000000000000000000000000000000081565b6102ff61055a366004612e13565b6113c7565b6102ff61056d366004612e13565b60066020526000908152604090205481565b60005460ff1661046c565b6102ff610598366004612dda565b600760209081526000928352604080842090915290825290205481565b6102ff6105c3366004612e13565b60136020526000908152604090205481565b61037c6105e3366004612dae565b611438565b61037c6117c0565b61037c6105fe366004612e30565b61183c565b6102ff610611366004612e13565b6118d1565b6102ff60015481565b6102ff61062d366004612e13565b60046020526000908152604090205481565b61037c61064d366004612f39565b611baa565b600c546102ff565b6102ff60115481565b6102ff610671366004612e13565b611f4c565b6103b8610684366004612e30565b61200c565b6102a0610697366004612e30565b6010602052600090815260409020805460019091015482565b6102ff6106be366004612e13565b60096020526000908152604090205481565b6102a06106de366004612dae565b612036565b61037c6106f1366004612f39565b612255565b6001600160a01b0382166000908152600f60205260408120548061071e57600091505061085d565b6001600160a01b0384166000908152600e602052604081208491610743600185612f71565b8152602001908152602001600020600001541161076d57610765600182612f71565b91505061085d565b6001600160a01b0384166000908152600e602090815260408083208380529091529020548310156107a257600091505061085d565b6000806107b0600184612f71565b90505b8181111561085857600060026107c98484612f71565b6107d39190612f88565b6107dd9083612f71565b6001600160a01b0388166000908152600e602090815260408083208484528252918290208251808401909352805480845260019091015491830191909152919250908714156108325750935061085d92505050565b805187111561084357819350610851565b61084e600183612f71565b92505b50506107b3565b509150505b92915050565b6001600160a01b0380831660008181526007602090815260408083209486168352938152838220549282526012815283822082805290529182205482916108a9916124e0565b6001600160a01b0384166000908152600f60205260409020549091506108d357600091505061085d565b60006108df84836106f6565b6001600160a01b0385166000908152600f60205260408120549192509061090890600190612f71565b9050600060016109188484612f71565b1115610a2757825b61092b600184612f71565b811015610a25576001600160a01b0387166000818152600e602081815260408084208685528083528185208251808401909352805483526001908101548385015295855292909152928290610981908690612faa565b815260200190815260200160002060405180604001604052908160008201548152602001600182015481525050905060006109c08b8460000151612036565b50905060006109d38c8460000151612036565b509050670de0b6b3a76400006109e98383612f71565b85602001516109f89190612fc2565b610a029190612f88565b610a0c9087612faa565b9550505050508080610a1d90612fe1565b915050610920565b505b6001600160a01b0386166000908152600e60209081526040808320858452825280832081518083019092528054808352600190910154928201929092529190610a71908a90612036565b506001600160a01b03808b166000908152600860209081526040808320938d1683529290522054909150670de0b6b3a764000090610ab09083906124e0565b610ab98b611f4c565b610ac39190612f71565b8360200151610ad29190612fc2565b610adc9190612f88565b610ae69084612faa565b9998505050505050505050565b336000908152600b6020526040812054821415610b1c5750336000908152600960205260409020545b610b268282612255565b5050565b601454600114610b3957600080fd5b6002601455336001600160a01b0383161480610b7d5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610b8657600080fd5b60016014556040516363453ae160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906363453ae190602401600060405180830381600087803b158015610bec57600080fd5b505af1158015610c00573d6000803e3d6000fd5b5050600260145550600090505b81518110156110f757610c38828281518110610c2b57610c2b612ffc565b60200260200101516124f7565b60066000858581518110610c4e57610c4e612ffc565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600060056000878781518110610c8e57610c8e612ffc565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008491905055839190505550506000610ce9838381518110610cdb57610cdb612ffc565b602002602001015185610863565b90504260076000858581518110610d0257610d02612ffc565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000866001600160a01b03166001600160a01b031681526020019081526020016000208190555060066000848481518110610d6757610d67612ffc565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205460086000858581518110610da657610da6612ffc565b6020908102919091018101516001600160a01b03908116835282820193909352604091820160009081209389168152929052902055801561107e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638380edb76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e639190613012565b15610e9157610e8c838381518110610e7d57610e7d612ffc565b602002602001015185836126da565b61107e565b33600090815260096020526040902054801580610f35575060405163f8a0576360e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f8a0576390602401602060405180830381865afa158015610f0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f329190613034565b42115b15610ffa576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663d4e54c3b83610f7862093a806008612fc2565b6040516001600160e01b031960e085901b168152600481019290925260248201523360448201526064016020604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190613034565b3360009081526009602052604090205561107c565b604051631dd33fc560e31b815260048101829052602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ee99fe2890604401600060405180830381600087803b15801561106357600080fd5b505af1158015611077573d6000803e3d6000fd5b505050505b505b82828151811061109057611090612ffc565b60200260200101516001600160a01b0316336001600160a01b03167f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc9836040516110dc91815260200190565b60405180910390a350806110ef81612fe1565b915050610c0d565b506001600160a01b0382166000908152600260205260408120546001805491928392611124908490612f71565b909155506111339050836118d1565b6001600160a01b0384166000908152600260205260408120829055600180549293508392909190611165908490612faa565b90915550506001600160a01b03831660009081526002602052604090205461118e9084906127c9565b6111966128d4565b5050600160145550565b6111aa8282612979565b6001600160a01b03909316600090815260066020908152604080832060059092529091209390935590915550565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461124a5760405162461bcd60e51b815260206004820152601260248201527136bab9ba10313290333937b6903b37ba32b960711b60448201526064015b60405180910390fd5b6000805460ff19169055565b6001600160a01b03811660009081526004602052604081205461085d904290612ad8565b6011546000908061128e5750600092915050565b826010600061129e600185612f71565b815260200190815260200160002060000154116112c7576112c0600182612f71565b9392505050565b6000805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01548310156113025750600092915050565b600080611310600184612f71565b90505b818111156113a457600060026113298484612f71565b6113339190612f88565b61133d9083612f71565b60008181526010602090815260409182902082518084019093528054808452600190910154918301919091529192509087141561137e575095945050505050565b805187111561138f5781935061139d565b61139a600183612f71565b92505b5050611313565b509392505050565b336000908152600b60205260409020546113c590610af3565b565b6001600160a01b03811660009081526004602052604081205442106113ee57506000919050565b6001600160a01b038216600090815260046020526040812054611412904290612f71565b6001600160a01b0384166000908152600360205260409020549091506112c09082612fc2565b60145460011461144757600080fd5b60026014819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561148e57600080fd5b6000811161149b57600080fd5b6001600160a01b0382166000908152600360205260409020546114c4576114c482600042612ae7565b6114cd826124f7565b6001600160a01b038416600090815260066020908152604080832060058352818420949094559390925560049091522054421061153b5761151082333084612bd6565b61151d62093a8082612f88565b6001600160a01b0383166000908152600360205260409020556115d4565b6001600160a01b03821660009081526004602052604081205461155f904290612f71565b6001600160a01b038416600090815260036020526040812054919250906115869083612fc2565b905080831161159457600080fd5b6115a084333086612bd6565b62093a806115ae8285612faa565b6115b89190612f88565b6001600160a01b03851660009081526003602052604090205550505b6001600160a01b0382166000908152600360205260409020546115f657600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561163d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116619190613034565b905061167062093a8082612f88565b6001600160a01b03841660009081526003602052604090205411156116d75760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f206869676800000000000000006044820152606401611241565b6116e462093a8042612faa565b6001600160a01b038416600090815260046020908152604080832093909355600d9052205460ff16611776576001600160a01b0383166000818152600d60205260408120805460ff19166001908117909155600c805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b03191690911790555b6040518281526001600160a01b0384169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf508269060200160405180910390a35050600160145550565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461182d5760405162461bcd60e51b815260206004820152601260248201527136bab9ba10313290333937b6903b37ba32b960711b6044820152606401611241565b6000805460ff19166001179055565b6040516370a0823160e01b81523360048201526118ce907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156118a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c89190613034565b82611baa565b50565b6001600160a01b038116600090815260096020908152604080832054600b909252822054826064611903836028612fc2565b61190d9190612f88565b90506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611970573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119949190613034565b6040516331a9108f60e11b8152600481018790529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa1580156119fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a20919061304d565b6001600160a01b0316876001600160a01b0316148015611a405750600081115b8015611ac957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638380edb76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac99190613012565b15611b8c576040516339f890b560e21b8152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e7e242d490602401602060405180830381865afa158015611b33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b579190613034565b915060648183600a54611b6a9190612fc2565b611b749190612f88565b611b7f90603c612fc2565b611b899190612f88565b91505b611b9f611b998385612faa565b85612ad8565b979650505050505050565b60005460ff16611c085760405162461bcd60e51b815260206004820152602360248201527f54686973206761756765206973206e6f74206f70656e20666f72206465706f7360448201526269747360e81b6064820152608401611241565b601454600114611c1757600080fd5b600260145581611c2657600080fd5b611c527f0000000000000000000000000000000000000000000000000000000000000000333085612bd6565b81600a6000828254611c649190612faa565b9091555050336000908152600b602052604081208054849290611c88908490612faa565b90915550508015611dfa576040516331a9108f60e11b81526004810182905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015611cfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1e919061304d565b6001600160a01b031614611d3157600080fd5b33600090815260096020526040902054611dda5733600081815260096020526040908190208390555163698473e360e01b81526004810183905260248101919091526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063698473e390604401600060405180830381600087803b158015611dc157600080fd5b505af1158015611dd5573d6000803e3d6000fd5b505050505b336000908152600960205260409020548114611df557600080fd5b611e0c565b50336000908152600960205260409020545b336000908152600260205260408120546001805491928392611e2f908490612f71565b90915550611e3e9050336118d1565b336000908152600260205260408120829055600180549293508392909190611e67908490612faa565b90915550611e77905033826127c9565b611e7f6128d4565b60405163530e389d60e11b815260048101839052336024820152604481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a61c713a90606401600060405180830381600087803b158015611eee57600080fd5b505af1158015611f02573d6000803e3d6000fd5b505060408051858152602081018790523393507f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159250015b60405180910390a25050600160145550565b600060015460001415611f7557506001600160a01b031660009081526006602052604090205490565b6001546001600160a01b03831660009081526003602090815260408083205460058352818420546004909352922054670de0b6b3a76400009291611fb891612ad8565b611fc186611256565b611fcb9190612f71565b611fd59190612fc2565b611fdf9190612fc2565b611fe99190612f88565b6001600160a01b03831660009081526006602052604090205461085d9190612faa565b600c818154811061201c57600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b03821660009081526013602052604081205481908061206357600080925092505061224e565b6001600160a01b03851660009081526012602052604081208591612088600185612f71565b81526020019081526020016000206000015411612125576001600160a01b0385166000908152601260205260408120906120c3600184612f71565b81526020019081526020016000206001015460126000876001600160a01b03166001600160a01b0316815260200190815260200160002060006001846121099190612f71565b815260200190815260200160002060000154925092505061224e565b6001600160a01b038516600090815260126020908152604080832083805290915290205484101561215d57600080925092505061224e565b60008061216b600184612f71565b90505b8181111561221d57600060026121848484612f71565b61218e9190612f88565b6121989083612f71565b6001600160a01b03891660009081526012602090815260408083208484528252918290208251808401909352805480845260019091015491830191909152919250908814156121f75760208101519051909650945061224e9350505050565b805188111561220857819350612216565b612213600183612f71565b92505b505061216e565b506001600160a01b038616600090815260126020908152604080832093835292905220600181015490549093509150505b9250929050565b60145460011461226457600080fd5b600260148190555081600a600082825461227e9190612f71565b9091555050336000908152600b6020526040812080548492906122a2908490612f71565b909155506122d390507f000000000000000000000000000000000000000000000000000000000000000033846126da565b801561238d573360009081526009602052604090205481146122f457600080fd5b33600081815260096020526040808220919091555163411b1f7760e01b81526004810183905260248101919091526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063411b1f7790604401600060405180830381600087803b15801561237057600080fd5b505af1158015612384573d6000803e3d6000fd5b5050505061239f565b50336000908152600960205260409020545b3360009081526002602052604081205460018054919283926123c2908490612f71565b909155506123d19050336118d1565b3360009081526002602052604081208290556001805492935083929091906123fa908490612faa565b90915550503360008181526002602052604090205461241991906127c9565b6124216128d4565b604051633aa53b9160e21b815260048101839052336024820152604481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea94ee4490606401600060405180830381600087803b15801561249057600080fd5b505af11580156124a4573d6000803e3d6000fd5b505060408051858152602081018790523393507ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568925001611f3a565b6000818310156124f057816112c0565b5090919050565b6001600160a01b03811660009081526005602090815260408083205460069092528220546011548392919061252f5794909350915050565b6001600160a01b038516600090815260036020526040902054612556579442945092505050565b60006125618361127a565b9050600060016011546125749190612f71565b905060016125828383612f71565b111561265a57815b612595600183612f71565b8110156126585760008181526010602090815260409182902082518084019093528054835260010154908201819052156126455760006010816125d9856001612faa565b81526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000806126248c8460000151866000015187602001518d612cce565b90925090506126338289612faa565b97506126408c8983612ae7565b975050505b508061265081612fe1565b91505061258a565b505b60008181526010602090815260409182902082518084019093528054835260010154908201819052156126cc5760006126ad896126968b611256565b84516126a2908a6124e0565b85602001518a612cce565b5090506126ba8186612faa565b94506126c7898642612ae7565b429550505b509196929550919350505050565b6000836001600160a01b03163b116126f157600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161274d919061306a565b6000604051808303816000865af19150503d806000811461278a576040519150601f19603f3d011682016040523d82523d6000602084013e61278f565b606091505b50915091508180156127b95750805115806127b95750808060200190518101906127b99190613012565b6127c257600080fd5b5050505050565b6001600160a01b0382166000908152600f60205260409020544290801580159061282757506001600160a01b0384166000908152600e602052604081208391612813600185612f71565b815260200190815260200160002060000154145b1561286a576001600160a01b0384166000908152600e602052604081208491612851600185612f71565b81526020810191909152604001600020600101556128ce565b60408051808201825283815260208082018681526001600160a01b0388166000908152600e83528481208682529092529290209051815590516001918201556128b4908290612faa565b6001600160a01b0385166000908152600f60205260409020555b50505050565b601154428115801590612906575080601060006128f2600186612f71565b815260200190815260200160002060000154145b15612937576001546010600060018561291f9190612f71565b81526020810191909152604001600020600101555050565b604080518082018252828152600180546020808401918252600087815260109091529390932091518255915190820155612972908390612faa565b6011555050565b6001600160a01b0382166000908152600560209081526040808320546006909252822054601154839291906129b1579250905061224e565b6001600160a01b0386166000908152600360205260409020546129da57925042915061224e9050565b60006129e58361127a565b90506000612a0160016011546129fb9190612f71565b88612ad8565b9050815b81811015612ac9576000818152601060209081526040918290208251808401909352805483526001015490820181905215612ab6576000601081612a4a856001612faa565b8152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050600080612a958d8460000151866000015187602001518d612cce565b9092509050612aa48289612faa565b9750612ab18d8983612ae7565b975050505b5080612ac181612fe1565b915050612a05565b50919792965091945050505050565b60008183106124f057816112c0565b6001600160a01b0383166000908152601360205260409020548015801590612b4357506001600160a01b03841660009081526012602052604081208391612b2f600185612f71565b815260200190815260200160002060000154145b15612b6d576001600160a01b03841660009081526012602052604081208491612851600185612f71565b60408051808201825283815260208082018681526001600160a01b038816600090815260128352848120868252909252929020905181559051600191820155612bb7908290612faa565b6001600160a01b03851660009081526013602052604090205550505050565b6000846001600160a01b03163b11612bed57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612c51919061306a565b6000604051808303816000865af19150503d8060008114612c8e576040519150601f19603f3d011682016040523d82523d6000602084013e612c93565b606091505b5091509150818015612cbd575080511580612cbd575080806020019051810190612cbd9190613012565b612cc657600080fd5b505050505050565b6000806000612cdd87856124e0565b6001600160a01b0389166000908152600360205260409020549091508590670de0b6b3a764000090612d30612d128a896124e0565b6001600160a01b038d16600090815260046020526040902054612ad8565b6001600160a01b038c16600090815260046020526040902054612d54908690612ad8565b612d5e9190612f71565b612d689190612fc2565b612d729190612fc2565b612d7c9190612f88565b9890975095505050505050565b6001600160a01b03811681146118ce57600080fd5b8035612da981612d89565b919050565b60008060408385031215612dc157600080fd5b8235612dcc81612d89565b946020939093013593505050565b60008060408385031215612ded57600080fd5b8235612df881612d89565b91506020830135612e0881612d89565b809150509250929050565b600060208284031215612e2557600080fd5b81356112c081612d89565b600060208284031215612e4257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215612e7257600080fd5b8235612e7d81612d89565b915060208381013567ffffffffffffffff80821115612e9b57600080fd5b818601915086601f830112612eaf57600080fd5b813581811115612ec157612ec1612e49565b8060051b604051601f19603f83011681018181108582111715612ee657612ee6612e49565b604052918252848201925083810185019189831115612f0457600080fd5b938501935b82851015612f2957612f1a85612d9e565b84529385019392850192612f09565b8096505050505050509250929050565b60008060408385031215612f4c57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b600082821015612f8357612f83612f5b565b500390565b600082612fa557634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612fbd57612fbd612f5b565b500190565b6000816000190483118215151615612fdc57612fdc612f5b565b500290565b6000600019821415612ff557612ff5612f5b565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561302457600080fd5b815180151581146112c057600080fd5b60006020828403121561304657600080fd5b5051919050565b60006020828403121561305f57600080fd5b81516112c081612d89565b6000825160005b8181101561308b5760208186018101518583015201613071565b8181111561309a576000828501525b50919091019291505056fea2646970667358221220c9dcef713f48dff7240004c45662d3386670b2b56439f644083cb991c5c5cdbd64736f6c634300080b0033000000000000000000000000665ff8faa06986bd6f1802fa6c1d2e7d780a7369000000000000000000000000c3b4d42ce8b3672040116f89b1f76ed5a859c7a2000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f00000000000000000000000089549e232aacc4579f93b65735a9349038a47775

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102695760003560e01c8063853828b611610151578063d7da4bb0116100c3578063f122977711610087578063f122977714610663578063f301af4214610676578063f7412baf14610689578063fc97a303146106b0578063fd314098146106d0578063fdb483c7146106e357600080fd5b8063d7da4bb014610616578063da09d19d1461061f578063e2bbb1581461063f578063e688639614610652578063e8111a121461065a57600080fd5b8063a495e5b511610115578063a495e5b51461058a578063aa479652146105b5578063b66503cf146105d5578063c3f81cc5146105e8578063c6f678bd146105f0578063d35e25441461060357600080fd5b8063853828b61461051d5780638dd598fb1461052557806399bcc0521461054c5780639ce43f901461055f578063a09eebd81461057f57600080fd5b80633a4b66f1116101ea5780635cbe86bc116101ae5780635cbe86bc1461048f578063638634ee1461049757806363fb415b146104aa5780636fcfff45146104ca57806370a08231146104ea57806376f4be361461050a57600080fd5b80633a4b66f1146103d05780633ca068b6146103f757806346c96aac146104225780634d5ce038146104495780635a45d0521461047c57600080fd5b8063221ca18c11610231578063221ca18c146103295780632ce9aead146103495780632e1a7d4d1461036957806331279d3d1461037e57806337d0208c1461039157600080fd5b806301316ddf1461026e5780630cdfebfa146102ba578063115c6f39146102ec57806318160ddd1461030d578063211dc32d14610316575b600080fd5b6102a061027c366004612dae565b60126020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152015b60405180910390f35b6102a06102c8366004612dae565b600e6020908152600092835260408084209091529082529020805460019091015482565b6102ff6102fa366004612dae565b6106f6565b6040519081526020016102b1565b6102ff600a5481565b6102ff610324366004612dda565b610863565b6102ff610337366004612e13565b60036020526000908152604090205481565b6102ff610357366004612e13565b60056020526000908152604090205481565b61037c610377366004612e30565b610af3565b005b61037c61038c366004612e5f565b610b2a565b6103b87f000000000000000000000000c3b4d42ce8b3672040116f89b1f76ed5a859c7a281565b6040516001600160a01b0390911681526020016102b1565b6103b87f000000000000000000000000665ff8faa06986bd6f1802fa6c1d2e7d780a736981565b6102ff610405366004612dda565b600860209081526000928352604080842090915290825290205481565b6103b87f00000000000000000000000089549e232aacc4579f93b65735a9349038a4777581565b61046c610457366004612e13565b600d6020526000908152604090205460ff1681565b60405190151581526020016102b1565b61037c61048a366004612dae565b6111a0565b61037c6111d8565b6102ff6104a5366004612e13565b611256565b6102ff6104b8366004612e13565b60026020526000908152604090205481565b6102ff6104d8366004612e13565b600f6020526000908152604090205481565b6102ff6104f8366004612e13565b600b6020526000908152604090205481565b6102ff610518366004612e30565b61127a565b61037c6113ac565b6103b87f000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f81565b6102ff61055a366004612e13565b6113c7565b6102ff61056d366004612e13565b60066020526000908152604090205481565b60005460ff1661046c565b6102ff610598366004612dda565b600760209081526000928352604080842090915290825290205481565b6102ff6105c3366004612e13565b60136020526000908152604090205481565b61037c6105e3366004612dae565b611438565b61037c6117c0565b61037c6105fe366004612e30565b61183c565b6102ff610611366004612e13565b6118d1565b6102ff60015481565b6102ff61062d366004612e13565b60046020526000908152604090205481565b61037c61064d366004612f39565b611baa565b600c546102ff565b6102ff60115481565b6102ff610671366004612e13565b611f4c565b6103b8610684366004612e30565b61200c565b6102a0610697366004612e30565b6010602052600090815260409020805460019091015482565b6102ff6106be366004612e13565b60096020526000908152604090205481565b6102a06106de366004612dae565b612036565b61037c6106f1366004612f39565b612255565b6001600160a01b0382166000908152600f60205260408120548061071e57600091505061085d565b6001600160a01b0384166000908152600e602052604081208491610743600185612f71565b8152602001908152602001600020600001541161076d57610765600182612f71565b91505061085d565b6001600160a01b0384166000908152600e602090815260408083208380529091529020548310156107a257600091505061085d565b6000806107b0600184612f71565b90505b8181111561085857600060026107c98484612f71565b6107d39190612f88565b6107dd9083612f71565b6001600160a01b0388166000908152600e602090815260408083208484528252918290208251808401909352805480845260019091015491830191909152919250908714156108325750935061085d92505050565b805187111561084357819350610851565b61084e600183612f71565b92505b50506107b3565b509150505b92915050565b6001600160a01b0380831660008181526007602090815260408083209486168352938152838220549282526012815283822082805290529182205482916108a9916124e0565b6001600160a01b0384166000908152600f60205260409020549091506108d357600091505061085d565b60006108df84836106f6565b6001600160a01b0385166000908152600f60205260408120549192509061090890600190612f71565b9050600060016109188484612f71565b1115610a2757825b61092b600184612f71565b811015610a25576001600160a01b0387166000818152600e602081815260408084208685528083528185208251808401909352805483526001908101548385015295855292909152928290610981908690612faa565b815260200190815260200160002060405180604001604052908160008201548152602001600182015481525050905060006109c08b8460000151612036565b50905060006109d38c8460000151612036565b509050670de0b6b3a76400006109e98383612f71565b85602001516109f89190612fc2565b610a029190612f88565b610a0c9087612faa565b9550505050508080610a1d90612fe1565b915050610920565b505b6001600160a01b0386166000908152600e60209081526040808320858452825280832081518083019092528054808352600190910154928201929092529190610a71908a90612036565b506001600160a01b03808b166000908152600860209081526040808320938d1683529290522054909150670de0b6b3a764000090610ab09083906124e0565b610ab98b611f4c565b610ac39190612f71565b8360200151610ad29190612fc2565b610adc9190612f88565b610ae69084612faa565b9998505050505050505050565b336000908152600b6020526040812054821415610b1c5750336000908152600960205260409020545b610b268282612255565b5050565b601454600114610b3957600080fd5b6002601455336001600160a01b0383161480610b7d5750336001600160a01b037f00000000000000000000000089549e232aacc4579f93b65735a9349038a4777516145b610b8657600080fd5b60016014556040516363453ae160e01b81523060048201527f00000000000000000000000089549e232aacc4579f93b65735a9349038a477756001600160a01b0316906363453ae190602401600060405180830381600087803b158015610bec57600080fd5b505af1158015610c00573d6000803e3d6000fd5b5050600260145550600090505b81518110156110f757610c38828281518110610c2b57610c2b612ffc565b60200260200101516124f7565b60066000858581518110610c4e57610c4e612ffc565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600060056000878781518110610c8e57610c8e612ffc565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008491905055839190505550506000610ce9838381518110610cdb57610cdb612ffc565b602002602001015185610863565b90504260076000858581518110610d0257610d02612ffc565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000866001600160a01b03166001600160a01b031681526020019081526020016000208190555060066000848481518110610d6757610d67612ffc565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205460086000858581518110610da657610da6612ffc565b6020908102919091018101516001600160a01b03908116835282820193909352604091820160009081209389168152929052902055801561107e577f000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f6001600160a01b0316638380edb76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e639190613012565b15610e9157610e8c838381518110610e7d57610e7d612ffc565b602002602001015185836126da565b61107e565b33600090815260096020526040902054801580610f35575060405163f8a0576360e01b8152600481018290527f000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f6001600160a01b03169063f8a0576390602401602060405180830381865afa158015610f0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f329190613034565b42115b15610ffa576001600160a01b037f000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f1663d4e54c3b83610f7862093a806008612fc2565b6040516001600160e01b031960e085901b168152600481019290925260248201523360448201526064016020604051808303816000875af1158015610fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe59190613034565b3360009081526009602052604090205561107c565b604051631dd33fc560e31b815260048101829052602481018390527f000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f6001600160a01b03169063ee99fe2890604401600060405180830381600087803b15801561106357600080fd5b505af1158015611077573d6000803e3d6000fd5b505050505b505b82828151811061109057611090612ffc565b60200260200101516001600160a01b0316336001600160a01b03167f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc9836040516110dc91815260200190565b60405180910390a350806110ef81612fe1565b915050610c0d565b506001600160a01b0382166000908152600260205260408120546001805491928392611124908490612f71565b909155506111339050836118d1565b6001600160a01b0384166000908152600260205260408120829055600180549293508392909190611165908490612faa565b90915550506001600160a01b03831660009081526002602052604090205461118e9084906127c9565b6111966128d4565b5050600160145550565b6111aa8282612979565b6001600160a01b03909316600090815260066020908152604080832060059092529091209390935590915550565b336001600160a01b037f00000000000000000000000089549e232aacc4579f93b65735a9349038a47775161461124a5760405162461bcd60e51b815260206004820152601260248201527136bab9ba10313290333937b6903b37ba32b960711b60448201526064015b60405180910390fd5b6000805460ff19169055565b6001600160a01b03811660009081526004602052604081205461085d904290612ad8565b6011546000908061128e5750600092915050565b826010600061129e600185612f71565b815260200190815260200160002060000154116112c7576112c0600182612f71565b9392505050565b6000805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01548310156113025750600092915050565b600080611310600184612f71565b90505b818111156113a457600060026113298484612f71565b6113339190612f88565b61133d9083612f71565b60008181526010602090815260409182902082518084019093528054808452600190910154918301919091529192509087141561137e575095945050505050565b805187111561138f5781935061139d565b61139a600183612f71565b92505b5050611313565b509392505050565b336000908152600b60205260409020546113c590610af3565b565b6001600160a01b03811660009081526004602052604081205442106113ee57506000919050565b6001600160a01b038216600090815260046020526040812054611412904290612f71565b6001600160a01b0384166000908152600360205260409020549091506112c09082612fc2565b60145460011461144757600080fd5b60026014819055507f000000000000000000000000665ff8faa06986bd6f1802fa6c1d2e7d780a73696001600160a01b0316826001600160a01b0316141561148e57600080fd5b6000811161149b57600080fd5b6001600160a01b0382166000908152600360205260409020546114c4576114c482600042612ae7565b6114cd826124f7565b6001600160a01b038416600090815260066020908152604080832060058352818420949094559390925560049091522054421061153b5761151082333084612bd6565b61151d62093a8082612f88565b6001600160a01b0383166000908152600360205260409020556115d4565b6001600160a01b03821660009081526004602052604081205461155f904290612f71565b6001600160a01b038416600090815260036020526040812054919250906115869083612fc2565b905080831161159457600080fd5b6115a084333086612bd6565b62093a806115ae8285612faa565b6115b89190612f88565b6001600160a01b03851660009081526003602052604090205550505b6001600160a01b0382166000908152600360205260409020546115f657600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561163d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116619190613034565b905061167062093a8082612f88565b6001600160a01b03841660009081526003602052604090205411156116d75760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f206869676800000000000000006044820152606401611241565b6116e462093a8042612faa565b6001600160a01b038416600090815260046020908152604080832093909355600d9052205460ff16611776576001600160a01b0383166000818152600d60205260408120805460ff19166001908117909155600c805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b03191690911790555b6040518281526001600160a01b0384169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf508269060200160405180910390a35050600160145550565b336001600160a01b037f00000000000000000000000089549e232aacc4579f93b65735a9349038a47775161461182d5760405162461bcd60e51b815260206004820152601260248201527136bab9ba10313290333937b6903b37ba32b960711b6044820152606401611241565b6000805460ff19166001179055565b6040516370a0823160e01b81523360048201526118ce907f000000000000000000000000665ff8faa06986bd6f1802fa6c1d2e7d780a73696001600160a01b0316906370a0823190602401602060405180830381865afa1580156118a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c89190613034565b82611baa565b50565b6001600160a01b038116600090815260096020908152604080832054600b909252822054826064611903836028612fc2565b61190d9190612f88565b90506000807f000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611970573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119949190613034565b6040516331a9108f60e11b8152600481018790529091507f000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f6001600160a01b031690636352211e90602401602060405180830381865afa1580156119fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a20919061304d565b6001600160a01b0316876001600160a01b0316148015611a405750600081115b8015611ac957507f000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f6001600160a01b0316638380edb76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac99190613012565b15611b8c576040516339f890b560e21b8152600481018690527f000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f6001600160a01b03169063e7e242d490602401602060405180830381865afa158015611b33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b579190613034565b915060648183600a54611b6a9190612fc2565b611b749190612f88565b611b7f90603c612fc2565b611b899190612f88565b91505b611b9f611b998385612faa565b85612ad8565b979650505050505050565b60005460ff16611c085760405162461bcd60e51b815260206004820152602360248201527f54686973206761756765206973206e6f74206f70656e20666f72206465706f7360448201526269747360e81b6064820152608401611241565b601454600114611c1757600080fd5b600260145581611c2657600080fd5b611c527f000000000000000000000000665ff8faa06986bd6f1802fa6c1d2e7d780a7369333085612bd6565b81600a6000828254611c649190612faa565b9091555050336000908152600b602052604081208054849290611c88908490612faa565b90915550508015611dfa576040516331a9108f60e11b81526004810182905233906001600160a01b037f000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f1690636352211e90602401602060405180830381865afa158015611cfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1e919061304d565b6001600160a01b031614611d3157600080fd5b33600090815260096020526040902054611dda5733600081815260096020526040908190208390555163698473e360e01b81526004810183905260248101919091526001600160a01b037f00000000000000000000000089549e232aacc4579f93b65735a9349038a47775169063698473e390604401600060405180830381600087803b158015611dc157600080fd5b505af1158015611dd5573d6000803e3d6000fd5b505050505b336000908152600960205260409020548114611df557600080fd5b611e0c565b50336000908152600960205260409020545b336000908152600260205260408120546001805491928392611e2f908490612f71565b90915550611e3e9050336118d1565b336000908152600260205260408120829055600180549293508392909190611e67908490612faa565b90915550611e77905033826127c9565b611e7f6128d4565b60405163530e389d60e11b815260048101839052336024820152604481018490527f00000000000000000000000089549e232aacc4579f93b65735a9349038a477756001600160a01b03169063a61c713a90606401600060405180830381600087803b158015611eee57600080fd5b505af1158015611f02573d6000803e3d6000fd5b505060408051858152602081018790523393507f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159250015b60405180910390a25050600160145550565b600060015460001415611f7557506001600160a01b031660009081526006602052604090205490565b6001546001600160a01b03831660009081526003602090815260408083205460058352818420546004909352922054670de0b6b3a76400009291611fb891612ad8565b611fc186611256565b611fcb9190612f71565b611fd59190612fc2565b611fdf9190612fc2565b611fe99190612f88565b6001600160a01b03831660009081526006602052604090205461085d9190612faa565b600c818154811061201c57600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b03821660009081526013602052604081205481908061206357600080925092505061224e565b6001600160a01b03851660009081526012602052604081208591612088600185612f71565b81526020019081526020016000206000015411612125576001600160a01b0385166000908152601260205260408120906120c3600184612f71565b81526020019081526020016000206001015460126000876001600160a01b03166001600160a01b0316815260200190815260200160002060006001846121099190612f71565b815260200190815260200160002060000154925092505061224e565b6001600160a01b038516600090815260126020908152604080832083805290915290205484101561215d57600080925092505061224e565b60008061216b600184612f71565b90505b8181111561221d57600060026121848484612f71565b61218e9190612f88565b6121989083612f71565b6001600160a01b03891660009081526012602090815260408083208484528252918290208251808401909352805480845260019091015491830191909152919250908814156121f75760208101519051909650945061224e9350505050565b805188111561220857819350612216565b612213600183612f71565b92505b505061216e565b506001600160a01b038616600090815260126020908152604080832093835292905220600181015490549093509150505b9250929050565b60145460011461226457600080fd5b600260148190555081600a600082825461227e9190612f71565b9091555050336000908152600b6020526040812080548492906122a2908490612f71565b909155506122d390507f000000000000000000000000665ff8faa06986bd6f1802fa6c1d2e7d780a736933846126da565b801561238d573360009081526009602052604090205481146122f457600080fd5b33600081815260096020526040808220919091555163411b1f7760e01b81526004810183905260248101919091526001600160a01b037f00000000000000000000000089549e232aacc4579f93b65735a9349038a47775169063411b1f7790604401600060405180830381600087803b15801561237057600080fd5b505af1158015612384573d6000803e3d6000fd5b5050505061239f565b50336000908152600960205260409020545b3360009081526002602052604081205460018054919283926123c2908490612f71565b909155506123d19050336118d1565b3360009081526002602052604081208290556001805492935083929091906123fa908490612faa565b90915550503360008181526002602052604090205461241991906127c9565b6124216128d4565b604051633aa53b9160e21b815260048101839052336024820152604481018490527f00000000000000000000000089549e232aacc4579f93b65735a9349038a477756001600160a01b03169063ea94ee4490606401600060405180830381600087803b15801561249057600080fd5b505af11580156124a4573d6000803e3d6000fd5b505060408051858152602081018790523393507ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568925001611f3a565b6000818310156124f057816112c0565b5090919050565b6001600160a01b03811660009081526005602090815260408083205460069092528220546011548392919061252f5794909350915050565b6001600160a01b038516600090815260036020526040902054612556579442945092505050565b60006125618361127a565b9050600060016011546125749190612f71565b905060016125828383612f71565b111561265a57815b612595600183612f71565b8110156126585760008181526010602090815260409182902082518084019093528054835260010154908201819052156126455760006010816125d9856001612faa565b81526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000806126248c8460000151866000015187602001518d612cce565b90925090506126338289612faa565b97506126408c8983612ae7565b975050505b508061265081612fe1565b91505061258a565b505b60008181526010602090815260409182902082518084019093528054835260010154908201819052156126cc5760006126ad896126968b611256565b84516126a2908a6124e0565b85602001518a612cce565b5090506126ba8186612faa565b94506126c7898642612ae7565b429550505b509196929550919350505050565b6000836001600160a01b03163b116126f157600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161274d919061306a565b6000604051808303816000865af19150503d806000811461278a576040519150601f19603f3d011682016040523d82523d6000602084013e61278f565b606091505b50915091508180156127b95750805115806127b95750808060200190518101906127b99190613012565b6127c257600080fd5b5050505050565b6001600160a01b0382166000908152600f60205260409020544290801580159061282757506001600160a01b0384166000908152600e602052604081208391612813600185612f71565b815260200190815260200160002060000154145b1561286a576001600160a01b0384166000908152600e602052604081208491612851600185612f71565b81526020810191909152604001600020600101556128ce565b60408051808201825283815260208082018681526001600160a01b0388166000908152600e83528481208682529092529290209051815590516001918201556128b4908290612faa565b6001600160a01b0385166000908152600f60205260409020555b50505050565b601154428115801590612906575080601060006128f2600186612f71565b815260200190815260200160002060000154145b15612937576001546010600060018561291f9190612f71565b81526020810191909152604001600020600101555050565b604080518082018252828152600180546020808401918252600087815260109091529390932091518255915190820155612972908390612faa565b6011555050565b6001600160a01b0382166000908152600560209081526040808320546006909252822054601154839291906129b1579250905061224e565b6001600160a01b0386166000908152600360205260409020546129da57925042915061224e9050565b60006129e58361127a565b90506000612a0160016011546129fb9190612f71565b88612ad8565b9050815b81811015612ac9576000818152601060209081526040918290208251808401909352805483526001015490820181905215612ab6576000601081612a4a856001612faa565b8152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050600080612a958d8460000151866000015187602001518d612cce565b9092509050612aa48289612faa565b9750612ab18d8983612ae7565b975050505b5080612ac181612fe1565b915050612a05565b50919792965091945050505050565b60008183106124f057816112c0565b6001600160a01b0383166000908152601360205260409020548015801590612b4357506001600160a01b03841660009081526012602052604081208391612b2f600185612f71565b815260200190815260200160002060000154145b15612b6d576001600160a01b03841660009081526012602052604081208491612851600185612f71565b60408051808201825283815260208082018681526001600160a01b038816600090815260128352848120868252909252929020905181559051600191820155612bb7908290612faa565b6001600160a01b03851660009081526013602052604090205550505050565b6000846001600160a01b03163b11612bed57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612c51919061306a565b6000604051808303816000865af19150503d8060008114612c8e576040519150601f19603f3d011682016040523d82523d6000602084013e612c93565b606091505b5091509150818015612cbd575080511580612cbd575080806020019051810190612cbd9190613012565b612cc657600080fd5b505050505050565b6000806000612cdd87856124e0565b6001600160a01b0389166000908152600360205260409020549091508590670de0b6b3a764000090612d30612d128a896124e0565b6001600160a01b038d16600090815260046020526040902054612ad8565b6001600160a01b038c16600090815260046020526040902054612d54908690612ad8565b612d5e9190612f71565b612d689190612fc2565b612d729190612fc2565b612d7c9190612f88565b9890975095505050505050565b6001600160a01b03811681146118ce57600080fd5b8035612da981612d89565b919050565b60008060408385031215612dc157600080fd5b8235612dcc81612d89565b946020939093013593505050565b60008060408385031215612ded57600080fd5b8235612df881612d89565b91506020830135612e0881612d89565b809150509250929050565b600060208284031215612e2557600080fd5b81356112c081612d89565b600060208284031215612e4257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215612e7257600080fd5b8235612e7d81612d89565b915060208381013567ffffffffffffffff80821115612e9b57600080fd5b818601915086601f830112612eaf57600080fd5b813581811115612ec157612ec1612e49565b8060051b604051601f19603f83011681018181108582111715612ee657612ee6612e49565b604052918252848201925083810185019189831115612f0457600080fd5b938501935b82851015612f2957612f1a85612d9e565b84529385019392850192612f09565b8096505050505050509250929050565b60008060408385031215612f4c57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b600082821015612f8357612f83612f5b565b500390565b600082612fa557634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612fbd57612fbd612f5b565b500190565b6000816000190483118215151615612fdc57612fdc612f5b565b500290565b6000600019821415612ff557612ff5612f5b565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561302457600080fd5b815180151581146112c057600080fd5b60006020828403121561304657600080fd5b5051919050565b60006020828403121561305f57600080fd5b81516112c081612d89565b6000825160005b8181101561308b5760208186018101518583015201613071565b8181111561309a576000828501525b50919091019291505056fea2646970667358221220c9dcef713f48dff7240004c45662d3386670b2b56439f644083cb991c5c5cdbd64736f6c634300080b0033

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

000000000000000000000000665ff8faa06986bd6f1802fa6c1d2e7d780a7369000000000000000000000000c3b4d42ce8b3672040116f89b1f76ed5a859c7a2000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f00000000000000000000000089549e232aacc4579f93b65735a9349038a47775

-----Decoded View---------------
Arg [0] : _stake (address): 0x665ff8fAA06986Bd6f1802fA6C1D2e7d780a7369
Arg [1] : _bribe (address): 0xC3b4d42ce8b3672040116f89b1f76ed5A859c7A2
Arg [2] : __ve (address): 0xf2feC13CDB46760E065DDC1DF9dA16Cb87AFD61f
Arg [3] : _voter (address): 0x89549e232AAcC4579F93B65735A9349038a47775

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000665ff8faa06986bd6f1802fa6c1d2e7d780a7369
Arg [1] : 000000000000000000000000c3b4d42ce8b3672040116f89b1f76ed5a859c7a2
Arg [2] : 000000000000000000000000f2fec13cdb46760e065ddc1df9da16cb87afd61f
Arg [3] : 00000000000000000000000089549e232aacc4579f93b65735a9349038a47775


Deployed Bytecode Sourcemap

2016:22160:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4146:96;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;783:25:1;;;839:2;824:18;;817:34;;;;756:18;4146:96:0;;;;;;;;3661:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6058:1058;;;;;;:::i;:::-;;:::i;:::-;;;1008:25:1;;;996:2;981:18;6058:1058:0;862:177:1;2998:23:0;;;;;;17747:1330;;;;;;:::i;:::-;;:::i;2583:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;2683:46;;;;;;:::i;:::-;;;;;;;;;;;;;;20435:218;;;;;;:::i;:::-;;:::i;:::-;;11526:1735;;;;;;:::i;:::-;;:::i;2199:30::-;;;;;;;;-1:-1:-1;;;;;3431:32:1;;;3413:51;;3401:2;3386:18;2199:30:0;3267:203:1;2040:30:0;;;;;2864:76;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;2236:30;;;;;3109:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3640:14:1;;3633:22;3615:41;;3603:2;3588:18;3109:40:0;3475:187:1;14268:178:0;;;;;;:::i;:::-;;:::i;5092:133::-;;;:::i;11370:148::-;;;;;;:::i;:::-;;:::i;2340:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;3796;;;;;;:::i;:::-;;;;;;;;;;;;;;3028:41;;;;;;:::i;:::-;;;;;;;;;;;;;;7124:1034;;;;;;:::i;:::-;;:::i;20345:82::-;;;:::i;2132:28::-;;;;;21616:243;;;;;;:::i;:::-;;:::i;2736:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;5373:93;5422:4;5446:12;;;5373:93;;2797:60;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;4307:61;;;;;;:::i;:::-;;;;;;;;;;;;;;21867:1268;;;;;;:::i;:::-;;:::i;5233:132::-;;;:::i;19085:114::-;;;;;;:::i;:::-;;:::i;13632:628::-;;;;;;:::i;:::-;;:::i;2308:25::-;;;;;;2632:44;;;;;;:::i;:::-;;;;;;;;;;;;;;19207:1130;;;;;;:::i;:::-;;:::i;11170:98::-;11246:7;:14;11170:98;;4033:32;;;;;;13269:355;;;;;;:::i;:::-;;:::i;3078:24::-;;;;;;:::i;:::-;;:::i;3924:59::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;2949:40;;;;;;:::i;:::-;;;;;;;;;;;;;;8166:1374;;;;;;:::i;:::-;;:::i;20661:947::-;;;;;;:::i;:::-;;:::i;6058:1058::-;-1:-1:-1;;;;;6179:23:0;;6142:4;6179:23;;;:14;:23;;;;;;6217:17;6213:58;;6258:1;6251:8;;;;;6213:58;-1:-1:-1;;;;;6331:20:0;;;;;;:11;:20;;;;;6383:9;;6352:16;6367:1;6352:12;:16;:::i;:::-;6331:38;;;;;;;;;;;:48;;;:61;6327:119;;6417:16;6432:1;6417:12;:16;:::i;:::-;6409:25;;;;;6327:119;-1:-1:-1;;;;;6507:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:45;-1:-1:-1;6503:86:0;;;6576:1;6569:8;;;;;6503:86;6601:10;;6639:16;6654:1;6639:12;:16;:::i;:::-;6626:29;;6666:420;6681:5;6673;:13;6666:420;;;6703:11;6743:1;6726:13;6734:5;6726;:13;:::i;:::-;6725:19;;;;:::i;:::-;6717:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;6809:20:0;;6786;6809;;;:11;:20;;;;;;;;:28;;;;;;;;;6786:51;;;;;;;;;;;;;;;;;;;;;;;;;6703:41;;-1:-1:-1;6786:51:0;6856:25;;6852:223;;;-1:-1:-1;6909:6:0;-1:-1:-1;6902:13:0;;-1:-1:-1;;;6902:13:0;6852:223;6941:12;;:24;-1:-1:-1;6937:138:0;;;6994:6;6986:14;;6937:138;;;7049:10;7058:1;7049:6;:10;:::i;:::-;7041:18;;6937:138;6688:398;;6666:420;;;-1:-1:-1;7103:5:0;-1:-1:-1;;6058:1058:0;;;;;:::o;17747:1330::-;-1:-1:-1;;;;;17865:15:0;;;17816:4;17865:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;17891:32;;;:25;:32;;;;;:35;;;;;;;;:45;17816:4;;17856:81;;:8;:81::i;:::-;-1:-1:-1;;;;;17952:23:0;;;;;;:14;:23;;;;;;17833:104;;-1:-1:-1;17948:69:0;;18004:1;17997:8;;;;;17948:69;18029:16;18048:46;18069:7;18078:15;18048:20;:46::i;:::-;-1:-1:-1;;;;;18122:23:0;;18105:14;18122:23;;;:14;:23;;;;;;18029:65;;-1:-1:-1;18105:14:0;18122:25;;18146:1;;18122:25;:::i;:::-;18105:42;-1:-1:-1;18160:11:0;18218:1;18192:23;18204:11;18105:42;18192:23;:::i;:::-;:27;18188:556;;;18250:11;18236:497;18267:11;18277:1;18267:9;:11;:::i;:::-;18263:1;:15;18236:497;;;-1:-1:-1;;;;;18328:20:0;;18304:21;18328:20;;;:11;:20;;;;;;;;:23;;;;;;;;;18304:47;;;;;;;;;;;;;;;;;;;;;18394:20;;;;;;;18304:47;:21;;18415:3;;18349:1;;18415:3;:::i;:::-;18394:25;;;;;;;;;;;18370:49;;;;;;;;;;;;;;;;;;;;;;;;;;;18439:27;18471:44;18494:5;18501:3;:13;;;18471:22;:44::i;:::-;18438:77;;;18535:27;18567:44;18590:5;18597:3;:13;;;18567:22;:44::i;:::-;-1:-1:-1;18534:77:0;-1:-1:-1;2514:8:0;18657:47;18682:22;18534:77;18657:47;:::i;:::-;18640:3;:13;;;:65;;;;:::i;:::-;:77;;;;:::i;:::-;18630:87;;;;:::i;:::-;;;18285:448;;;;18280:3;;;;;:::i;:::-;;;;18236:497;;;;18188:556;-1:-1:-1;;;;;18779:20:0;;18756;18779;;;:11;:20;;;;;;;;:31;;;;;;;;18756:54;;;;;;;;;;;;;;;;;;;;;;;;;;:20;18853:43;;18876:5;;18853:22;:43::i;:::-;-1:-1:-1;;;;;;18989:31:0;;;;;;;:24;:31;;;;;;;;:40;;;;;;;;;;18821:75;;-1:-1:-1;2514:8:0;;18957:73;;18821:75;;18957:8;:73::i;:::-;18933:21;18948:5;18933:14;:21::i;:::-;:97;;;;:::i;:::-;18917:2;:12;;;:114;;;;:::i;:::-;:126;;;;:::i;:::-;18907:136;;;;:::i;:::-;;17747:1330;-1:-1:-1;;;;;;;;;17747:1330:0:o;20435:218::-;20535:10;20484:12;20525:21;;;:9;:21;;;;;;20515:31;;20511:94;;;-1:-1:-1;20582:10:0;20573:20;;;;:8;:20;;;;;;20511:94;20615:30;20629:6;20637:7;20615:13;:30::i;:::-;20473:180;20435:218;:::o;11526:1735::-;5576:9;;5589:1;5576:14;5568:23;;;;;;5614:1;5602:9;:13;11620:10:::1;-1:-1:-1::0;;;;;11620:21:0;::::1;;::::0;:44:::1;;-1:-1:-1::0;11645:10:0::1;-1:-1:-1::0;;;;;11659:5:0::1;11645:19;;11620:44;11612:53;;;::::0;::::1;;11688:1;11676:9;:13:::0;11700:38:::1;::::0;-1:-1:-1;;;11700:38:0;;11732:4:::1;11700:38;::::0;::::1;3413:51:1::0;11706:5:0::1;-1:-1:-1::0;;;;;11700:23:0::1;::::0;::::1;::::0;3386:18:1;;11700:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;11761:1:0::1;11749:9;:13:::0;-1:-1:-1;11780:6:0::1;::::0;-1:-1:-1;11775:1129:0::1;11796:6;:13;11792:1;:17;11775:1129;;;11894:32;11916:6;11923:1;11916:9;;;;;;;;:::i;:::-;;;;;;;11894:21;:32::i;:::-;11832:20;:31;11853:6;11860:1;11853:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;11832:31:0::1;-1:-1:-1::0;;;;;11832:31:0::1;;;;;;;;;;;;;11865:14;:25;11880:6;11887:1;11880:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;11865:25:0::1;-1:-1:-1::0;;;;;11865:25:0::1;;;;;;;;;;;;;11831:95;;;;;;;;;;;;11943:12;11958:26;11965:6;11972:1;11965:9;;;;;;;;:::i;:::-;;;;;;;11976:7;11958:6;:26::i;:::-;11943:41;;12030:15;11999:8;:19;12008:6;12015:1;12008:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;11999:19:0::1;-1:-1:-1::0;;;;;11999:19:0::1;;;;;;;;;;;;:28;12019:7;-1:-1:-1::0;;;;;11999:28:0::1;-1:-1:-1::0;;;;;11999:28:0::1;;;;;;;;;;;;:46;;;;12107:20;:31;12128:6;12135:1;12128:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;12107:31:0::1;-1:-1:-1::0;;;;;12107:31:0::1;;;;;;;;;;;;;12060:24;:35;12085:6;12092:1;12085:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;12060:35:0;;::::1;::::0;;;;::::1;::::0;;;;;;;;-1:-1:-1;12060:35:0;;;:44;;::::1;::::0;;;;;;;:78;12157:11;;12153:676:::1;;12270:3;-1:-1:-1::0;;;;;12267:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12263:551;;;12310:42;12324:6;12331:1;12324:9;;;;;;;;:::i;:::-;;;;;;;12335:7;12344;12310:13;:42::i;:::-;12263:551;;;12421:10;12397:12;12412:20:::0;;;:8:::1;:20;::::0;;;;;12459:12;;;:62:::1;;-1:-1:-1::0;12493:28:0::1;::::0;-1:-1:-1;;;12493:28:0;;::::1;::::0;::::1;1008:25:1::0;;;12496:3:0::1;-1:-1:-1::0;;;;;12493:19:0::1;::::0;::::1;::::0;981:18:1;;12493:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12475:15;:46;12459:62;12455:342;;;-1:-1:-1::0;;;;;12630:3:0::1;12627:23;;12651:7:::0;12660:12:::1;2430:6;12671:1;12660:12;:::i;:::-;12627:58;::::0;-1:-1:-1;;;;;;12627:58:0::1;::::0;;;;;;::::1;::::0;::::1;5655:25:1::0;;;;5696:18;;;5689:34;12674:10:0::1;5739:18:1::0;;;5732:60;5628:18;;12627:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12613:10;12604:20;::::0;;;:8:::1;:20;::::0;;;;:81;12455:342:::1;;;12738:37;::::0;-1:-1:-1;;;12738:37:0;;::::1;::::0;::::1;783:25:1::0;;;824:18;;;817:34;;;12741:3:0::1;-1:-1:-1::0;;;;;12738:19:0::1;::::0;::::1;::::0;756:18:1;;12738:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12455:342;12376:438;12263:551;12873:6;12880:1;12873:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;12848:44:0::1;12861:10;-1:-1:-1::0;;;;;12848:44:0::1;;12884:7;12848:44;;;;1008:25:1::0;;996:2;981:18;;862:177;12848:44:0::1;;;;;;;;-1:-1:-1::0;11811:3:0;::::1;::::0;::::1;:::i;:::-;;;;11775:1129;;;-1:-1:-1::0;;;;;;12939:24:0;::::1;12916:20;12939:24:::0;;;:15:::1;:24;::::0;;;;;12974:13:::1;:32:::0;;12939:24;;;;12974:32:::1;::::0;12939:24;;12974:32:::1;:::i;:::-;::::0;;;-1:-1:-1;13035:23:0::1;::::0;-1:-1:-1;13050:7:0;13035:14:::1;:23::i;:::-;-1:-1:-1::0;;;;;13069:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;:42;;;13122:13:::1;:32:::0;;13017:41;;-1:-1:-1;13017:41:0;;13122:13;;13069:24;13122:32:::1;::::0;13017:41;;13122:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;13193:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;;13167:51:::1;::::0;13184:7;;13167:16:::1;:51::i;:::-;13229:24;:22;:24::i;:::-;-1:-1:-1::0;;5650:1:0;5638:9;:13;-1:-1:-1;11526:1735:0:o;14268:178::-;14402:36;14423:5;14430:7;14402:20;:36::i;:::-;-1:-1:-1;;;;;14347:27:0;;;;;;;:20;:27;;;;;;;;14376:14;:21;;;;;;14346:92;;;;;;;-1:-1:-1;14268:178:0:o;5092:133::-;5144:10;-1:-1:-1;;;;;5158:5:0;5144:19;;5136:50;;;;-1:-1:-1;;;5136:50:0;;6005:2:1;5136:50:0;;;5987:21:1;6044:2;6024:18;;;6017:30;-1:-1:-1;;;6063:18:1;;;6056:48;6121:18;;5136:50:0;;;;;;;;;5212:5;5197:20;;-1:-1:-1;;5197:20:0;;;5092:133::o;11370:148::-;-1:-1:-1;;;;;11490:19:0;;11440:4;11490:19;;;:12;:19;;;;;;11464:46;;11473:15;;11464:8;:46::i;7124:1034::-;7227:20;;7190:4;;7262:17;7258:58;;-1:-1:-1;7303:1:0;;7124:1034;-1:-1:-1;;7124:1034:0:o;7258:58::-;7425:9;7376:17;:35;7394:16;7409:1;7394:12;:16;:::i;:::-;7376:35;;;;;;;;;;;:45;;;:58;7372:116;;7459:16;7474:1;7459:12;:16;:::i;:::-;7451:25;7124:1034;-1:-1:-1;;;7124:1034:0:o;7372:116::-;7549:20;;;:17;:20;;;:30;:42;-1:-1:-1;7545:83:0;;;-1:-1:-1;7615:1:0;;7124:1034;-1:-1:-1;;7124:1034:0:o;7545:83::-;7640:10;;7678:16;7693:1;7678:12;:16;:::i;:::-;7665:29;;7705:423;7720:5;7712;:13;7705:423;;;7742:11;7782:1;7765:13;7773:5;7765;:13;:::i;:::-;7764:19;;;;:::i;:::-;7756:27;;:5;:27;:::i;:::-;7825:26;7854:25;;;:17;:25;;;;;;;;;7825:54;;;;;;;;;;;;;;;;;;;;;;;;;7742:41;;-1:-1:-1;7825:54:0;7898:25;;7894:223;;;-1:-1:-1;7951:6:0;7124:1034;-1:-1:-1;;;;;7124:1034:0:o;7894:223::-;7983:12;;:24;-1:-1:-1;7979:138:0;;;8036:6;8028:14;;7979:138;;;8091:10;8100:1;8091:6;:10;:::i;:::-;8083:18;;7979:138;7727:401;;7705:423;;;-1:-1:-1;8145:5:0;7124:1034;-1:-1:-1;;;7124:1034:0:o;20345:82::-;20407:10;20397:21;;;;:9;:21;;;;;;20388:31;;:8;:31::i;:::-;20345:82::o;21616:243::-;-1:-1:-1;;;;;21708:19:0;;21668:4;21708:19;;;:12;:19;;;;;;21689:15;:38;21685:52;;-1:-1:-1;21736:1:0;;21616:243;-1:-1:-1;21616:243:0:o;21685:52::-;-1:-1:-1;;;;;21766:19:0;;21748:15;21766:19;;;:12;:19;;;;;;:37;;21788:15;;21766:37;:::i;:::-;-1:-1:-1;;;;;21834:17:0;;;;;;:10;:17;;;;;;21748:55;;-1:-1:-1;21821:30:0;;21748:55;21821:30;:::i;21867:1268::-;5576:9;;5589:1;5576:14;5568:23;;;;;;5614:1;5602:9;:13;;;;21965:5:::1;-1:-1:-1::0;;;;;21956:14:0::1;:5;-1:-1:-1::0;;;;;21956:14:0::1;;;21948:23;;;::::0;::::1;;21999:1;21990:6;:10;21982:19;;;::::0;::::1;;-1:-1:-1::0;;;;;22016:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;22012:85:::1;;22040:57;22071:5;22078:1;22081:15;22040:30;:57::i;:::-;22163:28;22185:5;22163:21;:28::i;:::-;-1:-1:-1::0;;;;;22109:27:0;::::1;;::::0;;;:20:::1;:27;::::0;;;;;;;22138:14:::1;:21:::0;;;;;22108:83;;;;;;;;22227:12:::1;:19:::0;;;;;22208:15:::1;:38;22204:502;;22263:59;22281:5;22288:10;22308:4;22315:6;22263:17;:59::i;:::-;22357:17;2430:6;22357::::0;:17:::1;:::i;:::-;-1:-1:-1::0;;;;;22337:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:37;22204:502:::1;;;-1:-1:-1::0;;;;;22425:19:0;::::1;22407:15;22425:19:::0;;;:12:::1;:19;::::0;;;;;:37:::1;::::0;22447:15:::1;::::0;22425:37:::1;:::i;:::-;-1:-1:-1::0;;;;;22503:17:0;::::1;22477:10;22503:17:::0;;;:10:::1;:17;::::0;;;;;22407:55;;-1:-1:-1;22477:10:0;22490:30:::1;::::0;22407:55;22490:30:::1;:::i;:::-;22477:43;;22552:5;22543:6;:14;22535:23;;;::::0;::::1;;22573:59;22591:5;22598:10;22618:4;22625:6;22573:17;:59::i;:::-;2430:6;22668:14;22677:5:::0;22668:6;:14:::1;:::i;:::-;22667:27;;;;:::i;:::-;-1:-1:-1::0;;;;;22647:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:47;-1:-1:-1;;22204:502:0::1;-1:-1:-1::0;;;;;22724:17:0;::::1;22744:1;22724:17:::0;;;:10:::1;:17;::::0;;;;;22716:30:::1;;;::::0;::::1;;22772:37;::::0;-1:-1:-1;;;22772:37:0;;22803:4:::1;22772:37;::::0;::::1;3413:51:1::0;22757:12:0::1;::::0;-1:-1:-1;;;;;22772:22:0;::::1;::::0;::::1;::::0;3386:18:1;;22772:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22757:52:::0;-1:-1:-1;22849:18:0::1;2430:6;22757:52:::0;22849:18:::1;:::i;:::-;-1:-1:-1::0;;;;;22828:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;:39:::1;;22820:76;;;::::0;-1:-1:-1;;;22820:76:0;;6352:2:1;22820:76:0::1;::::0;::::1;6334:21:1::0;6391:2;6371:18;;;6364:30;6430:26;6410:18;;;6403:54;6474:18;;22820:76:0::1;6150:348:1::0;22820:76:0::1;22929:26;2430:6;22929:15;:26;:::i;:::-;-1:-1:-1::0;;;;;22907:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;;;:48;;;;22971:8:::1;:15:::0;;;;::::1;;22966:105;;-1:-1:-1::0;;;;;23003:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:22;;-1:-1:-1;;23003:22:0::1;23021:4;23003:22:::0;;::::1;::::0;;;23040:7:::1;:19:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;23040:19:0::1;::::0;;::::1;::::0;;22966:105:::1;23088:39;::::0;1008:25:1;;;-1:-1:-1;;;;;23088:39:0;::::1;::::0;23101:10:::1;::::0;23088:39:::1;::::0;996:2:1;981:18;23088:39:0::1;;;;;;;-1:-1:-1::0;;5650:1:0;5638:9;:13;-1:-1:-1;21867:1268:0:o;5233:132::-;5285:10;-1:-1:-1;;;;;5299:5:0;5285:19;;5277:50;;;;-1:-1:-1;;;5277:50:0;;6005:2:1;5277:50:0;;;5987:21:1;6044:2;6024:18;;;6017:30;-1:-1:-1;;;6063:18:1;;;6056:48;6121:18;;5277:50:0;5803:342:1;5277:50:0;5338:12;:19;;-1:-1:-1;;5338:19:0;5353:4;5338:19;;;5233:132::o;19085:114::-;19147:34;;-1:-1:-1;;;19147:34:0;;19170:10;19147:34;;;3413:51:1;19139:52:0;;19153:5;-1:-1:-1;;;;;19147:22:0;;;;3386:18:1;;19147:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19183:7;19139;:52::i;:::-;19085:114;:::o;13632:628::-;-1:-1:-1;;;;;13727:17:0;;13694:4;13727:17;;;:8;:17;;;;;;;;;13771:9;:18;;;;;;13694:4;13832:3;13816:13;13771:18;13827:2;13816:13;:::i;:::-;:19;;;;:::i;:::-;13800:35;;13846:14;13875:12;13896:3;-1:-1:-1;;;;;13890:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13985:25;;-1:-1:-1;;;13985:25:0;;;;;1008::1;;;13875:39:0;;-1:-1:-1;13988:3:0;-1:-1:-1;;;;;13985:15:0;;;;981:18:1;;13985:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13974:36:0;:7;-1:-1:-1;;;;;13974:36:0;;:51;;;;;14024:1;14014:7;:11;13974:51;:75;;;;;14032:3;-1:-1:-1;;;;;14029:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13970:223;;;14078:30;;-1:-1:-1;;;14078:30:0;;;;;1008:25:1;;;14081:3:0;-1:-1:-1;;;;;14078:20:0;;;;981:18:1;;14078:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14066:42;;14178:3;14162:7;14150:9;14136:11;;:23;;;;:::i;:::-;:33;;;;:::i;:::-;14135:40;;14173:2;14135:40;:::i;:::-;:46;;;;:::i;:::-;14123:58;;13970:223;14210:42;14220:20;14231:9;14220:8;:20;:::i;:::-;14243:8;14210;:42::i;:::-;14203:49;13632:628;-1:-1:-1;;;;;;;13632:628:0:o;19207:1130::-;5012:12;;;;5004:60;;;;-1:-1:-1;;;5004:60:0;;6961:2:1;5004:60:0;;;6943:21:1;7000:2;6980:18;;;6973:30;7039:34;7019:18;;;7012:62;-1:-1:-1;;;7090:18:1;;;7083:33;7133:19;;5004:60:0;6759:399:1;5004:60:0;5576:9:::1;;5589:1;5576:14;5568:23;;;::::0;::::1;;5614:1;5602:9;:13:::0;19299:10;19291:19:::2;;;::::0;::::2;;19323:59;19341:5;19348:10;19368:4;19375:6;19323:17;:59::i;:::-;19408:6;19393:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;19435:10:0::2;19425:21;::::0;;;:9:::2;:21;::::0;;;;:31;;19450:6;;19425:21;:31:::2;::::0;19450:6;;19425:31:::2;:::i;:::-;::::0;;;-1:-1:-1;;19473:11:0;;19469:390:::2;;19509:24;::::0;-1:-1:-1;;;19509:24:0;;::::2;::::0;::::2;1008:25:1::0;;;19537:10:0::2;::::0;-1:-1:-1;;;;;19512:3:0::2;19509:15;::::0;::::2;::::0;981:18:1;;19509:24:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19509:38:0::2;;19501:47;;;::::0;::::2;;19576:10;19567:20;::::0;;;:8:::2;:20;::::0;;;;;19563:167:::2;;19622:10;19613:20;::::0;;;:8:::2;:20;::::0;;;;;;:30;;;19662:52;-1:-1:-1;;;19662:52:0;;::::2;::::0;::::2;7337:25:1::0;;;7378:18;;;7371:60;;;;-1:-1:-1;;;;;19668:5:0::2;19662:31;::::0;::::2;::::0;7310:18:1;;19662:52:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;19563:167;19761:10;19752:20;::::0;;;:8:::2;:20;::::0;;;;;:31;::::2;19744:40;;;::::0;::::2;;19469:390;;;-1:-1:-1::0;19836:10:0::2;19827:20;::::0;;;:8:::2;:20;::::0;;;;;19469:390:::2;19910:10;19871:20;19894:27:::0;;;:15:::2;:27;::::0;;;;;19932:13:::2;:32:::0;;19894:27;;;;19932:32:::2;::::0;19894:27;;19932:32:::2;:::i;:::-;::::0;;;-1:-1:-1;19993:26:0::2;::::0;-1:-1:-1;20008:10:0::2;19993:14;:26::i;:::-;20046:10;20030:27;::::0;;;:15:::2;:27;::::0;;;;:45;;;20086:13:::2;:32:::0;;19975:44;;-1:-1:-1;19975:44:0;;20086:13;;20030:27;20086:32:::2;::::0;19975:44;;20086:32:::2;:::i;:::-;::::0;;;-1:-1:-1;20131:45:0::2;::::0;-1:-1:-1;20148:10:0::2;20160:15:::0;20131:16:::2;:45::i;:::-;20187:24;:22;:24::i;:::-;20224:53;::::0;-1:-1:-1;;;20224:53:0;;::::2;::::0;::::2;7644:25:1::0;;;20258:10:0::2;7685:18:1::0;;;7678:60;7754:18;;;7747:34;;;20230:5:0::2;-1:-1:-1::0;;;;;20224:24:0::2;::::0;::::2;::::0;7617:18:1;;20224:53:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;20293:36:0::2;::::0;;783:25:1;;;839:2;824:18;;817:34;;;20301:10:0::2;::::0;-1:-1:-1;20293:36:0::2;::::0;-1:-1:-1;756:18:1;20293:36:0::2;;;;;;;;-1:-1:-1::0;;5650:1:0::1;5638:9;:13:::0;-1:-1:-1;19207:1130:0:o;13269:355::-;13329:4;13350:13;;13367:1;13350:18;13346:85;;;-1:-1:-1;;;;;;13392:27:0;;;;;:20;:27;;;;;;;13269:355::o;13346:85::-;13602:13;;-1:-1:-1;;;;;13570:17:0;;;;;;:10;:17;;;;;;;;;13523:14;:21;;;;;;13546:12;:19;;;;;;2514:8;;13570:17;13514:52;;:8;:52::i;:::-;13480:31;13505:5;13480:24;:31::i;:::-;:86;;;;:::i;:::-;13479:108;;;;:::i;:::-;:120;;;;:::i;:::-;:136;;;;:::i;:::-;-1:-1:-1;;;;;13448:27:0;;;;;;:20;:27;;;;;;:168;;;;:::i;3078:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3078:24:0;;-1:-1:-1;3078:24:0;:::o;8166:1374::-;-1:-1:-1;;;;;8293:35:0;;8250:4;8293:35;;;:28;:35;;;;;;8250:4;;8343:17;8339:62;;8385:1;8387;8377:12;;;;;;;8339:62;-1:-1:-1;;;;;8461:32:0;;;;;;:25;:32;;;;;8525:9;;8494:16;8509:1;8494:12;:16;:::i;:::-;8461:50;;;;;;;;;;;:60;;;:73;8457:242;;-1:-1:-1;;;;;8559:32:0;;;;;;:25;:32;;;;;;8592:16;8607:1;8592:12;:16;:::i;:::-;8559:50;;;;;;;;;;;:65;;;8626:25;:32;8652:5;-1:-1:-1;;;;;8626:32:0;-1:-1:-1;;;;;8626:32:0;;;;;;;;;;;;:50;8674:1;8659:12;:16;;;;:::i;:::-;8626:50;;;;;;;;;;;:60;;;8551:136;;;;;;;8457:242;-1:-1:-1;;;;;8760:32:0;;;;;;:25;:32;;;;;;;;:35;;;;;;;;:45;:57;-1:-1:-1;8756:102:0;;;8842:1;8844;8834:12;;;;;;;8756:102;8870:10;;8908:16;8923:1;8908:12;:16;:::i;:::-;8895:29;;8935:473;8950:5;8942;:13;8935:473;;;8972:11;9012:1;8995:13;9003:5;8995;:13;:::i;:::-;8994:19;;;;:::i;:::-;8986:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;9092:32:0;;9055:34;9092:32;;;:25;:32;;;;;;;;:40;;;;;;;;;9055:77;;;;;;;;;;;;;;;;;;;;;;;;;8972:41;;-1:-1:-1;9055:77:0;9151:25;;9147:250;;;9205:17;;;;9224:12;;9205:17;;-1:-1:-1;9224:12:0;-1:-1:-1;9197:40:0;;-1:-1:-1;;;;9197:40:0;9147:250;9263:12;;:24;-1:-1:-1;9259:138:0;;;9316:6;9308:14;;9259:138;;;9371:10;9380:1;9371:6;:10;:::i;:::-;9363:18;;9259:138;8957:451;;8935:473;;;-1:-1:-1;;;;;;9426:32:0;;;;;;:25;:32;;;;;;;;:39;;;;;;;:54;;;;9482:49;;9426:54;;-1:-1:-1;9482:49:0;-1:-1:-1;;8166:1374:0;;;;;;:::o;20661:947::-;5576:9;;5589:1;5576:14;5568:23;;;;;;5614:1;5602:9;:13;;;;20749:6:::1;20734:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;20776:10:0::1;20766:21;::::0;;;:9:::1;:21;::::0;;;;:31;;20791:6;;20766:21;:31:::1;::::0;20791:6;;20766:31:::1;:::i;:::-;::::0;;;-1:-1:-1;20808:40:0::1;::::0;-1:-1:-1;20822:5:0::1;20829:10;20841:6:::0;20808:13:::1;:40::i;:::-;20865:11:::0;;20861:255:::1;;20921:10;20912:20;::::0;;;:8:::1;:20;::::0;;;;;20901:31;::::1;20893:40;;;::::0;::::1;;20957:10;20971:1;20948:20:::0;;;:8:::1;:20;::::0;;;;;:24;;;;20987:54;-1:-1:-1;;;20987:54:0;;::::1;::::0;::::1;7337:25:1::0;;;7378:18;;;7371:60;;;;-1:-1:-1;;;;;20993:5:0::1;20987:33;::::0;::::1;::::0;7310:18:1;;20987:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20861:255;;;-1:-1:-1::0;21093:10:0::1;21084:20;::::0;;;:8:::1;:20;::::0;;;;;20861:255:::1;21167:10;21128:20;21151:27:::0;;;:15:::1;:27;::::0;;;;;21189:13:::1;:32:::0;;21151:27;;;;21189:32:::1;::::0;21151:27;;21189:32:::1;:::i;:::-;::::0;;;-1:-1:-1;21250:26:0::1;::::0;-1:-1:-1;21265:10:0::1;21250:14;:26::i;:::-;21303:10;21287:27;::::0;;;:15:::1;:27;::::0;;;;:45;;;21343:13:::1;:32:::0;;21232:44;;-1:-1:-1;21232:44:0;;21343:13;;21287:27;21343:32:::1;::::0;21232:44;;21343:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;21405:10:0::1;21417:27;::::0;;;:15:::1;:27;::::0;;;;;21388:57:::1;::::0;21405:10;21388:16:::1;:57::i;:::-;21456:24;:22;:24::i;:::-;21493:54;::::0;-1:-1:-1;;;21493:54:0;;::::1;::::0;::::1;7644:25:1::0;;;21528:10:0::1;7685:18:1::0;;;7678:60;7754:18;;;7747:34;;;21499:5:0::1;-1:-1:-1::0;;;;;21493:25:0::1;::::0;::::1;::::0;7617:18:1;;21493:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;21563:37:0::1;::::0;;783:25:1;;;839:2;824:18;;817:34;;;21572:10:0::1;::::0;-1:-1:-1;21563:37:0::1;::::0;-1:-1:-1;756:18:1;21563:37:0::1;609:248:1::0;174:98:0;226:4;255:1;250;:6;;:14;;263:1;250:14;;;-1:-1:-1;259:1:0;;243:21;-1:-1:-1;174:98:0:o;16004:1629::-;-1:-1:-1;;;;;16114:21:0;;16068:4;16114:21;;;:14;:21;;;;;;;;;16160:20;:27;;;;;;16204:20;;16068:4;;16114:21;16160:27;16200:90;;16254:6;16262:15;;-1:-1:-1;16004:1629:0;-1:-1:-1;;16004:1629:0:o;16200:90::-;-1:-1:-1;;;;;16306:17:0;;;;;;:10;:17;;;;;;16302:87;;16353:6;16361:15;;-1:-1:-1;16004:1629:0;-1:-1:-1;;;16004:1629:0:o;16302:87::-;16401:16;16420:36;16440:15;16420:19;:36::i;:::-;16401:55;;16467:14;16505:1;16484:20;;:22;;;;:::i;:::-;16467:39;-1:-1:-1;16549:1:0;16523:23;16535:11;16467:39;16523:23;:::i;:::-;:27;16519:633;;;16581:11;16567:574;16598:11;16608:1;16598:9;:11;:::i;:::-;16594:1;:15;16567:574;;;16635:27;16665:20;;;:17;:20;;;;;;;;;16635:50;;;;;;;;;;;;;;;;;;;;;16708:14;16704:422;;16747:27;16777:17;16747:27;16795:3;:1;16797;16795:3;:::i;:::-;16777:22;;;;;;;;;;;16747:52;;;;;;;;;;;;;;;;;;;;;;;;;;;16823:12;16837:13;16854:85;16874:5;16881:3;:13;;;16896:3;:13;;;16911:3;:10;;;16923:15;16854:19;:85::i;:::-;16822:117;;-1:-1:-1;16822:117:0;-1:-1:-1;16962:17:0;16822:117;16962:17;;:::i;:::-;;;17002:55;17033:5;17040:6;17048:8;17002:30;:55::i;:::-;17098:8;-1:-1:-1;;;16704:422:0;-1:-1:-1;16611:3:0;;;;:::i;:::-;;;;16567:574;;;;16519:633;17164:26;17193:28;;;:17;:28;;;;;;;;;17164:57;;;;;;;;;;;;;;;;;;;;;17236:13;17232:349;;17267:12;17284:128;17304:5;17311:31;17336:5;17311:24;:31::i;:::-;17353:12;;17344:39;;17367:15;17344:8;:39::i;:::-;17385:2;:9;;;17396:15;17284:19;:128::i;:::-;-1:-1:-1;17266:146:0;-1:-1:-1;17427:17:0;17266:146;17427:17;;:::i;:::-;;;17459:62;17490:5;17497:6;17505:15;17459:30;:62::i;:::-;17554:15;17536:33;;17251:330;17232:349;-1:-1:-1;17601:6:0;;17609:15;;-1:-1:-1;16004:1629:0;;-1:-1:-1;;;;16004:1629:0:o;23143:326::-;23256:1;23236:5;-1:-1:-1;;;;;23236:17:0;;:21;23228:30;;;;;;23325:58;;;-1:-1:-1;;;;;7984:32:1;;;23325:58:0;;;7966:51:1;8033:18;;;;8026:34;;;23325:58:0;;;;;;;;;;7939:18:1;;;;23325:58:0;;;;;;;-1:-1:-1;;;;;23325:58:0;-1:-1:-1;;;23325:58:0;;;23314:70;;-1:-1:-1;;;;23314:10:0;;;;:70;;23325:58;23314:70;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23269:115;;;;23403:7;:57;;;;-1:-1:-1;23415:11:0;;:16;;:44;;;23446:4;23435:24;;;;;;;;;;;;:::i;:::-;23395:66;;;;;;23217:252;;23143:326;;;:::o;9548:521::-;-1:-1:-1;;;;;9690:23:0;;9625:15;9690:23;;;:14;:23;;;;;;9643:15;;9730:17;;;;;:84;;-1:-1:-1;;;;;;9751:20:0;;;;;;:11;:20;;;;;9804:10;;9772:17;9788:1;9772:13;:17;:::i;:::-;9751:39;;;;;;;;;;;:49;;;:63;9730:84;9726:336;;;-1:-1:-1;;;;;9831:20:0;;;;;;:11;:20;;;;;9883:7;;9852:17;9868:1;9852:13;:17;:::i;:::-;9831:39;;;;;;;;;;;-1:-1:-1;9831:39:0;:49;;:59;9726:336;;;9961:31;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9923:20:0;;-1:-1:-1;9923:20:0;;;:11;:20;;;;;:35;;;;;;;;;:69;;;;;;;;;;;10033:17;;9944:13;;10033:17;:::i;:::-;-1:-1:-1;;;;;10007:23:0;;;;;;:14;:23;;;;;:43;9726:336;9614:455;;9548:521;;:::o;10664:498::-;10739:20;;10788:15;10820:17;;;;;:81;;-1:-1:-1;10891:10:0;10841:17;:36;10859:17;10875:1;10859:13;:17;:::i;:::-;10841:36;;;;;;;;;;;:46;;;:60;10820:81;10816:339;;;10964:13;;10918:17;:36;10952:1;10936:13;:17;;;;:::i;:::-;10918:36;;;;;;;;;;;-1:-1:-1;10918:36:0;:43;;:59;20473:180;20435:218;:::o;10816:339::-;11045:43;;;;;;;;;;;11074:13;;;11045:43;;;;;;;-1:-1:-1;11010:32:0;;;:17;:32;;;;;;;:78;;;;;;;;;;11126:17;;11028:13;;11126:17;:::i;:::-;11103:20;:40;10707:455;;10664:498::o;14454:1135::-;-1:-1:-1;;;;;14577:21:0;;14531:4;14577:21;;;:14;:21;;;;;;;;;14623:20;:27;;;;;;14667:20;;14531:4;;14577:21;14623:27;14663:90;;14717:6;-1:-1:-1;14725:15:0;-1:-1:-1;14709:32:0;;14663:90;-1:-1:-1;;;;;14769:17:0;;;;;;:10;:17;;;;;;14765:87;;14816:6;-1:-1:-1;14824:15:0;;-1:-1:-1;14808:32:0;;-1:-1:-1;14808:32:0;14765:87;14864:16;14883:36;14903:15;14883:19;:36::i;:::-;14864:55;;14930:14;14947:41;14977:1;14956:20;;:22;;;;:::i;:::-;14980:7;14947:8;:41::i;:::-;14930:58;-1:-1:-1;15015:11:0;15001:536;15032:9;15028:1;:13;15001:536;;;15063:27;15093:20;;;:17;:20;;;;;;;;;15063:50;;;;;;;;;;;;;;;;;;;;;15132:14;15128:398;;15167:27;15197:17;15167:27;15215:3;:1;15217;15215:3;:::i;:::-;15197:22;;;;;;;;;;;15167:52;;;;;;;;;;;;;;;;;;;;;;;;;;;15239:12;15253:13;15270:85;15290:5;15297:3;:13;;;15312:3;:13;;;15327:3;:10;;;15339:15;15270:19;:85::i;:::-;15238:117;;-1:-1:-1;15238:117:0;-1:-1:-1;15374:17:0;15238:117;15374:17;;:::i;:::-;;;15410:55;15441:5;15448:6;15456:8;15410:30;:55::i;:::-;15502:8;-1:-1:-1;;;15128:398:0;-1:-1:-1;15043:3:0;;;;:::i;:::-;;;;15001:536;;;-1:-1:-1;15557:6:0;;15565:15;;-1:-1:-1;14454:1135:0;;-1:-1:-1;;;;;14454:1135:0:o;278:97::-;330:4;358:1;354;:5;:13;;366:1;354:13;;10077:579;-1:-1:-1;;;;;10202:35:0;;10181:18;10202:35;;;:28;:35;;;;;;10254:17;;;;;:95;;-1:-1:-1;;;;;;10275:32:0;;;;;;:25;:32;;;;;10340:9;;10308:17;10324:1;10308:13;:17;:::i;:::-;10275:51;;;;;;;;;;;:61;;;:74;10254:95;10250:399;;;-1:-1:-1;;;;;10366:32:0;;;;;;:25;:32;;;;;10435:6;;10399:17;10415:1;10399:13;:17;:::i;10250:399::-;10524:43;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10474:32:0;;-1:-1:-1;10474:32:0;;;:25;:32;;;;;:47;;;;;;;;;:93;;;;;;;;;;;10620:17;;10507:13;;10620:17;:::i;:::-;-1:-1:-1;;;;;10582:35:0;;;;;;:28;:35;;;;;:55;10170:486;10077:579;;;:::o;23477:354::-;23608:1;23588:5;-1:-1:-1;;;;;23588:17:0;;:21;23580:30;;;;;;23677:68;;;-1:-1:-1;;;;;8760:15:1;;;23677:68:0;;;8742:34:1;8812:15;;;8792:18;;;8785:43;8844:18;;;;8837:34;;;23677:68:0;;;;;;;;;;8677:18:1;;;;23677:68:0;;;;;;;-1:-1:-1;;;;;23677:68:0;-1:-1:-1;;;23677:68:0;;;23666:80;;-1:-1:-1;;;;23666:10:0;;;;:80;;23677:68;23666:80;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23621:125;;;;23765:7;:57;;;;-1:-1:-1;23777:11:0;;:16;;:44;;;23808:4;23797:24;;;;;;;;;;;;:::i;:::-;23757:66;;;;;;23569:262;;23477:354;;;;:::o;15597:399::-;15732:4;15738;15755:12;15770:36;15779:10;15791:14;15770:8;:36::i;:::-;-1:-1:-1;;;;;15939:17:0;;;;;;:10;:17;;;;;;15755:51;;-1:-1:-1;15971:6:0;;2514:8;;15868:67;15877:36;15886:10;15898:14;15877:8;:36::i;:::-;-1:-1:-1;;;;;15915:19:0;;;;;;:12;:19;;;;;;15868:8;:67::i;:::-;-1:-1:-1;;;;;15845:19:0;;;;;;:12;:19;;;;;;15827:38;;15836:7;;15827:8;:38::i;:::-;:108;;;;:::i;:::-;15826:130;;;;:::i;:::-;:142;;;;:::i;:::-;:151;;;;:::i;:::-;15817:171;15980:7;;-1:-1:-1;15597:399:0;-1:-1:-1;;;;;;15597:399:0:o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:315::-;357:6;365;418:2;406:9;397:7;393:23;389:32;386:52;;;434:1;431;424:12;386:52;473:9;460:23;492:31;517:5;492:31;:::i;:::-;542:5;594:2;579:18;;;;566:32;;-1:-1:-1;;;289:315:1:o;1044:388::-;1112:6;1120;1173:2;1161:9;1152:7;1148:23;1144:32;1141:52;;;1189:1;1186;1179:12;1141:52;1228:9;1215:23;1247:31;1272:5;1247:31;:::i;:::-;1297:5;-1:-1:-1;1354:2:1;1339:18;;1326:32;1367:33;1326:32;1367:33;:::i;:::-;1419:7;1409:17;;;1044:388;;;;;:::o;1437:247::-;1496:6;1549:2;1537:9;1528:7;1524:23;1520:32;1517:52;;;1565:1;1562;1555:12;1517:52;1604:9;1591:23;1623:31;1648:5;1623:31;:::i;1689:180::-;1748:6;1801:2;1789:9;1780:7;1776:23;1772:32;1769:52;;;1817:1;1814;1807:12;1769:52;-1:-1:-1;1840:23:1;;1689:180;-1:-1:-1;1689:180:1:o;1874:127::-;1935:10;1930:3;1926:20;1923:1;1916:31;1966:4;1963:1;1956:15;1990:4;1987:1;1980:15;2006:1256;2099:6;2107;2160:2;2148:9;2139:7;2135:23;2131:32;2128:52;;;2176:1;2173;2166:12;2128:52;2215:9;2202:23;2234:31;2259:5;2234:31;:::i;:::-;2284:5;-1:-1:-1;2308:2:1;2346:18;;;2333:32;2384:18;2414:14;;;2411:34;;;2441:1;2438;2431:12;2411:34;2479:6;2468:9;2464:22;2454:32;;2524:7;2517:4;2513:2;2509:13;2505:27;2495:55;;2546:1;2543;2536:12;2495:55;2582:2;2569:16;2604:2;2600;2597:10;2594:36;;;2610:18;;:::i;:::-;2656:2;2653:1;2649:10;2688:2;2682:9;2751:2;2747:7;2742:2;2738;2734:11;2730:25;2722:6;2718:38;2806:6;2794:10;2791:22;2786:2;2774:10;2771:18;2768:46;2765:72;;;2817:18;;:::i;:::-;2853:2;2846:22;2903:18;;;2937:15;;;;-1:-1:-1;2979:11:1;;;2975:20;;;3007:19;;;3004:39;;;3039:1;3036;3029:12;3004:39;3063:11;;;;3083:148;3099:6;3094:3;3091:15;3083:148;;;3165:23;3184:3;3165:23;:::i;:::-;3153:36;;3116:12;;;;3209;;;;3083:148;;;3250:6;3240:16;;;;;;;;2006:1256;;;;;:::o;3667:248::-;3735:6;3743;3796:2;3784:9;3775:7;3771:23;3767:32;3764:52;;;3812:1;3809;3802:12;3764:52;-1:-1:-1;;3835:23:1;;;3905:2;3890:18;;;3877:32;;-1:-1:-1;3667:248:1:o;3920:127::-;3981:10;3976:3;3972:20;3969:1;3962:31;4012:4;4009:1;4002:15;4036:4;4033:1;4026:15;4052:125;4092:4;4120:1;4117;4114:8;4111:34;;;4125:18;;:::i;:::-;-1:-1:-1;4162:9:1;;4052:125::o;4182:217::-;4222:1;4248;4238:132;;4292:10;4287:3;4283:20;4280:1;4273:31;4327:4;4324:1;4317:15;4355:4;4352:1;4345:15;4238:132;-1:-1:-1;4384:9:1;;4182:217::o;4404:128::-;4444:3;4475:1;4471:6;4468:1;4465:13;4462:39;;;4481:18;;:::i;:::-;-1:-1:-1;4517:9:1;;4404:128::o;4537:168::-;4577:7;4643:1;4639;4635:6;4631:14;4628:1;4625:21;4620:1;4613:9;4606:17;4602:45;4599:71;;;4650:18;;:::i;:::-;-1:-1:-1;4690:9:1;;4537:168::o;4710:135::-;4749:3;-1:-1:-1;;4770:17:1;;4767:43;;;4790:18;;:::i;:::-;-1:-1:-1;4837:1:1;4826:13;;4710:135::o;4850:127::-;4911:10;4906:3;4902:20;4899:1;4892:31;4942:4;4939:1;4932:15;4966:4;4963:1;4956:15;4982:277;5049:6;5102:2;5090:9;5081:7;5077:23;5073:32;5070:52;;;5118:1;5115;5108:12;5070:52;5150:9;5144:16;5203:5;5196:13;5189:21;5182:5;5179:32;5169:60;;5225:1;5222;5215:12;5264:184;5334:6;5387:2;5375:9;5366:7;5362:23;5358:32;5355:52;;;5403:1;5400;5393:12;5355:52;-1:-1:-1;5426:16:1;;5264:184;-1:-1:-1;5264:184:1:o;6503:251::-;6573:6;6626:2;6614:9;6605:7;6601:23;6597:32;6594:52;;;6642:1;6639;6632:12;6594:52;6674:9;6668:16;6693:31;6718:5;6693:31;:::i;8071:426::-;8200:3;8238:6;8232:13;8263:1;8273:129;8287:6;8284:1;8281:13;8273:129;;;8385:4;8369:14;;;8365:25;;8359:32;8346:11;;;8339:53;8302:12;8273:129;;;8420:6;8417:1;8414:13;8411:48;;;8455:1;8446:6;8441:3;8437:16;8430:27;8411:48;-1:-1:-1;8475:16:1;;;;;8071:426;-1:-1:-1;;8071:426:1:o

Swarm Source

ipfs://c9dcef713f48dff7240004c45662d3386670b2b56439f644083cb991c5c5cdbd

Block Transaction Difficulty 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
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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