ETH Price: $3,489.07 (+1.56%)

Contract

0x1E887E7115321B4ee5d58DD446eC09e12B45d81B
 
Transaction Hash
Method
Block
From
To
POOL1_harvest182950302023-10-07 0:27:47440 days ago1696638467IN
Gains Farm: Farm V2
0 ETH0.000871517.47387344
POOL2_unstake179621192023-08-21 9:09:35487 days ago1692608975IN
Gains Farm: Farm V2
0 ETH0.0014026815.97587709
POOL2_harvest179621142023-08-21 9:08:35487 days ago1692608915IN
Gains Farm: Farm V2
0 ETH0.001554415.68825154
POOL1_unstake178793182023-08-09 19:06:23499 days ago1691607983IN
Gains Farm: Farm V2
0 ETH0.0007874232.92305986
POOL1_unstake178793172023-08-09 19:06:11499 days ago1691607971IN
Gains Farm: Farm V2
0 ETH0.0054495232.05450617
POOL1_harvest174927202023-06-16 13:33:35553 days ago1686922415IN
Gains Farm: Farm V2
0 ETH0.0022300219.12415433
POOL1_unstake157423132022-10-13 22:56:59798 days ago1665701819IN
Gains Farm: Farm V2
0 ETH0.0038644919.04488944
POOL1_unstake152362212022-07-29 8:14:19875 days ago1659082459IN
Gains Farm: Farm V2
0 ETH0.0023970411.73893633
Set_GOVERNANCE146442072022-04-24 0:14:10971 days ago1650759250IN
Gains Farm: Farm V2
0 ETH0.000570121.1486679
POOL1_unstake145993332022-04-16 23:34:58978 days ago1650152098IN
Gains Farm: Farm V2
0 ETH0.002736317.06745823
POOL1_harvest144528642022-03-25 2:58:071001 days ago1648177087IN
Gains Farm: Farm V2
0 ETH0.0081643355.56877362
POOL1_harvest144528612022-03-25 2:57:401001 days ago1648177060IN
Gains Farm: Farm V2
0 ETH0.0090971561.91782215
POOL1_harvest144528512022-03-25 2:54:561001 days ago1648176896IN
Gains Farm: Farm V2
0 ETH0.0057199638.9316993
POOL1_unstake144283752022-03-21 7:28:211005 days ago1647847701IN
Gains Farm: Farm V2
0 ETH0.0027689515.31266044
POOL1_harvest144244432022-03-20 16:56:371006 days ago1647795397IN
Gains Farm: Farm V2
0 ETH0.0048037830.6939329
POOL1_harvest144211482022-03-20 4:38:591006 days ago1647751139IN
Gains Farm: Farm V2
0 ETH0.0025024816.33709939
POOL1_unstake141715692022-02-09 11:08:291045 days ago1644404909IN
Gains Farm: Farm V2
0 ETH0.0089328947.74193173
POOL1_unstake141042782022-01-30 1:56:221055 days ago1643507782IN
Gains Farm: Farm V2
0 ETH0.0024381
POOL1_unstake141034192022-01-29 22:38:381055 days ago1643495918IN
Gains Farm: Farm V2
0 ETH0.002480
POOL1_unstake140762282022-01-25 18:03:271060 days ago1643133807IN
Gains Farm: Farm V2
0 ETH0.03612241168.97084949
POOL1_unstake140331252022-01-19 1:46:131066 days ago1642556773IN
Gains Farm: Farm V2
0 ETH0.0173173777.09495622
POOL1_unstake140146602022-01-16 5:42:071069 days ago1642311727IN
Gains Farm: Farm V2
0 ETH0.01621658105.23210555
POOL1_unstake139986102022-01-13 17:54:061072 days ago1642096446IN
Gains Farm: Farm V2
0 ETH0.03704588193.06900201
POOL1_harvest139689692022-01-09 3:45:061076 days ago1641699906IN
Gains Farm: Farm V2
0 ETH0.0144529198.37069529
POOL1_harvest139689432022-01-09 3:39:121076 days ago1641699552IN
Gains Farm: Farm V2
0 ETH0.01937136131.84708174
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
179621192023-08-21 9:09:35487 days ago1692608975
Gains Farm: Farm V2
0.037 ETH
117347402021-01-27 0:52:561423 days ago1611708776
Gains Farm: Farm V2
0.03 ETH
117120132021-01-23 13:07:381427 days ago1611407258
Gains Farm: Farm V2
1 ETH
117115502021-01-23 11:32:251427 days ago1611401545
Gains Farm: Farm V2
1 ETH
117114782021-01-23 11:16:501427 days ago1611400610
Gains Farm: Farm V2
1 ETH
117094352021-01-23 3:45:221427 days ago1611373522
Gains Farm: Farm V2
0.001 ETH
117080172021-01-22 22:27:221427 days ago1611354442
Gains Farm: Farm V2
35 ETH
117039112021-01-22 7:19:091428 days ago1611299949
Gains Farm: Farm V2
4.5 ETH
117029602021-01-22 3:43:081428 days ago1611286988
Gains Farm: Farm V2
0.5 ETH
116998722021-01-21 16:22:061429 days ago1611246126
Gains Farm: Farm V2
1 ETH
116979172021-01-21 9:19:261429 days ago1611220766
Gains Farm: Farm V2
2 ETH
116974802021-01-21 7:40:591429 days ago1611214859
Gains Farm: Farm V2
1 ETH
116958122021-01-21 1:18:361429 days ago1611191916
Gains Farm: Farm V2
0.21 ETH
116956522021-01-21 0:42:271429 days ago1611189747
Gains Farm: Farm V2
0.1 ETH
116956052021-01-21 0:30:511429 days ago1611189051
Gains Farm: Farm V2
1.5 ETH
116950252021-01-20 22:13:271429 days ago1611180807
Gains Farm: Farm V2
0.5 ETH
116946702021-01-20 20:59:121429 days ago1611176352
Gains Farm: Farm V2
14 ETH
116942522021-01-20 19:23:481430 days ago1611170628
Gains Farm: Farm V2
0.5 ETH
116941142021-01-20 18:52:011430 days ago1611168721
Gains Farm: Farm V2
0.1 ETH
116937992021-01-20 17:51:321430 days ago1611165092
Gains Farm: Farm V2
8.5 ETH
116937582021-01-20 17:44:451430 days ago1611164685
Gains Farm: Farm V2
201 ETH
116936892021-01-20 17:32:181430 days ago1611163938
Gains Farm: Farm V2
0.25 ETH
116936232021-01-20 17:19:261430 days ago1611163166
Gains Farm: Farm V2
1 ETH
116935332021-01-20 16:58:101430 days ago1611161890
Gains Farm: Farm V2
0.5 ETH
116928602021-01-20 14:33:101430 days ago1611153190
Gains Farm: Farm V2
0.4 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GFarm

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-15
*/

// File: contracts\GFarmTokenInterface.sol

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

interface GFarmTokenInterface{
	function balanceOf(address account) external view returns (uint256);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function burn(address from, uint256 amount) external;
    function mint(address to, uint256 amount) external;
}

// File: @openzeppelin\contracts\math\SafeMath.sol

pragma solidity ^0.7.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @uniswap\v2-core\contracts\interfaces\IUniswapV2Pair.sol

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: contracts\GFarm.sol

pragma solidity 0.7.5;




contract GFarm {

    using SafeMath for uint;

    // VARIABLES & CONSTANTS

    // 1. Tokens
    GFarmTokenInterface public token;
    IUniswapV2Pair public lp;
    address public nft;

    // 2. Pool 1
    uint public POOL1_MULTIPLIER; // 1e18
    uint public POOL1_MULTIPLIER_UPDATED;
    uint public constant POOL1_MULTIPLIER_UPDATE_EVERY = 45000; // 1 week (blocks)
    uint public POOL1_lastRewardBlock;
    uint public POOL1_accTokensPerLP; // 1e18
    uint public constant POOL1_REFERRAL_P = 6; // % 2 == 0
    uint public constant POOL1_CREDITS_MIN_P = 1;

    // 3. Pool 2
    uint public immutable POOL2_MULTIPLIER; // 1e18
    uint public constant POOL2_DURATION = 32000; // 5 days
    uint public immutable POOL2_END;
    uint public POOL2_lastRewardBlock;
    uint public POOL2_accTokensPerETH; // 1e18

    // 4. Pool 1 & Pool 2
    uint public immutable POOLS_START;
    uint public constant POOLS_START_DELAY = 1775;
    uint public constant PRECISION = 1e5;

    // 5. Useful Uniswap addresses (for TVL & APY)
    address constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    IUniswapV2Pair constant ETH_USDC_PAIR = IUniswapV2Pair(0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc);

    // 6. Governance & dev fund
    address public GOVERNANCE;
    address public immutable DEV_FUND;
    uint constant GOVERNANCE_P = 500000; // PRECISION
    uint constant DEV_FUND_P = 500000; // PRECISION

    // 7. Info about each user
    struct User {
        uint POOL1_provided;
        uint POOL1_rewardDebt;
        address POOL1_referral;
        uint POOL1_referralReward;

        uint POOL2_provided;
        uint POOL2_rewardDebt;

        uint NFT_CREDITS_amount;
        uint NFT_CREDITS_lastUpdated;
        bool NFT_CREDITS_receiving;
    }
    mapping(address => User) public users;

    constructor(address _GOV, address _DEV){
        // Distribution = 7500 * (3/4)^(n-1) (n = week)
        POOL1_MULTIPLIER = uint(7500 * 1e18) / 45000;
        POOL1_MULTIPLIER_UPDATED = block.number.add(POOLS_START_DELAY);

        POOL2_MULTIPLIER = POOL1_MULTIPLIER.div(10);
        POOL2_END = block.number.add(POOLS_START_DELAY)
                    .add(POOL2_DURATION);

        POOLS_START = block.number.add(POOLS_START_DELAY);

        GOVERNANCE = _GOV;
        DEV_FUND = _DEV;
    }

    // GOVERNANCE

    // 0. Modifier
    modifier onlyGov(){
        require(msg.sender == GOVERNANCE);
        _;
    }

    // 1. Update governance address
    function set_GOVERNANCE(address _gov) external onlyGov{
        GOVERNANCE = _gov;
    }

    // 2. Set token address
    function set_TOKEN(address _token) external onlyGov{
        require(token == GFarmTokenInterface(0), "Token address already set");
        token = GFarmTokenInterface(_token);
    }

    // 3. Set lp address
    function set_LP(address _lp) external onlyGov{
        require(lp == IUniswapV2Pair(0), "LP address already set");
        lp = IUniswapV2Pair(_lp);
    }

    // 4. Set token address
    function set_NFT(address _nft) external onlyGov{
        require(nft == address(0), "NFT address already set");
        nft = _nft;
    }

    // POOL REWARDS BETWEEN 2 BLOCKS

    // 1. Pool 1 (1e18)
    function POOL1_getReward(uint _from, uint _to) private view returns (uint){
        uint blocks;

        if(_from >= POOLS_START && _to >= POOLS_START){
            blocks = _to.sub(_from);
        }

        return blocks.mul(POOL1_MULTIPLIER);
    }

    // 2. Pool 2 (1e18)
    function POOL2_getReward(uint _from, uint _to) private view returns (uint){
        uint blocks;

        if(_from >= POOLS_START && _to >= POOLS_START){
            // Before pool 2 has ended
            if(_from <= POOL2_END && _to <= POOL2_END){
                blocks = _to.sub(_from);
            // Between before and after pool 2 has ended
            }else if(_from <= POOL2_END && _to > POOL2_END){
                blocks = POOL2_END.sub(_from);
            // After pool 2 has ended
            }else if(_from > POOL2_END && _to > POOL2_END){
                blocks = 0;
            }
        }

        return blocks.mul(POOL2_MULTIPLIER);
    }

    // UPDATE POOL VARIABLES

    // 1. Pool 1
    function POOL1_update() private {
        uint lpSupply = lp.balanceOf(address(this));

        if (POOL1_lastRewardBlock == 0 || lpSupply == 0) {
            POOL1_lastRewardBlock = block.number;
            return;
        }

        uint reward = POOL1_getReward(POOL1_lastRewardBlock, block.number);
        
        token.mint(address(this), reward);
        token.mint(GOVERNANCE, reward.mul(GOVERNANCE_P).div(100*PRECISION));
        token.mint(DEV_FUND, reward.mul(DEV_FUND_P).div(100*PRECISION));

        POOL1_accTokensPerLP = POOL1_accTokensPerLP.add(
            reward.mul(1e18).div(lpSupply)
        );
        POOL1_lastRewardBlock = block.number;

        if(block.number >= POOL1_MULTIPLIER_UPDATED.add(POOL1_MULTIPLIER_UPDATE_EVERY)){
            POOL1_MULTIPLIER = POOL1_MULTIPLIER.mul(3).div(4);
            POOL1_MULTIPLIER_UPDATED = block.number;
        }
    }   

    // 2. Pool 2
    function POOL2_update(uint ethJustStaked) private {
        // ETH balance is updated before the rest of the code
        uint ethSupply = address(this).balance.sub(ethJustStaked);

        if (POOL2_lastRewardBlock == 0 || ethSupply == 0) {
            POOL2_lastRewardBlock = block.number;
            return;
        }

        uint reward = POOL2_getReward(POOL2_lastRewardBlock, block.number);
        
        token.mint(address(this), reward);
        token.mint(GOVERNANCE, reward.mul(GOVERNANCE_P).div(100*PRECISION));
        token.mint(DEV_FUND, reward.mul(DEV_FUND_P).div(100*PRECISION));

        POOL2_accTokensPerETH = POOL2_accTokensPerETH.add(reward.mul(1e18).div(ethSupply));
        POOL2_lastRewardBlock = block.number;
    }

    // PENDING REWARD

    // 1. Pool 1 external (1e18)
    function POOL1_pendingReward() external view returns(uint){
        return _POOL1_pendingReward(users[msg.sender]);
    }

    // 2. Pool 1 private (1e18)
    function _POOL1_pendingReward(User memory u) private view returns(uint){
        uint _POOL1_accTokensPerLP = POOL1_accTokensPerLP;
        uint lpSupply = lp.balanceOf(address(this));

        if (block.number > POOL1_lastRewardBlock && lpSupply != 0) {
            uint pendingReward = POOL1_getReward(POOL1_lastRewardBlock, block.number);
            _POOL1_accTokensPerLP = _POOL1_accTokensPerLP.add(
                pendingReward.mul(1e18).div(lpSupply)
            );
        }

        return u.POOL1_provided.mul(_POOL1_accTokensPerLP).div(1e18)
                .sub(u.POOL1_rewardDebt);
    }

    // 3. Pool 2 external (1e18)
    function POOL2_pendingReward() external view returns(uint){
        return _POOL2_pendingReward(users[msg.sender], 0);
    }
    
    // 4. Pool 2 private (1e18)
    function _POOL2_pendingReward(User memory u, uint ethJustStaked) private view returns(uint){
        uint _POOL2_accTokensPerETH = POOL2_accTokensPerETH;
        // ETH balance is updated before the rest of the code
        uint ethSupply = address(this).balance.sub(ethJustStaked);

        if (block.number > POOL2_lastRewardBlock && ethSupply != 0) {
            uint pendingReward = POOL2_getReward(POOL2_lastRewardBlock, block.number);
            _POOL2_accTokensPerETH = _POOL2_accTokensPerETH.add(
                pendingReward.mul(1e18).div(ethSupply)
            );
        }

        return u.POOL2_provided.mul(_POOL2_accTokensPerETH).div(1e18)
            .sub(u.POOL2_rewardDebt);
    }

    // HARVEST REWARDS

    // 1. Pool 1 external
    function POOL1_harvest() external{
        require(block.number >= POOLS_START, "Pool hasn't started yet.");
        _POOL1_harvest(msg.sender);
    }

    // 2. Pool 1 private
    function _POOL1_harvest(address a) private{
        User storage u = users[a];
        uint pending = _POOL1_pendingReward(u);
        POOL1_update();

        if(pending > 0){
            if(u.POOL1_referral == address(0)){
                POOLS_safeTokenTransfer(a, pending);
                token.burn(a, pending.mul(POOL1_REFERRAL_P).div(100));
            }else{
                uint referralReward = pending.mul(POOL1_REFERRAL_P.div(2)).div(100);
                uint userReward = pending.sub(referralReward);

                POOLS_safeTokenTransfer(a, userReward);
                POOLS_safeTokenTransfer(u.POOL1_referral, referralReward);

                User storage referralUser = users[u.POOL1_referral];
                referralUser.POOL1_referralReward = referralUser.POOL1_referralReward
                                                    .add(referralReward);
            }
        }

        u.POOL1_rewardDebt = u.POOL1_provided.mul(POOL1_accTokensPerLP).div(1e18);
    }

    // 3. Pool 2 external
    function POOL2_harvest() external{
        require(block.number >= POOLS_START, "Pool hasn't started yet.");
        _POOL2_harvest(msg.sender, 0);
    }
    
    // 4. Pool 2 private
    function _POOL2_harvest(address a, uint ethJustStaked) private{
        User storage u = users[a];
        uint pending = _POOL2_pendingReward(u, ethJustStaked);
        POOL2_update(ethJustStaked);

        if(pending > 0){
            POOLS_safeTokenTransfer(a, pending);
        }

        u.POOL2_rewardDebt = u.POOL2_provided.mul(POOL2_accTokensPerETH).div(1e18);
    }

    // STAKE

    // 1. Pool 1
    function POOL1_stake(uint amount, address referral) external{
        require(tx.origin == msg.sender, "Contracts not allowed.");
        require(block.number >= POOLS_START, "Pool hasn't started yet.");
        require(amount > 0, "Staking 0 lp.");

        uint lpSupplyBefore = lp.balanceOf(address(this));

        _POOL1_harvest(msg.sender);
        lp.transferFrom(msg.sender, address(this), amount);

        User storage u = users[msg.sender];
        u.POOL1_provided = u.POOL1_provided.add(amount);
        u.POOL1_rewardDebt = u.POOL1_provided.mul(POOL1_accTokensPerLP).div(1e18);

        if(!u.NFT_CREDITS_receiving
            && u.POOL1_provided >= lpSupplyBefore.mul(POOL1_CREDITS_MIN_P).div(100)){
            u.NFT_CREDITS_receiving = true;
            u.NFT_CREDITS_lastUpdated = block.number;
        }

        if(u.POOL1_referral == address(0) && referral != address(0)
            && referral != msg.sender){
            u.POOL1_referral = referral;
        }
    }

    // 2. Pool 2
    function POOL2_stake() payable external{
        require(tx.origin == msg.sender, "Contracts not allowed.");
        require(block.number >= POOLS_START, "Pool hasn't started yet.");
        require(block.number <= POOL2_END, "Pool is finished, no more staking.");
        require(msg.value > 0, "Staking 0 ETH.");

        _POOL2_harvest(msg.sender, msg.value);

        User storage u = users[msg.sender];
        u.POOL2_provided = u.POOL2_provided.add(msg.value);
        u.POOL2_rewardDebt = u.POOL2_provided.mul(POOL2_accTokensPerETH).div(1e18);
    }

    // UNSTAKE

    // 1. Pool 1
    function POOL1_unstake(uint amount) external{
        User storage u = users[msg.sender];
        require(amount > 0, "Unstaking 0 lp.");
        require(u.POOL1_provided >= amount, "Unstaking more than currently staked.");

        _POOL1_harvest(msg.sender);
        lp.transfer(msg.sender, amount);

        u.POOL1_provided = u.POOL1_provided.sub(amount);
        u.POOL1_rewardDebt = u.POOL1_provided.mul(POOL1_accTokensPerLP).div(1e18);

        uint lpSupply = lp.balanceOf(address(this));

        if(u.NFT_CREDITS_receiving
            && u.POOL1_provided < lpSupply.mul(POOL1_CREDITS_MIN_P).div(100)
            || u.NFT_CREDITS_receiving && lpSupply == 0){
            u.NFT_CREDITS_amount = NFT_CREDITS_amount(msg.sender);
            u.NFT_CREDITS_receiving = false;
            u.NFT_CREDITS_lastUpdated = block.number;
        }
    }

    // 2. Pool 2
    function POOL2_unstake(uint amount) external{
        User storage u = users[msg.sender];
        require(amount > 0, "Unstaking 0 ETH.");
        require(u.POOL2_provided >= amount, "Unstaking more than currently staked.");

        _POOL2_harvest(msg.sender, 0);
        msg.sender.transfer(amount);

        u.POOL2_provided = u.POOL2_provided.sub(amount);
        u.POOL2_rewardDebt = u.POOL2_provided.mul(POOL2_accTokensPerETH).div(1e18);
    }

    // NFTs

    // 1. NFT credits of msg.sender
    function NFT_CREDITS_amount(address a) public view returns(uint){
        User memory u = users[a];
        if(u.NFT_CREDITS_receiving){
            return u.NFT_CREDITS_amount.add(block.number.sub(u.NFT_CREDITS_lastUpdated));
        }else{
            return u.NFT_CREDITS_amount;
        }
    }

    // 2. Spend NFT credits when claiming an NFT
    function spendCredits(address a, uint requiredCredits) external{
        require(msg.sender == nft, "Can only called by GFarmNFT.");
        User storage u = users[a];
        u.NFT_CREDITS_amount = NFT_CREDITS_amount(a).sub(requiredCredits);
        u.NFT_CREDITS_lastUpdated = block.number;
    }

    // PREVENT ROUNDING ERRORS

    function POOLS_safeTokenTransfer(address _to, uint _amount) private {
        uint bal = token.balanceOf(address(this));
        if (_amount > bal) {
            token.transfer(_to, bal);
        } else {
            token.transfer(_to, _amount);
        }
    }

    // USEFUL PRICING FUNCTIONS (FOR TVL & APY)

    // 1. ETH/USD price (PRECISION)
    function getEthPrice() private view returns(uint){
        (uint112 reserves0, uint112 reserves1, ) = ETH_USDC_PAIR.getReserves();
        uint reserveUSDC;
        uint reserveETH;

        if(WETH == ETH_USDC_PAIR.token0()){
            reserveETH = reserves0;
            reserveUSDC = reserves1;
        }else{
            reserveUSDC = reserves0;
            reserveETH = reserves1;
        }
        // Divide number of USDC by number of ETH
        // we multiply by 1e12 because USDC only has 6 decimals
        return reserveUSDC.mul(1e12).mul(PRECISION).div(reserveETH);
    }
    // 2. GFARM/ETH price (PRECISION)
    function getGFarmPriceEth() private view returns(uint){
        (uint112 reserves0, uint112 reserves1, ) = lp.getReserves();

        uint reserveETH;
        uint reserveGFARM;

        if(WETH == lp.token0()){
            reserveETH = reserves0;
            reserveGFARM = reserves1;
        }else{
            reserveGFARM = reserves0;
            reserveETH = reserves1;
        }

        return reserveETH.mul(PRECISION).div(reserveGFARM);
    }

    // UI VIEW FUNCTIONS (READ-ONLY)
    
    function POOLS_blocksLeftUntilStart() external view returns(uint){
        if(block.number > POOLS_START){ return 0; }
        return POOLS_START.sub(block.number);
    }

    function POOL1_getMultiplier() public view returns (uint) {
        if(block.number < POOLS_START){
            return 0;
        }
        return POOL1_MULTIPLIER;
    }

    function POOL2_getMultiplier() public view returns (uint) {
        if(block.number < POOLS_START || block.number > POOL2_END){
            return 0;
        }
        return POOL2_MULTIPLIER;
    }

    function POOL1_provided() external view returns(uint){
        return users[msg.sender].POOL1_provided;
    }

    function POOL2_provided() external view returns(uint){
        return users[msg.sender].POOL2_provided;
    }

    function POOL1_referralReward() external view returns(uint){
        return users[msg.sender].POOL1_referralReward;
    }

    function POOL2_blocksLeft() external view returns(uint){
        if(block.number > POOL2_END){
            return 0;
        }
        return POOL2_END.sub(block.number);
    }

    function POOL1_referral() external view returns(address){
        return users[msg.sender].POOL1_referral;
    }

    function POOL1_minLpsNftCredits() external view returns(uint){
        return lp.balanceOf(address(this)).mul(POOL1_CREDITS_MIN_P).div(100);
    }

    // (PRECISION)
    function POOL1_tvl() public view returns(uint){
        if(lp.totalSupply() == 0){ return 0; }

        (uint112 reserves0, uint112 reserves1, ) = lp.getReserves();
        uint reserveEth;

        if(WETH == lp.token0()){
            reserveEth = reserves0;
        }else{
            reserveEth = reserves1;
        }

        uint lpPriceEth = reserveEth.mul(1e5).mul(2).div(lp.totalSupply());
        uint lpPriceUsd = lpPriceEth.mul(getEthPrice()).div(1e5);

        return lp.balanceOf(address(this)).mul(lpPriceUsd).div(1e18);
    }

    // (PRECISION)
    function POOL2_tvl() public view returns(uint){
        return address(this).balance.mul(getEthPrice()).div(1e18);
    }

    // (PRECISION)
    function POOLS_tvl() external view returns(uint){
        return POOL1_tvl().add(POOL2_tvl());
    }

    // (PRECISION)
    function POOL1_apy() external view returns(uint){
        if(POOL1_tvl() == 0){ return 0; }
        return POOL1_MULTIPLIER.mul(2336000)
                .mul(getGFarmPriceEth()).mul(getEthPrice())
                .mul(100).div(POOL1_tvl());
    }

    // (PRECISION)
    function POOL2_apy() external view returns(uint){
        if(POOL2_tvl() == 0){ return 0; }
        return POOL2_MULTIPLIER.mul(2336000)
                .mul(getGFarmPriceEth()).mul(getEthPrice())
                .mul(100).div(POOL2_tvl());
    }

    function myNftCredits() external view returns(uint){
        return NFT_CREDITS_amount(msg.sender);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_GOV","type":"address"},{"internalType":"address","name":"_DEV","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DEV_FUND","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOVERNANCE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"NFT_CREDITS_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_CREDITS_MIN_P","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_MULTIPLIER_UPDATED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_MULTIPLIER_UPDATE_EVERY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_REFERRAL_P","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_accTokensPerLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_apy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"POOL1_lastRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_minLpsNftCredits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_provided","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_referral","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL1_referralReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"referral","type":"address"}],"name":"POOL1_stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"POOL1_tvl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"POOL1_unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"POOL2_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL2_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL2_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL2_accTokensPerETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL2_apy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL2_blocksLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL2_getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL2_harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"POOL2_lastRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL2_pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL2_provided","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL2_stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"POOL2_tvl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"POOL2_unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"POOLS_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOLS_START_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOLS_blocksLeftUntilStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOLS_tvl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lp","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"myNftCredits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"set_GOVERNANCE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"set_LP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"}],"name":"set_NFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"set_TOKEN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"},{"internalType":"uint256","name":"requiredCredits","type":"uint256"}],"name":"spendCredits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract GFarmTokenInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"POOL1_provided","type":"uint256"},{"internalType":"uint256","name":"POOL1_rewardDebt","type":"uint256"},{"internalType":"address","name":"POOL1_referral","type":"address"},{"internalType":"uint256","name":"POOL1_referralReward","type":"uint256"},{"internalType":"uint256","name":"POOL2_provided","type":"uint256"},{"internalType":"uint256","name":"POOL2_rewardDebt","type":"uint256"},{"internalType":"uint256","name":"NFT_CREDITS_amount","type":"uint256"},{"internalType":"uint256","name":"NFT_CREDITS_lastUpdated","type":"uint256"},{"internalType":"bool","name":"NFT_CREDITS_receiving","type":"bool"}],"stateMutability":"view","type":"function"}]

6101006040523480156200001257600080fd5b506040516200348138038062003481833981810160405260408110156200003857600080fd5b50805160209091015161afc86901969368974c05b00000046003556200006d436106ef6200011f602090811b62001e6b17901c565b60048190555062000090600a6003546200018160201b62001ece1790919060201c565b608052620000c8617d00620000b4436106ef6200011f602090811b62001e6b17901c565b6200011f60201b62001e6b1790919060201c565b60a052620000e5436106ef6200011f602090811b62001e6b17901c565b60c052600980546001600160a01b0319166001600160a01b03939093169290921790915560601b6001600160601b03191660e05262000272565b6000828201838110156200017a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006200017a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620001cb60201b60201c565b600081836200025b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200021f57818101518382015260200162000205565b50505050905090810190601f1680156200024d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200026857fe5b0495945050505050565b60805160a05160c05160e05160601c61314a6200033760003980611e1f52806129175280612d27525080610cba52806113a65280611426528061144c52806116925280611c295280611cad5280611dc55280611df85280612e2a5280612e555280612fe752806130125250806108e4528061128c52806112bf52806117075280611c525280612e7f5280612eaa5280612ee55280612f105280612f3c5280612f635280612f8d525080610c425280610fe35280611c845280612fbe525061314a6000f3fe6080604052600436106103295760003560e01c806398f17a3b116101a5578063be8682db116100ec578063dae8f1fd11610095578063f34184fa1161006f578063f34184fa1461088e578063fa8aa3d7146108a3578063fc0c546a146108b8578063fc60a096146108cd57610329565b8063dae8f1fd1461084f578063e3beb31414610864578063ea550ad91461087957610329565b8063cd312cc4116100c6578063cd312cc414610810578063cf71d21114610825578063d34d05b91461083a57610329565b8063be8682db146107b3578063c135916f146107c8578063c7b30602146107fb57610329565b8063a87430ba1161014e578063b4af648911610128578063b4af648914610763578063b53e51e114610796578063b568d8a41461079e57610329565b8063a87430ba146106b5578063aaf5eb6814610739578063b082d99c1461074e57610329565b80639d9165231161017f5780639d916523146106585780639f7fd11d1461066d578063a7ae510b1461068257610329565b806398f17a3b14610619578063997f5dac1461062e5780639acd5e831461064357610329565b80634edbbb5d1161027457806360f5a98b1161021d5780638a8cd1e3116101f75780638a8cd1e3146105a75780638b49f078146105bc57806392570992146105d15780639332fddc1461060457610329565b806360f5a98b146105535780637159ffd8146105685780637417f9261461057d57610329565b8063546ae0391161024e578063546ae03914610514578063577b4059146105295780635ee3f1a71461053e57610329565b80634edbbb5d146104b15780634f90ea4a146104c65780635407886c146104ff57610329565b8063313c06a0116102d657806347ccca02116102b057806347ccca021461045457806349263637146104695780634d159df71461049c57610329565b8063313c06a0146104005780633dfe7304146104155780633e2183611461043f57610329565b80632614d4a4116103075780632614d4a41461039b5780632ecf03f6146103d6578063307c7a26146103eb57610329565b8063054b3cfd1461032e57806314627834146103555780631c2f991814610386575b600080fd5b34801561033a57600080fd5b506103436108e2565b60408051918252519081900360200190f35b34801561036157600080fd5b5061036a610906565b604080516001600160a01b039092168252519081900360200190f35b34801561039257600080fd5b50610343610915565b3480156103a757600080fd5b506103d4600480360360408110156103be57600080fd5b506001600160a01b03813516906020013561091b565b005b3480156103e257600080fd5b506103436109b5565b3480156103f757600080fd5b506103436109bb565b34801561040c57600080fd5b5061036a6109dc565b34801561042157600080fd5b506103d46004803603602081101561043857600080fd5b50356109eb565b34801561044b57600080fd5b50610343610b08565b34801561046057600080fd5b5061036a610b0e565b34801561047557600080fd5b506103d46004803603602081101561048c57600080fd5b50356001600160a01b0316610b1d565b3480156104a857600080fd5b50610343610bb4565b3480156104bd57600080fd5b50610343610c40565b3480156104d257600080fd5b506103d4600480360360408110156104e957600080fd5b50803590602001356001600160a01b0316610c64565b34801561050b57600080fd5b50610343610f82565b34801561052057600080fd5b50610343610fa2565b34801561053557600080fd5b50610343611011565b34801561054a57600080fd5b5061034361101c565b34801561055f57600080fd5b50610343611022565b34801561057457600080fd5b5061036a611028565b34801561058957600080fd5b506103d4600480360360208110156105a057600080fd5b5035611047565b3480156105b357600080fd5b50610343611282565b3480156105c857600080fd5b50610343611288565b3480156105dd57600080fd5b506103d4600480360360208110156105f457600080fd5b50356001600160a01b03166112e4565b34801561061057600080fd5b5061034361137b565b34801561062557600080fd5b50610343611391565b34801561063a57600080fd5b506103d46113a4565b34801561064f57600080fd5b50610343611424565b34801561066457600080fd5b50610343611448565b34801561067957600080fd5b50610343611481565b34801561068e57600080fd5b506103d4600480360360208110156106a557600080fd5b50356001600160a01b03166114cd565b3480156106c157600080fd5b506106e8600480360360208110156106d857600080fd5b50356001600160a01b0316611506565b60408051998a5260208a01989098526001600160a01b03909616888801526060880194909452608087019290925260a086015260c085015260e0840152151561010083015251908190036101200190f35b34801561074557600080fd5b5061034361155e565b34801561075a57600080fd5b50610343611565565b34801561076f57600080fd5b506103436004803603602081101561078657600080fd5b50356001600160a01b031661156b565b6103d461163c565b3480156107aa57600080fd5b5061034361180b565b3480156107bf57600080fd5b50610343611896565b3480156107d457600080fd5b506103d4600480360360208110156107eb57600080fd5b50356001600160a01b0316611b8e565b34801561080757600080fd5b50610343611c25565b34801561081c57600080fd5b50610343611ca6565b34801561083157600080fd5b506103d4611cab565b34801561084657600080fd5b50610343611d2b565b34801561085b57600080fd5b50610343611db5565b34801561087057600080fd5b50610343611dbb565b34801561088557600080fd5b50610343611dc1565b34801561089a57600080fd5b5061036a611e1d565b3480156108af57600080fd5b50610343611e41565b3480156108c457600080fd5b5061036a611e57565b3480156108d957600080fd5b50610343611e66565b7f000000000000000000000000000000000000000000000000000000000000000081565b6009546001600160a01b031681565b60055481565b6002546001600160a01b0316331461097a576040805162461bcd60e51b815260206004820152601c60248201527f43616e206f6e6c792063616c6c656420627920474661726d4e46542e00000000604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090206109a58261099f8561156b565b90611f10565b6006820155436007909101555050565b60075481565b60006109d66109c8610f82565b6109d0611896565b90611e6b565b90505b90565b6001546001600160a01b031681565b336000908152600a6020526040902081610a4c576040805162461bcd60e51b815260206004820152601060248201527f556e7374616b696e672030204554482e00000000000000000000000000000000604482015290519081900360640190fd5b8181600401541015610a8f5760405162461bcd60e51b81526004018080602001828103825260258152602001806130ad6025913960400191505060405180910390fd5b610a9a336000611f52565b604051339083156108fc029084906000818181858888f19350505050158015610ac7573d6000803e3d6000fd5b506004810154610ad79083611f10565b60048201819055600854610aff91670de0b6b3a764000091610af9919061202d565b90611ece565b60059091015550565b617d0081565b6002546001600160a01b031681565b6009546001600160a01b03163314610b3457600080fd5b6000546001600160a01b031615610b92576040805162461bcd60e51b815260206004820152601960248201527f546f6b656e206164647265737320616c72656164792073657400000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60018054604080516370a0823160e01b815230600482015290516000936109d693606493610af9936001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c0e57600080fd5b505afa158015610c22573d6000803e3d6000fd5b505050506040513d6020811015610c3857600080fd5b50519061202d565b7f000000000000000000000000000000000000000000000000000000000000000081565b323314610cb8576040805162461bcd60e51b815260206004820152601660248201527f436f6e747261637473206e6f7420616c6c6f7765642e00000000000000000000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000000431015610d2d576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b60008211610d82576040805162461bcd60e51b815260206004820152600d60248201527f5374616b696e672030206c702e00000000000000000000000000000000000000604482015290519081900360640190fd5b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610dcd57600080fd5b505afa158015610de1573d6000803e3d6000fd5b505050506040513d6020811015610df757600080fd5b50519050610e0433612086565b600154604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610e7757600080fd5b505af1158015610e8b573d6000803e3d6000fd5b505050506040513d6020811015610ea157600080fd5b5050336000908152600a602052604090208054610ebe9085611e6b565b808255600654610edc91670de0b6b3a764000091610af9919061202d565b6001820155600881015460ff16158015610f065750610f016064610af984600161202d565b815410155b15610f215760088101805460ff191660011790554360078201555b60028101546001600160a01b0316158015610f4457506001600160a01b03831615155b8015610f5957506001600160a01b0383163314155b15610f7c576002810180546001600160a01b0319166001600160a01b0385161790555b50505050565b60006109d6670de0b6b3a7640000610af9610f9b612268565b479061202d565b6000610fac610f82565b610fb8575060006109d9565b6109d6610fc3610f82565b610af9606461100b610fd3612268565b61100b610fde6123e7565b61100b7f00000000000000000000000000000000000000000000000000000000000000006223a50061202d565b9061202d565b60006109d63361156b565b60035481565b60045481565b336000908152600a60205260409020600201546001600160a01b031690565b336000908152600a60205260409020816110a8576040805162461bcd60e51b815260206004820152600f60248201527f556e7374616b696e672030206c702e0000000000000000000000000000000000604482015290519081900360640190fd5b80548211156110e85760405162461bcd60e51b81526004018080602001828103825260258152602001806130ad6025913960400191505060405180910390fd5b6110f133612086565b6001546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561114557600080fd5b505af1158015611159573d6000803e3d6000fd5b505050506040513d602081101561116f57600080fd5b5050805461117d9083611f10565b80825560065461119b91670de0b6b3a764000091610af9919061202d565b60018083019190915554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111ed57600080fd5b505afa158015611201573d6000803e3d6000fd5b505050506040513d602081101561121757600080fd5b5051600883015490915060ff16801561123f575061123b6064610af983600161202d565b8254105b806112575750600882015460ff168015611257575080155b1561127d576112653361156b565b600683015560088201805460ff191690554360078301555b505050565b61afc881565b60007f00000000000000000000000000000000000000000000000000000000000000004311156112ba575060006109d9565b6109d67f000000000000000000000000000000000000000000000000000000000000000043611f10565b6009546001600160a01b031633146112fb57600080fd5b6002546001600160a01b031615611359576040805162461bcd60e51b815260206004820152601760248201527f4e4654206164647265737320616c726561647920736574000000000000000000604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600a602052604090206003015490565b336000908152600a602052604090205490565b7f0000000000000000000000000000000000000000000000000000000000000000431015611419576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b61142233612086565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000043101561147a575060006109d9565b5060035490565b600061148b611896565b611497575060006109d9565b6109d66114a2611896565b610af9606461100b6114b2612268565b61100b6114bd6123e7565b60035461100b906223a50061202d565b6009546001600160a01b031633146114e457600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600a60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600890980154969795966001600160a01b039095169593949293919290919060ff1689565b620186a081565b6106ef81565b6000611575613055565b506001600160a01b038083166000908152600a6020908152604091829020825161012081018452815481526001820154928101929092526002810154909316918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260089091015460ff161580156101008301526116305761162861161d8260e0015143611f1090919063ffffffff16565b60c083015190611e6b565b915050611637565b60c0015190505b919050565b323314611690576040805162461bcd60e51b815260206004820152601660248201527f436f6e747261637473206e6f7420616c6c6f7765642e00000000000000000000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000000431015611705576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000004311156117645760405162461bcd60e51b81526004018080602001828103825260228152602001806130d26022913960400191505060405180910390fd5b600034116117b9576040805162461bcd60e51b815260206004820152600e60248201527f5374616b696e672030204554482e000000000000000000000000000000000000604482015290519081900360640190fd5b6117c33334611f52565b336000908152600a6020526040902060048101546117e19034611e6b565b6004820181905560085461180391670de0b6b3a764000091610af9919061202d565b600590910155565b336000908152600a602090815260408083208151610120810183528154815260018201549381019390935260028101546001600160a01b0316918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615156101008201526109d6908261254d565b600154604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156118f457600080fd5b505afa158015611908573d6000803e3d6000fd5b505050506040513d602081101561191e57600080fd5b505161192c575060006109d9565b600080600160009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561197d57600080fd5b505afa158015611991573d6000803e3d6000fd5b505050506040513d60608110156119a757600080fd5b50805160209182015160015460408051630dfe168160e01b815290519396509194506000936001600160a01b0390911692630dfe1681926004808201939291829003018186803b1580156119fa57600080fd5b505afa158015611a0e573d6000803e3d6000fd5b505050506040513d6020811015611a2457600080fd5b50516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415611a6157506dffffffffffffffffffffffffffff8216611a74565b506dffffffffffffffffffffffffffff81165b6000611b05600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac757600080fd5b505afa158015611adb573d6000803e3d6000fd5b505050506040513d6020811015611af157600080fd5b5051610af9600261100b86620186a061202d565b90506000611b22620186a0610af9611b1b612268565b859061202d565b600154604080516370a0823160e01b81523060048201529051929350611b8492670de0b6b3a764000092610af99286926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c0e57600080fd5b9550505050505090565b6009546001600160a01b03163314611ba557600080fd5b6001546001600160a01b031615611c03576040805162461bcd60e51b815260206004820152601660248201527f4c50206164647265737320616c72656164792073657400000000000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60007f0000000000000000000000000000000000000000000000000000000000000000431080611c7457507f000000000000000000000000000000000000000000000000000000000000000043115b15611c81575060006109d9565b507f000000000000000000000000000000000000000000000000000000000000000090565b600181565b7f0000000000000000000000000000000000000000000000000000000000000000431015611d20576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b611422336000611f52565b336000908152600a602090815260408083208151610120810183528154815260018201549381019390935260028101546001600160a01b0316918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615156101008201526109d6906125dd565b60085481565b60065481565b60007f0000000000000000000000000000000000000000000000000000000000000000431115611df3575060006109d9565b6109d67f000000000000000000000000000000000000000000000000000000000000000043611f10565b7f000000000000000000000000000000000000000000000000000000000000000081565b336000908152600a602052604090206004015490565b6000546001600160a01b031681565b600681565b600082820183811015611ec5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000611ec583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126d5565b6000611ec583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612777565b6001600160a01b038083166000908152600a60209081526040808320815161012081018352815481526001820154938101939093526002810154909416908201526003830154606082015260048301546080820152600583015460a0820152600683015460c0820152600783015460e0820152600883015460ff161515610100820152611fdf908461254d565b9050611fea836127d1565b8015611ffa57611ffa84826129e0565b61201f670de0b6b3a7640000610af9600854856004015461202d90919063ffffffff16565b826005018190555050505050565b60008261203c57506000611ec8565b8282028284828161204957fe5b0414611ec55760405162461bcd60e51b81526004018080602001828103825260218152602001806130f46021913960400191505060405180910390fd5b6001600160a01b038082166000908152600a60209081526040808320815161012081018352815481526001820154938101939093526002810154909416908201526003830154606082015260048301546080820152600583015460a0820152600683015460c0820152600783015460e0820152600883015460ff161515610100820152612112906125dd565b905061211c612b77565b801561223f5760028201546001600160a01b03166121c35761213e83826129e0565b6000546001600160a01b0316639dc29fac846121606064610af986600661202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156121a657600080fd5b505af11580156121ba573d6000803e3d6000fd5b5050505061223f565b60006121d96064610af9611b1b60066002611ece565b905060006121e78383611f10565b90506121f385826129e0565b600284015461220b906001600160a01b0316836129e0565b60028401546001600160a01b03166000908152600a6020526040902060038101546122369084611e6b565b60039091015550505b600654825461225b91670de0b6b3a764000091610af99161202d565b8260010181905550505050565b600080600073b4e16d0168e52d35cacd2c6185b44281ec28c9dc6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156122ba57600080fd5b505afa1580156122ce573d6000803e3d6000fd5b505050506040513d60608110156122e457600080fd5b50805160209182015160408051630dfe168160e01b81529051929550909350600092839273b4e16d0168e52d35cacd2c6185b44281ec28c9dc92630dfe1681926004808301939192829003018186803b15801561234057600080fd5b505afa158015612354573d6000803e3d6000fd5b505050506040513d602081101561236a57600080fd5b50516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156123ac5750506dffffffffffffffffffffffffffff8181169083166123c4565b50506dffffffffffffffffffffffffffff8083169082165b6123de81610af9620186a061100b8664e8d4a5100061202d565b94505050505090565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561243a57600080fd5b505afa15801561244e573d6000803e3d6000fd5b505050506040513d606081101561246457600080fd5b50805160209182015160015460408051630dfe168160e01b8152905193965091945060009384936001600160a01b0390921692630dfe16819260048083019392829003018186803b1580156124b857600080fd5b505afa1580156124cc573d6000803e3d6000fd5b505050506040513d60208110156124e257600080fd5b50516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156125245750506dffffffffffffffffffffffffffff80831690821661253c565b50506dffffffffffffffffffffffffffff8181169083165b6123de81610af984620186a061202d565b6008546000908161255e4785611f10565b90506007544311801561257057508015155b156125a957600061258360075443612e25565b90506125a561259e83610af984670de0b6b3a764000061202d565b8490611e6b565b9250505b6125d48560a0015161099f670de0b6b3a7640000610af9868a6080015161202d90919063ffffffff16565b95945050505050565b600654600154604080516370a0823160e01b815230600482015290516000939284926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561263157600080fd5b505afa158015612645573d6000803e3d6000fd5b505050506040513d602081101561265b57600080fd5b50516005549091504311801561267057508015155b156126a257600061268360055443612fe2565b905061269e61259e83610af984670de0b6b3a764000061202d565b9250505b6126cd846020015161099f670de0b6b3a7640000610af986896000015161202d90919063ffffffff16565b949350505050565b600081836127615760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561272657818101518382015260200161270e565b50505050905090810190601f1680156127535780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161276d57fe5b0495945050505050565b600081848411156127c95760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561272657818101518382015260200161270e565b505050900390565b60006127dd4783611f10565b9050600754600014806127ee575080155b156127fd5750436007556129dd565b600061280b60075443612e25565b60008054604080516340c10f1960e01b81523060048201526024810185905290519394506001600160a01b03909116926340c10f199260448084019391929182900301818387803b15801561285f57600080fd5b505af1158015612873573d6000803e3d6000fd5b50506000546009546001600160a01b0391821693506340c10f199250166128a462989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156128ea57600080fd5b505af11580156128fe573d6000803e3d6000fd5b50506000546001600160a01b031691506340c10f1990507f000000000000000000000000000000000000000000000000000000000000000061294a62989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561299057600080fd5b505af11580156129a4573d6000803e3d6000fd5b505050506129d36129ca83610af9670de0b6b3a76400008561202d90919063ffffffff16565b60085490611e6b565b6008555050436007555b50565b60008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612a2c57600080fd5b505afa158015612a40573d6000803e3d6000fd5b505050506040513d6020811015612a5657600080fd5b5051905080821115612aed57600080546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018690529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015612abb57600080fd5b505af1158015612acf573d6000803e3d6000fd5b505050506040513d6020811015612ae557600080fd5b5061127d9050565b600080546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015612b4657600080fd5b505af1158015612b5a573d6000803e3d6000fd5b505050506040513d6020811015612b7057600080fd5b5050505050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612bc257600080fd5b505afa158015612bd6573d6000803e3d6000fd5b505050506040513d6020811015612bec57600080fd5b50516005549091501580612bfe575080155b15612c0d575043600555611422565b6000612c1b60055443612fe2565b60008054604080516340c10f1960e01b81523060048201526024810185905290519394506001600160a01b03909116926340c10f199260448084019391929182900301818387803b158015612c6f57600080fd5b505af1158015612c83573d6000803e3d6000fd5b50506000546009546001600160a01b0391821693506340c10f19925016612cb462989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612cfa57600080fd5b505af1158015612d0e573d6000803e3d6000fd5b50506000546001600160a01b031691506340c10f1990507f0000000000000000000000000000000000000000000000000000000000000000612d5a62989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612da057600080fd5b505af1158015612db4573d6000803e3d6000fd5b50505050612de3612dda83610af9670de0b6b3a76400008561202d90919063ffffffff16565b60065490611e6b565b60065543600555600454612df99061afc8611e6b565b4310612e2157612e196004610af96003805461202d90919063ffffffff16565b600355436004555b5050565b6000807f00000000000000000000000000000000000000000000000000000000000000008410158015612e7857507f00000000000000000000000000000000000000000000000000000000000000008310155b15612fb8577f00000000000000000000000000000000000000000000000000000000000000008411158015612ecd57507f00000000000000000000000000000000000000000000000000000000000000008311155b15612ee357612edc8385611f10565b9050612fb8565b7f00000000000000000000000000000000000000000000000000000000000000008411158015612f3257507f000000000000000000000000000000000000000000000000000000000000000083115b15612f6157612edc7f000000000000000000000000000000000000000000000000000000000000000085611f10565b7f000000000000000000000000000000000000000000000000000000000000000084118015612faf57507f000000000000000000000000000000000000000000000000000000000000000083115b15612fb8575060005b6126cd817f000000000000000000000000000000000000000000000000000000000000000061202d565b6000807f0000000000000000000000000000000000000000000000000000000000000000841015801561303557507f00000000000000000000000000000000000000000000000000000000000000008310155b15613047576130448385611f10565b90505b6003546126cd90829061202d565b604051806101200160405280600081526020016000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152509056fe556e7374616b696e67206d6f7265207468616e2063757272656e746c79207374616b65642e506f6f6c2069732066696e69736865642c206e6f206d6f7265207374616b696e672e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212200a4d01bf19c9be3ae010a82ca714584710abfd893d36fa31692f3ceea195c38f64736f6c63430007050033000000000000000000000000c66fbe50dd33c9aadd65707f7088d597c86fe00f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d

Deployed Bytecode

0x6080604052600436106103295760003560e01c806398f17a3b116101a5578063be8682db116100ec578063dae8f1fd11610095578063f34184fa1161006f578063f34184fa1461088e578063fa8aa3d7146108a3578063fc0c546a146108b8578063fc60a096146108cd57610329565b8063dae8f1fd1461084f578063e3beb31414610864578063ea550ad91461087957610329565b8063cd312cc4116100c6578063cd312cc414610810578063cf71d21114610825578063d34d05b91461083a57610329565b8063be8682db146107b3578063c135916f146107c8578063c7b30602146107fb57610329565b8063a87430ba1161014e578063b4af648911610128578063b4af648914610763578063b53e51e114610796578063b568d8a41461079e57610329565b8063a87430ba146106b5578063aaf5eb6814610739578063b082d99c1461074e57610329565b80639d9165231161017f5780639d916523146106585780639f7fd11d1461066d578063a7ae510b1461068257610329565b806398f17a3b14610619578063997f5dac1461062e5780639acd5e831461064357610329565b80634edbbb5d1161027457806360f5a98b1161021d5780638a8cd1e3116101f75780638a8cd1e3146105a75780638b49f078146105bc57806392570992146105d15780639332fddc1461060457610329565b806360f5a98b146105535780637159ffd8146105685780637417f9261461057d57610329565b8063546ae0391161024e578063546ae03914610514578063577b4059146105295780635ee3f1a71461053e57610329565b80634edbbb5d146104b15780634f90ea4a146104c65780635407886c146104ff57610329565b8063313c06a0116102d657806347ccca02116102b057806347ccca021461045457806349263637146104695780634d159df71461049c57610329565b8063313c06a0146104005780633dfe7304146104155780633e2183611461043f57610329565b80632614d4a4116103075780632614d4a41461039b5780632ecf03f6146103d6578063307c7a26146103eb57610329565b8063054b3cfd1461032e57806314627834146103555780631c2f991814610386575b600080fd5b34801561033a57600080fd5b506103436108e2565b60408051918252519081900360200190f35b34801561036157600080fd5b5061036a610906565b604080516001600160a01b039092168252519081900360200190f35b34801561039257600080fd5b50610343610915565b3480156103a757600080fd5b506103d4600480360360408110156103be57600080fd5b506001600160a01b03813516906020013561091b565b005b3480156103e257600080fd5b506103436109b5565b3480156103f757600080fd5b506103436109bb565b34801561040c57600080fd5b5061036a6109dc565b34801561042157600080fd5b506103d46004803603602081101561043857600080fd5b50356109eb565b34801561044b57600080fd5b50610343610b08565b34801561046057600080fd5b5061036a610b0e565b34801561047557600080fd5b506103d46004803603602081101561048c57600080fd5b50356001600160a01b0316610b1d565b3480156104a857600080fd5b50610343610bb4565b3480156104bd57600080fd5b50610343610c40565b3480156104d257600080fd5b506103d4600480360360408110156104e957600080fd5b50803590602001356001600160a01b0316610c64565b34801561050b57600080fd5b50610343610f82565b34801561052057600080fd5b50610343610fa2565b34801561053557600080fd5b50610343611011565b34801561054a57600080fd5b5061034361101c565b34801561055f57600080fd5b50610343611022565b34801561057457600080fd5b5061036a611028565b34801561058957600080fd5b506103d4600480360360208110156105a057600080fd5b5035611047565b3480156105b357600080fd5b50610343611282565b3480156105c857600080fd5b50610343611288565b3480156105dd57600080fd5b506103d4600480360360208110156105f457600080fd5b50356001600160a01b03166112e4565b34801561061057600080fd5b5061034361137b565b34801561062557600080fd5b50610343611391565b34801561063a57600080fd5b506103d46113a4565b34801561064f57600080fd5b50610343611424565b34801561066457600080fd5b50610343611448565b34801561067957600080fd5b50610343611481565b34801561068e57600080fd5b506103d4600480360360208110156106a557600080fd5b50356001600160a01b03166114cd565b3480156106c157600080fd5b506106e8600480360360208110156106d857600080fd5b50356001600160a01b0316611506565b60408051998a5260208a01989098526001600160a01b03909616888801526060880194909452608087019290925260a086015260c085015260e0840152151561010083015251908190036101200190f35b34801561074557600080fd5b5061034361155e565b34801561075a57600080fd5b50610343611565565b34801561076f57600080fd5b506103436004803603602081101561078657600080fd5b50356001600160a01b031661156b565b6103d461163c565b3480156107aa57600080fd5b5061034361180b565b3480156107bf57600080fd5b50610343611896565b3480156107d457600080fd5b506103d4600480360360208110156107eb57600080fd5b50356001600160a01b0316611b8e565b34801561080757600080fd5b50610343611c25565b34801561081c57600080fd5b50610343611ca6565b34801561083157600080fd5b506103d4611cab565b34801561084657600080fd5b50610343611d2b565b34801561085b57600080fd5b50610343611db5565b34801561087057600080fd5b50610343611dbb565b34801561088557600080fd5b50610343611dc1565b34801561089a57600080fd5b5061036a611e1d565b3480156108af57600080fd5b50610343611e41565b3480156108c457600080fd5b5061036a611e57565b3480156108d957600080fd5b50610343611e66565b7f0000000000000000000000000000000000000000000000000000000000b2670c81565b6009546001600160a01b031681565b60055481565b6002546001600160a01b0316331461097a576040805162461bcd60e51b815260206004820152601c60248201527f43616e206f6e6c792063616c6c656420627920474661726d4e46542e00000000604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090206109a58261099f8561156b565b90611f10565b6006820155436007909101555050565b60075481565b60006109d66109c8610f82565b6109d0611896565b90611e6b565b90505b90565b6001546001600160a01b031681565b336000908152600a6020526040902081610a4c576040805162461bcd60e51b815260206004820152601060248201527f556e7374616b696e672030204554482e00000000000000000000000000000000604482015290519081900360640190fd5b8181600401541015610a8f5760405162461bcd60e51b81526004018080602001828103825260258152602001806130ad6025913960400191505060405180910390fd5b610a9a336000611f52565b604051339083156108fc029084906000818181858888f19350505050158015610ac7573d6000803e3d6000fd5b506004810154610ad79083611f10565b60048201819055600854610aff91670de0b6b3a764000091610af9919061202d565b90611ece565b60059091015550565b617d0081565b6002546001600160a01b031681565b6009546001600160a01b03163314610b3457600080fd5b6000546001600160a01b031615610b92576040805162461bcd60e51b815260206004820152601960248201527f546f6b656e206164647265737320616c72656164792073657400000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60018054604080516370a0823160e01b815230600482015290516000936109d693606493610af9936001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c0e57600080fd5b505afa158015610c22573d6000803e3d6000fd5b505050506040513d6020811015610c3857600080fd5b50519061202d565b7f000000000000000000000000000000000000000000000000003b363eba41aaaa81565b323314610cb8576040805162461bcd60e51b815260206004820152601660248201527f436f6e747261637473206e6f7420616c6c6f7765642e00000000000000000000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000b1ea0c431015610d2d576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b60008211610d82576040805162461bcd60e51b815260206004820152600d60248201527f5374616b696e672030206c702e00000000000000000000000000000000000000604482015290519081900360640190fd5b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610dcd57600080fd5b505afa158015610de1573d6000803e3d6000fd5b505050506040513d6020811015610df757600080fd5b50519050610e0433612086565b600154604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610e7757600080fd5b505af1158015610e8b573d6000803e3d6000fd5b505050506040513d6020811015610ea157600080fd5b5050336000908152600a602052604090208054610ebe9085611e6b565b808255600654610edc91670de0b6b3a764000091610af9919061202d565b6001820155600881015460ff16158015610f065750610f016064610af984600161202d565b815410155b15610f215760088101805460ff191660011790554360078201555b60028101546001600160a01b0316158015610f4457506001600160a01b03831615155b8015610f5957506001600160a01b0383163314155b15610f7c576002810180546001600160a01b0319166001600160a01b0385161790555b50505050565b60006109d6670de0b6b3a7640000610af9610f9b612268565b479061202d565b6000610fac610f82565b610fb8575060006109d9565b6109d6610fc3610f82565b610af9606461100b610fd3612268565b61100b610fde6123e7565b61100b7f000000000000000000000000000000000000000000000000003b363eba41aaaa6223a50061202d565b9061202d565b60006109d63361156b565b60035481565b60045481565b336000908152600a60205260409020600201546001600160a01b031690565b336000908152600a60205260409020816110a8576040805162461bcd60e51b815260206004820152600f60248201527f556e7374616b696e672030206c702e0000000000000000000000000000000000604482015290519081900360640190fd5b80548211156110e85760405162461bcd60e51b81526004018080602001828103825260258152602001806130ad6025913960400191505060405180910390fd5b6110f133612086565b6001546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561114557600080fd5b505af1158015611159573d6000803e3d6000fd5b505050506040513d602081101561116f57600080fd5b5050805461117d9083611f10565b80825560065461119b91670de0b6b3a764000091610af9919061202d565b60018083019190915554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111ed57600080fd5b505afa158015611201573d6000803e3d6000fd5b505050506040513d602081101561121757600080fd5b5051600883015490915060ff16801561123f575061123b6064610af983600161202d565b8254105b806112575750600882015460ff168015611257575080155b1561127d576112653361156b565b600683015560088201805460ff191690554360078301555b505050565b61afc881565b60007f0000000000000000000000000000000000000000000000000000000000b2670c4311156112ba575060006109d9565b6109d67f0000000000000000000000000000000000000000000000000000000000b2670c43611f10565b6009546001600160a01b031633146112fb57600080fd5b6002546001600160a01b031615611359576040805162461bcd60e51b815260206004820152601760248201527f4e4654206164647265737320616c726561647920736574000000000000000000604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600a602052604090206003015490565b336000908152600a602052604090205490565b7f0000000000000000000000000000000000000000000000000000000000b1ea0c431015611419576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b61142233612086565b565b7f0000000000000000000000000000000000000000000000000000000000b1ea0c81565b60007f0000000000000000000000000000000000000000000000000000000000b1ea0c43101561147a575060006109d9565b5060035490565b600061148b611896565b611497575060006109d9565b6109d66114a2611896565b610af9606461100b6114b2612268565b61100b6114bd6123e7565b60035461100b906223a50061202d565b6009546001600160a01b031633146114e457600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600a60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600890980154969795966001600160a01b039095169593949293919290919060ff1689565b620186a081565b6106ef81565b6000611575613055565b506001600160a01b038083166000908152600a6020908152604091829020825161012081018452815481526001820154928101929092526002810154909316918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260089091015460ff161580156101008301526116305761162861161d8260e0015143611f1090919063ffffffff16565b60c083015190611e6b565b915050611637565b60c0015190505b919050565b323314611690576040805162461bcd60e51b815260206004820152601660248201527f436f6e747261637473206e6f7420616c6c6f7765642e00000000000000000000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000b1ea0c431015611705576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000b2670c4311156117645760405162461bcd60e51b81526004018080602001828103825260228152602001806130d26022913960400191505060405180910390fd5b600034116117b9576040805162461bcd60e51b815260206004820152600e60248201527f5374616b696e672030204554482e000000000000000000000000000000000000604482015290519081900360640190fd5b6117c33334611f52565b336000908152600a6020526040902060048101546117e19034611e6b565b6004820181905560085461180391670de0b6b3a764000091610af9919061202d565b600590910155565b336000908152600a602090815260408083208151610120810183528154815260018201549381019390935260028101546001600160a01b0316918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615156101008201526109d6908261254d565b600154604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156118f457600080fd5b505afa158015611908573d6000803e3d6000fd5b505050506040513d602081101561191e57600080fd5b505161192c575060006109d9565b600080600160009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561197d57600080fd5b505afa158015611991573d6000803e3d6000fd5b505050506040513d60608110156119a757600080fd5b50805160209182015160015460408051630dfe168160e01b815290519396509194506000936001600160a01b0390911692630dfe1681926004808201939291829003018186803b1580156119fa57600080fd5b505afa158015611a0e573d6000803e3d6000fd5b505050506040513d6020811015611a2457600080fd5b50516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415611a6157506dffffffffffffffffffffffffffff8216611a74565b506dffffffffffffffffffffffffffff81165b6000611b05600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac757600080fd5b505afa158015611adb573d6000803e3d6000fd5b505050506040513d6020811015611af157600080fd5b5051610af9600261100b86620186a061202d565b90506000611b22620186a0610af9611b1b612268565b859061202d565b600154604080516370a0823160e01b81523060048201529051929350611b8492670de0b6b3a764000092610af99286926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c0e57600080fd5b9550505050505090565b6009546001600160a01b03163314611ba557600080fd5b6001546001600160a01b031615611c03576040805162461bcd60e51b815260206004820152601660248201527f4c50206164647265737320616c72656164792073657400000000000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60007f0000000000000000000000000000000000000000000000000000000000b1ea0c431080611c7457507f0000000000000000000000000000000000000000000000000000000000b2670c43115b15611c81575060006109d9565b507f000000000000000000000000000000000000000000000000003b363eba41aaaa90565b600181565b7f0000000000000000000000000000000000000000000000000000000000b1ea0c431015611d20576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b611422336000611f52565b336000908152600a602090815260408083208151610120810183528154815260018201549381019390935260028101546001600160a01b0316918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615156101008201526109d6906125dd565b60085481565b60065481565b60007f0000000000000000000000000000000000000000000000000000000000b1ea0c431115611df3575060006109d9565b6109d67f0000000000000000000000000000000000000000000000000000000000b1ea0c43611f10565b7f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d81565b336000908152600a602052604090206004015490565b6000546001600160a01b031681565b600681565b600082820183811015611ec5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000611ec583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126d5565b6000611ec583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612777565b6001600160a01b038083166000908152600a60209081526040808320815161012081018352815481526001820154938101939093526002810154909416908201526003830154606082015260048301546080820152600583015460a0820152600683015460c0820152600783015460e0820152600883015460ff161515610100820152611fdf908461254d565b9050611fea836127d1565b8015611ffa57611ffa84826129e0565b61201f670de0b6b3a7640000610af9600854856004015461202d90919063ffffffff16565b826005018190555050505050565b60008261203c57506000611ec8565b8282028284828161204957fe5b0414611ec55760405162461bcd60e51b81526004018080602001828103825260218152602001806130f46021913960400191505060405180910390fd5b6001600160a01b038082166000908152600a60209081526040808320815161012081018352815481526001820154938101939093526002810154909416908201526003830154606082015260048301546080820152600583015460a0820152600683015460c0820152600783015460e0820152600883015460ff161515610100820152612112906125dd565b905061211c612b77565b801561223f5760028201546001600160a01b03166121c35761213e83826129e0565b6000546001600160a01b0316639dc29fac846121606064610af986600661202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156121a657600080fd5b505af11580156121ba573d6000803e3d6000fd5b5050505061223f565b60006121d96064610af9611b1b60066002611ece565b905060006121e78383611f10565b90506121f385826129e0565b600284015461220b906001600160a01b0316836129e0565b60028401546001600160a01b03166000908152600a6020526040902060038101546122369084611e6b565b60039091015550505b600654825461225b91670de0b6b3a764000091610af99161202d565b8260010181905550505050565b600080600073b4e16d0168e52d35cacd2c6185b44281ec28c9dc6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156122ba57600080fd5b505afa1580156122ce573d6000803e3d6000fd5b505050506040513d60608110156122e457600080fd5b50805160209182015160408051630dfe168160e01b81529051929550909350600092839273b4e16d0168e52d35cacd2c6185b44281ec28c9dc92630dfe1681926004808301939192829003018186803b15801561234057600080fd5b505afa158015612354573d6000803e3d6000fd5b505050506040513d602081101561236a57600080fd5b50516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156123ac5750506dffffffffffffffffffffffffffff8181169083166123c4565b50506dffffffffffffffffffffffffffff8083169082165b6123de81610af9620186a061100b8664e8d4a5100061202d565b94505050505090565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561243a57600080fd5b505afa15801561244e573d6000803e3d6000fd5b505050506040513d606081101561246457600080fd5b50805160209182015160015460408051630dfe168160e01b8152905193965091945060009384936001600160a01b0390921692630dfe16819260048083019392829003018186803b1580156124b857600080fd5b505afa1580156124cc573d6000803e3d6000fd5b505050506040513d60208110156124e257600080fd5b50516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156125245750506dffffffffffffffffffffffffffff80831690821661253c565b50506dffffffffffffffffffffffffffff8181169083165b6123de81610af984620186a061202d565b6008546000908161255e4785611f10565b90506007544311801561257057508015155b156125a957600061258360075443612e25565b90506125a561259e83610af984670de0b6b3a764000061202d565b8490611e6b565b9250505b6125d48560a0015161099f670de0b6b3a7640000610af9868a6080015161202d90919063ffffffff16565b95945050505050565b600654600154604080516370a0823160e01b815230600482015290516000939284926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561263157600080fd5b505afa158015612645573d6000803e3d6000fd5b505050506040513d602081101561265b57600080fd5b50516005549091504311801561267057508015155b156126a257600061268360055443612fe2565b905061269e61259e83610af984670de0b6b3a764000061202d565b9250505b6126cd846020015161099f670de0b6b3a7640000610af986896000015161202d90919063ffffffff16565b949350505050565b600081836127615760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561272657818101518382015260200161270e565b50505050905090810190601f1680156127535780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161276d57fe5b0495945050505050565b600081848411156127c95760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561272657818101518382015260200161270e565b505050900390565b60006127dd4783611f10565b9050600754600014806127ee575080155b156127fd5750436007556129dd565b600061280b60075443612e25565b60008054604080516340c10f1960e01b81523060048201526024810185905290519394506001600160a01b03909116926340c10f199260448084019391929182900301818387803b15801561285f57600080fd5b505af1158015612873573d6000803e3d6000fd5b50506000546009546001600160a01b0391821693506340c10f199250166128a462989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156128ea57600080fd5b505af11580156128fe573d6000803e3d6000fd5b50506000546001600160a01b031691506340c10f1990507f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d61294a62989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561299057600080fd5b505af11580156129a4573d6000803e3d6000fd5b505050506129d36129ca83610af9670de0b6b3a76400008561202d90919063ffffffff16565b60085490611e6b565b6008555050436007555b50565b60008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612a2c57600080fd5b505afa158015612a40573d6000803e3d6000fd5b505050506040513d6020811015612a5657600080fd5b5051905080821115612aed57600080546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018690529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015612abb57600080fd5b505af1158015612acf573d6000803e3d6000fd5b505050506040513d6020811015612ae557600080fd5b5061127d9050565b600080546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015612b4657600080fd5b505af1158015612b5a573d6000803e3d6000fd5b505050506040513d6020811015612b7057600080fd5b5050505050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612bc257600080fd5b505afa158015612bd6573d6000803e3d6000fd5b505050506040513d6020811015612bec57600080fd5b50516005549091501580612bfe575080155b15612c0d575043600555611422565b6000612c1b60055443612fe2565b60008054604080516340c10f1960e01b81523060048201526024810185905290519394506001600160a01b03909116926340c10f199260448084019391929182900301818387803b158015612c6f57600080fd5b505af1158015612c83573d6000803e3d6000fd5b50506000546009546001600160a01b0391821693506340c10f19925016612cb462989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612cfa57600080fd5b505af1158015612d0e573d6000803e3d6000fd5b50506000546001600160a01b031691506340c10f1990507f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d612d5a62989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612da057600080fd5b505af1158015612db4573d6000803e3d6000fd5b50505050612de3612dda83610af9670de0b6b3a76400008561202d90919063ffffffff16565b60065490611e6b565b60065543600555600454612df99061afc8611e6b565b4310612e2157612e196004610af96003805461202d90919063ffffffff16565b600355436004555b5050565b6000807f0000000000000000000000000000000000000000000000000000000000b1ea0c8410158015612e7857507f0000000000000000000000000000000000000000000000000000000000b1ea0c8310155b15612fb8577f0000000000000000000000000000000000000000000000000000000000b2670c8411158015612ecd57507f0000000000000000000000000000000000000000000000000000000000b2670c8311155b15612ee357612edc8385611f10565b9050612fb8565b7f0000000000000000000000000000000000000000000000000000000000b2670c8411158015612f3257507f0000000000000000000000000000000000000000000000000000000000b2670c83115b15612f6157612edc7f0000000000000000000000000000000000000000000000000000000000b2670c85611f10565b7f0000000000000000000000000000000000000000000000000000000000b2670c84118015612faf57507f0000000000000000000000000000000000000000000000000000000000b2670c83115b15612fb8575060005b6126cd817f000000000000000000000000000000000000000000000000003b363eba41aaaa61202d565b6000807f0000000000000000000000000000000000000000000000000000000000b1ea0c841015801561303557507f0000000000000000000000000000000000000000000000000000000000b1ea0c8310155b15613047576130448385611f10565b90505b6003546126cd90829061202d565b604051806101200160405280600081526020016000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152509056fe556e7374616b696e67206d6f7265207468616e2063757272656e746c79207374616b65642e506f6f6c2069732066696e69736865642c206e6f206d6f7265207374616b696e672e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212200a4d01bf19c9be3ae010a82ca714584710abfd893d36fa31692f3ceea195c38f64736f6c63430007050033

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

000000000000000000000000c66fbe50dd33c9aadd65707f7088d597c86fe00f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d

-----Decoded View---------------
Arg [0] : _GOV (address): 0xC66FbE50Dd33c9AAdd65707F7088D597C86fE00F
Arg [1] : _DEV (address): 0xd39A38bD2D2d552f3908ff698a5530aa397fb92d

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c66fbe50dd33c9aadd65707f7088d597c86fe00f
Arg [1] : 000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d


Deployed Bytecode Sourcemap

8657:17965:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9379:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;9936:25;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;9936:25:0;;;;;;;;;;;;;;9048:33;;;;;;;;;;;;;:::i;21803:303::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21803:303:0;;;;;;;;:::i;:::-;;9417:33;;;;;;;;;;;;;:::i;25842:102::-;;;;;;;;;;;;;:::i;8802:24::-;;;;;;;;;;;;;:::i;20921:459::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20921:459:0;;:::i;9319:43::-;;;;;;;;;;;;;:::i;8833:18::-;;;;;;;;;;;;;:::i;11338:185::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11338:185:0;-1:-1:-1;;;;;11338:185:0;;:::i;24932:148::-;;;;;;;;;;;;;:::i;9266:38::-;;;;;;;;;;;;;:::i;18376:1012::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18376:1012:0;;;;;;-1:-1:-1;;;;;18376:1012:0;;:::i;25692:122::-;;;;;;;;;;;;;:::i;26251:251::-;;;;;;;;;;;;;:::i;26510:107::-;;;;;;;;;;;;;:::i;8878:28::-;;;;;;;;;;;;;:::i;8921:36::-;;;;;;;;;;;;;:::i;24810:114::-;;;;;;;;;;;;;:::i;20026:869::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20026:869:0;;:::i;8964:58::-;;;;;;;;;;;;;:::i;24621:181::-;;;;;;;;;;;;;:::i;11751:140::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11751:140:0;-1:-1:-1;;;;;11751:140:0;;:::i;24490:123::-;;;;;;;;;;;;;:::i;24252:111::-;;;;;;;;;;;;;:::i;16520:153::-;;;;;;;;;;;;;:::i;9534:33::-;;;;;;;;;;;;;:::i;23858:175::-;;;;;;;;;;;;;:::i;25972:251::-;;;;;;;;;;;;;:::i;11211:90::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11211:90:0;-1:-1:-1;;;;;11211:90:0;;:::i;10483:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10483:37:0;-1:-1:-1;;;;;10483:37:0;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;10483:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9626:36;;;;;;;;;;;;;:::i;9574:45::-;;;;;;;;;;;;;:::i;21440:305::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21440:305:0;-1:-1:-1;;;;;21440:305:0;;:::i;19414:568::-;;;:::i;15574:126::-;;;;;;;;;;;;;:::i;25108:556::-;;;;;;;;;;;;;:::i;11557:157::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11557:157:0;-1:-1:-1;;;;;11557:157:0;;:::i;24041:203::-;;;;;;;;;;;;;:::i;9195:44::-;;;;;;;;;;;;;:::i;17756:156::-;;;;;;;;;;;;;:::i;14754:123::-;;;;;;;;;;;;;:::i;9457:33::-;;;;;;;;;;;;;:::i;9088:32::-;;;;;;;;;;;;;:::i;23677:173::-;;;;;;;;;;;;;:::i;9968:33::-;;;;;;;;;;;;;:::i;24371:111::-;;;;;;;;;;;;;:::i;8763:32::-;;;;;;;;;;;;;:::i;9135:41::-;;;;;;;;;;;;;:::i;9379:31::-;;;:::o;9936:25::-;;;-1:-1:-1;;;;;9936:25:0;;:::o;9048:33::-;;;;:::o;21803:303::-;21899:3;;-1:-1:-1;;;;;21899:3:0;21885:10;:17;21877:58;;;;;-1:-1:-1;;;21877:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21963:8:0;;21946:14;21963:8;;;:5;:8;;;;;22005:42;22031:15;22005:21;21969:1;22005:18;:21::i;:::-;:25;;:42::i;:::-;21982:20;;;:65;22086:12;22058:25;;;;:40;-1:-1:-1;;21803:303:0:o;9417:33::-;;;;:::o;25842:102::-;25885:4;25908:28;25924:11;:9;:11::i;:::-;25908;:9;:11::i;:::-;:15;;:28::i;:::-;25901:35;;25842:102;;:::o;8802:24::-;;;-1:-1:-1;;;;;8802:24:0;;:::o;20921:459::-;20999:10;20976:14;20993:17;;;:5;:17;;;;;21029:10;21021:39;;;;;-1:-1:-1;;;21021:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21099:6;21079:1;:16;;;:26;;21071:76;;;;-1:-1:-1;;;21071:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21160:29;21175:10;21187:1;21160:14;:29::i;:::-;21200:27;;:10;;:27;;;;;21220:6;;21200:27;;;;21220:6;21200:10;:27;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21259:16:0;;;;:28;;21280:6;21259:20;:28::i;:::-;21240:16;;;:47;;;21340:21;;21319:53;;21367:4;;21319:43;;21240:47;21319:20;:43::i;:::-;:47;;:53::i;:::-;21298:18;;;;:74;-1:-1:-1;20921:459:0:o;9319:43::-;9357:5;9319:43;:::o;8833:18::-;;;-1:-1:-1;;;;;8833:18:0;;:::o;11338:185::-;11135:10;;-1:-1:-1;;;;;11135:10:0;11121;:24;11113:33;;;;;;11437:1:::1;11408:5:::0;-1:-1:-1;;;;;11408:5:0::1;:31:::0;11400:69:::1;;;::::0;;-1:-1:-1;;;11400:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;11480:5;:35:::0;;-1:-1:-1;;;;;;11480:35:0::1;-1:-1:-1::0;;;;;11480:35:0;;;::::1;::::0;;;::::1;::::0;;11338:185::o;24932:148::-;9238:1;25011:2;;:27;;;-1:-1:-1;;;25011:27:0;;25032:4;25011:27;;;;;;24988:4;;25011:61;;25068:3;;25011:52;;-1:-1:-1;;;;;25011:2:0;;;;:12;;:27;;;;;;;;;;;;;;;:2;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25011:27:0;;:31;:52::i;9266:38::-;;;:::o;18376:1012::-;18455:9;18468:10;18455:23;18447:58;;;;;-1:-1:-1;;;18447:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18540:11;18524:12;:27;;18516:64;;;;;-1:-1:-1;;;18516:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18608:1;18599:6;:10;18591:36;;;;;-1:-1:-1;;;18591:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18662:2;;:27;;;-1:-1:-1;;;18662:27:0;;18683:4;18662:27;;;;;;18640:19;;-1:-1:-1;;;;;18662:2:0;;:12;;:27;;;;;;;;;;;;;;:2;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18662:27:0;;-1:-1:-1;18702:26:0;18717:10;18702:14;:26::i;:::-;18739:2;;:50;;;;;;18755:10;18739:50;;;;18775:4;18739:50;;;;;;;;;;;;-1:-1:-1;;;;;18739:2:0;;;;:15;;:50;;;;;;;;;;;;;;;:2;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18825:10:0;18802:14;18819:17;;;:5;18739:50;18819:17;;;;18866:16;;:28;;18887:6;18866:20;:28::i;:::-;18847:47;;;18947:20;;18926:52;;18973:4;;18926:42;;18847:47;18926:20;:42::i;:52::-;18905:18;;;:73;18995:23;;;;;;18994:24;:109;;;;-1:-1:-1;19055:48:0;19099:3;19055:39;:14;9238:1;19055:18;:39::i;:48::-;19035:16;;:68;;18994:109;18991:225;;;19119:23;;;:30;;-1:-1:-1;;19119:30:0;19145:4;19119:30;;;19192:12;19164:25;;;:40;18991:225;19231:16;;;;-1:-1:-1;;;;;19231:16:0;:30;:56;;;;-1:-1:-1;;;;;;19265:22:0;;;;19231:56;:95;;;;-1:-1:-1;;;;;;19304:22:0;;19316:10;19304:22;;19231:95;19228:153;;;19342:16;;;:27;;-1:-1:-1;;;;;;19342:27:0;-1:-1:-1;;;;;19342:27:0;;;;;19228:153;18376:1012;;;;:::o;25692:122::-;25733:4;25756:50;25801:4;25756:40;25782:13;:11;:13::i;:::-;25756:21;;:25;:40::i;26251:251::-;26294:4;26313:11;:9;:11::i;:::-;26310:33;;-1:-1:-1;26339:1:0;26332:8;;26310:33;26360:134;26482:11;:9;:11::i;:::-;26360:117;26473:3;26360:90;26436:13;:11;:13::i;:::-;26360:71;26412:18;:16;:18::i;:::-;26360:29;:16;26381:7;26360:20;:29::i;:::-;:51;;:71::i;26510:107::-;26556:4;26579:30;26598:10;26579:18;:30::i;8878:28::-;;;;:::o;8921:36::-;;;;:::o;24810:114::-;24890:10;24858:7;24884:17;;;:5;:17;;;;;:32;;;-1:-1:-1;;;;;24884:32:0;24810:114;:::o;20026:869::-;20104:10;20081:14;20098:17;;;:5;:17;;;;;20134:10;20126:38;;;;;-1:-1:-1;;;20126:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20183:16;;:26;-1:-1:-1;20183:26:0;20175:76;;;;-1:-1:-1;;;20175:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20264:26;20279:10;20264:14;:26::i;:::-;20301:2;;:31;;;-1:-1:-1;;;20301:31:0;;20313:10;20301:31;;;;;;;;;;;;-1:-1:-1;;;;;20301:2:0;;;;:11;;:31;;;;;;;;;;;;;;;:2;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20364:16:0;;:28;;20385:6;20364:20;:28::i;:::-;20345:47;;;20445:20;;20424:52;;20471:4;;20424:42;;20345:47;20424:20;:42::i;:52::-;20403:18;;;;:73;;;;20505:2;:27;;;-1:-1:-1;;;20505:27:0;;20526:4;20505:27;;;;;;20489:13;;-1:-1:-1;;;;;20505:2:0;;:12;;:27;;;;;;;;;;;;;;:2;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20505:27:0;20548:23;;;;20505:27;;-1:-1:-1;20548:23:0;;:101;;;;-1:-1:-1;20607:42:0;20645:3;20607:33;:8;9238:1;20607:12;:33::i;:42::-;20588:16;;:61;20548:101;:158;;;-1:-1:-1;20666:23:0;;;;;;:40;;;;-1:-1:-1;20693:13:0;;20666:40;20545:343;;;20745:30;20764:10;20745:18;:30::i;:::-;20722:20;;;:53;20790:23;;;:31;;-1:-1:-1;;20790:31:0;;;20864:12;20836:25;;;:40;20545:343;20026:869;;;:::o;8964:58::-;9017:5;8964:58;:::o;24621:181::-;24671:4;24705:9;24690:12;:24;24687:63;;;-1:-1:-1;24737:1:0;24730:8;;24687:63;24767:27;:9;24781:12;24767:13;:27::i;11751:140::-;11135:10;;-1:-1:-1;;;;;11135:10:0;11121;:24;11113:33;;;;;;11817:3:::1;::::0;-1:-1:-1;;;;;11817:3:0::1;:17:::0;11809:53:::1;;;::::0;;-1:-1:-1;;;11809:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;11873:3;:10:::0;;-1:-1:-1;;;;;;11873:10:0::1;-1:-1:-1::0;;;;;11873:10:0;;;::::1;::::0;;;::::1;::::0;;11751:140::o;24490:123::-;24573:10;24544:4;24567:17;;;:5;:17;;;;;:38;;;24490:123;:::o;24252:111::-;24329:10;24300:4;24323:17;;;:5;:17;;;;;:32;24252:111;:::o;16520:153::-;16588:11;16572:12;:27;;16564:64;;;;;-1:-1:-1;;;16564:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16639:26;16654:10;16639:14;:26::i;:::-;16520:153::o;9534:33::-;;;:::o;23858:175::-;23910:4;23945:11;23930:12;:26;23927:65;;;-1:-1:-1;23979:1:0;23972:8;;23927:65;-1:-1:-1;24009:16:0;;23858:175;:::o;25972:251::-;26015:4;26034:11;:9;:11::i;:::-;26031:33;;-1:-1:-1;26060:1:0;26053:8;;26031:33;26081:134;26203:11;:9;:11::i;:::-;26081:117;26194:3;26081:90;26157:13;:11;:13::i;:::-;26081:71;26133:18;:16;:18::i;:::-;26081:16;;:29;;26102:7;26081:20;:29::i;11211:90::-;11135:10;;-1:-1:-1;;;;;11135:10:0;11121;:24;11113:33;;;;;;11276:10:::1;:17:::0;;-1:-1:-1;;;;;;11276:17:0::1;-1:-1:-1::0;;;;;11276:17:0;;;::::1;::::0;;;::::1;::::0;;11211:90::o;10483:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10483:37:0;;;;;;;;;;;;;;;;:::o;9626:36::-;9659:3;9626:36;:::o;9574:45::-;9615:4;9574:45;:::o;21440:305::-;21499:4;21515:13;;:::i;:::-;-1:-1:-1;;;;;;21531:8:0;;;;;;;:5;:8;;;;;;;;;21515:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21550:188;;21599:69;21624:43;21641:1;:25;;;21624:12;:16;;:43;;;;:::i;:::-;21599:20;;;;;:24;:69::i;:::-;21592:76;;;;;21550:188;21706:20;;;;-1:-1:-1;21440:305:0;;;;:::o;19414:568::-;19472:9;19485:10;19472:23;19464:58;;;;;-1:-1:-1;;;19464:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19557:11;19541:12;:27;;19533:64;;;;;-1:-1:-1;;;19533:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19632:9;19616:12;:25;;19608:72;;;;-1:-1:-1;;;19608:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19711:1;19699:9;:13;19691:40;;;;;-1:-1:-1;;;19691:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19744:37;19759:10;19771:9;19744:14;:37::i;:::-;19817:10;19794:14;19811:17;;;:5;:17;;;;;19858:16;;;;:31;;19879:9;19858:20;:31::i;:::-;19839:16;;;:50;;;19942:21;;19921:53;;19969:4;;19921:43;;19839:50;19921:20;:43::i;:53::-;19900:18;;;;:74;19414:568::o;15574:126::-;15677:10;15627:4;15671:17;;;:5;:17;;;;;;;;15650:42;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15650:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15627:4;15650:20;:42::i;25108:556::-;25168:2;;:16;;;;;;;;25149:4;;-1:-1:-1;;;;;25168:2:0;;:14;;:16;;;;;;;;;;;;;;:2;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25168:16:0;25165:38;;-1:-1:-1;25199:1:0;25192:8;;25165:38;25216:17;25235;25258:2;;;;;;;;;-1:-1:-1;;;;;25258:2:0;-1:-1:-1;;;;;25258:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25258:16:0;;;;;;;25324:2;;25258:16;25324:11;;-1:-1:-1;;;25324:11:0;;;;25258:16;;-1:-1:-1;25258:16:0;;-1:-1:-1;25285:15:0;;-1:-1:-1;;;;;25324:2:0;;;;:9;;:11;;;;;25258:16;25324:11;;;;;;:2;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25324:11:0;-1:-1:-1;;;;;25316:19:0;9747:42;25316:19;25313:125;;;-1:-1:-1;25351:22:0;;;25313:125;;;-1:-1:-1;25404:22:0;;;25313:125;25450:15;25468:48;25499:2;;;;;;;;;-1:-1:-1;;;;;25499:2:0;-1:-1:-1;;;;;25499:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25499:16:0;25468:26;25492:1;25468:19;:10;25483:3;25468:14;:19::i;:48::-;25450:66;;25527:15;25545:38;25579:3;25545:29;25560:13;:11;:13::i;:::-;25545:10;;:14;:29::i;:38::-;25603:2;;:27;;;-1:-1:-1;;;25603:27:0;;25624:4;25603:27;;;;;;25527:56;;-1:-1:-1;25603:53:0;;25651:4;;25603:43;;25527:56;;-1:-1:-1;;;;;25603:2:0;;;;:12;;:27;;;;;;;;;;;;;;;:2;:27;;;;;;;;;;:53;25596:60;;;;;;;25108:556;:::o;11557:157::-;11135:10;;-1:-1:-1;;;;;11135:10:0;11121;:24;11113:33;;;;;;11621:2:::1;::::0;-1:-1:-1;;;;;11621:2:0::1;:23:::0;11613:58:::1;;;::::0;;-1:-1:-1;;;11613:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;11682:2;:24:::0;;-1:-1:-1;;;;;;11682:24:0::1;-1:-1:-1::0;;;;;11682:24:0;;;::::1;::::0;;;::::1;::::0;;11557:157::o;24041:203::-;24093:4;24128:11;24113:12;:26;:54;;;;24158:9;24143:12;:24;24113:54;24110:93;;;-1:-1:-1;24190:1:0;24183:8;;24110:93;-1:-1:-1;24220:16:0;24041:203;:::o;9195:44::-;9238:1;9195:44;:::o;17756:156::-;17824:11;17808:12;:27;;17800:64;;;;;-1:-1:-1;;;17800:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17875:29;17890:10;17902:1;17875:14;:29::i;14754:123::-;14857:10;14807:4;14851:17;;;:5;:17;;;;;;;;14830:39;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14830:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;:39::i;9457:33::-;;;;:::o;9088:32::-;;;;:::o;23677:173::-;23737:4;23771:11;23756:12;:26;23753:43;;;-1:-1:-1;23792:1:0;23785:8;;23753:43;23813:29;:11;23829:12;23813:15;:29::i;9968:33::-;;;:::o;24371:111::-;24448:10;24419:4;24442:17;;;:5;:17;;;;;:32;;;24371:111;:::o;8763:32::-;;;-1:-1:-1;;;;;8763:32:0;;:::o;9135:41::-;9175:1;9135:41;:::o;1586:181::-;1644:7;1676:5;;;1700:6;;;;1692:46;;;;;-1:-1:-1;;;1692:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1758:1;-1:-1:-1;1586:181:0;;;;;:::o;3887:132::-;3945:7;3972:39;3976:1;3979;3972:39;;;;;;;;;;;;;;;;;:3;:39::i;2050:136::-;2108:7;2135:43;2139:1;2142;2135:43;;;;;;;;;;;;;;;;;:3;:43::i;17950:384::-;-1:-1:-1;;;;;18040:8:0;;;18023:14;18040:8;;;:5;:8;;;;;;;;18074:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18098:13;18074:20;:38::i;:::-;18059:53;;18123:27;18136:13;18123:12;:27::i;:::-;18166:11;;18163:77;;18193:35;18217:1;18220:7;18193:23;:35::i;:::-;18273:53;18321:4;18273:43;18294:21;;18273:1;:16;;;:20;;:43;;;;:::i;:53::-;18252:1;:18;;:74;;;;17950:384;;;;:::o;2940:471::-;2998:7;3243:6;3239:47;;-1:-1:-1;3273:1:0;3266:8;;3239:47;3310:5;;;3314:1;3310;:5;:1;3334:5;;;;;:10;3326:56;;;;-1:-1:-1;;;3326:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16707:1014;-1:-1:-1;;;;;16777:8:0;;;16760:14;16777:8;;;:5;:8;;;;;;;;16811:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;:23::i;:::-;16796:38;;16845:14;:12;:14::i;:::-;16875:11;;16872:756;;16905:16;;;;-1:-1:-1;;;;;16905:16:0;16902:715;;16955:35;16979:1;16982:7;16955:23;:35::i;:::-;17009:5;;-1:-1:-1;;;;;17009:5:0;:10;17020:1;17023:38;17057:3;17023:29;:7;9175:1;17023:11;:29::i;:38::-;17009:53;;;;;;;;;;;;;-1:-1:-1;;;;;17009:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16902:715;;;17101:19;17123:45;17164:3;17123:36;17135:23;9175:1;17156;17135:20;:23::i;17123:45::-;17101:67;-1:-1:-1;17187:15:0;17205:27;:7;17101:67;17205:11;:27::i;:::-;17187:45;;17253:38;17277:1;17280:10;17253:23;:38::i;:::-;17334:16;;;;17310:57;;-1:-1:-1;;;;;17334:16:0;17352:14;17310:23;:57::i;:::-;17422:16;;;;-1:-1:-1;;;;;17422:16:0;17388:25;17416:23;;;:5;:23;;;;;17494:33;;;;:107;;17586:14;17494:91;:107::i;:::-;17458:33;;;;:143;-1:-1:-1;;16902:715:0;17682:20;;17661:16;;:52;;17708:4;;17661:42;;:20;:42::i;:52::-;17640:1;:18;;:73;;;;16707:1014;;;:::o;22513:601::-;22557:4;22574:17;22593;9851:42;-1:-1:-1;;;;;22616:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22616:27:0;;;;;;;;22720:22;;-1:-1:-1;;;22720:22:0;;;;22616:27;;-1:-1:-1;22616:27:0;;-1:-1:-1;22654:16:0;;;;9851:42;;22720:20;;:22;;;;;22616:27;;22720:22;;;;;9851:42;22720:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22720:22:0;-1:-1:-1;;;;;22712:30:0;9747:42;22712:30;22709:212;;;-1:-1:-1;;22758:22:0;22795:23;;;;22758:22;;22709:212;;;-1:-1:-1;;22849:23:0;;;;;22887:22;;22709:212;23054:52;23095:10;23054:36;9659:3;23054:21;:11;23070:4;23054:15;:21::i;:52::-;23047:59;;;;;;22513:601;:::o;23159:466::-;23208:4;23225:17;23244;23267:2;;;;;;;;;-1:-1:-1;;;;;23267:2:0;-1:-1:-1;;;;;23267:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23267:16:0;;;;;;;23363:2;;23267:16;23363:11;;-1:-1:-1;;;23363:11:0;;;;23267:16;;-1:-1:-1;23267:16:0;;-1:-1:-1;23296:15:0;;;;-1:-1:-1;;;;;23363:2:0;;;;:9;;:11;;;;;23267:16;23363:11;;;;;:2;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23363:11:0;-1:-1:-1;;;;;23355:19:0;9747:42;23355:19;23352:203;;;-1:-1:-1;;23390:22:0;;;;;23427:24;;23352:203;;;-1:-1:-1;;23482:24:0;23521:22;;;;23482:24;;23352:203;23574:43;23604:12;23574:25;:10;9659:3;23574:14;:25::i;15745:714::-;15877:21;;15831:4;;;15989:40;:21;16015:13;15989:25;:40::i;:::-;15972:57;;16061:21;;16046:12;:36;:54;;;;-1:-1:-1;16086:14:0;;;16046:54;16042:298;;;16117:18;16138:52;16154:21;;16177:12;16138:15;:52::i;:::-;16117:73;-1:-1:-1;16230:98:0;16275:38;16303:9;16275:23;16117:73;16293:4;16275:17;:23::i;:38::-;16230:22;;:26;:98::i;:::-;16205:123;;16042:298;;16359:92;16432:1;:18;;;16359:54;16408:4;16359:44;16380:22;16359:1;:16;;;:20;;:44;;;;:::i;:92::-;16352:99;15745:714;-1:-1:-1;;;;;15745:714:0:o;14918:614::-;15029:20;;15076:2;;:27;;;-1:-1:-1;;;15076:27:0;;15097:4;15076:27;;;;;;14984:4;;15029:20;14984:4;;-1:-1:-1;;;;;15076:2:0;;;;:12;;:27;;;;;;;;;;;;;;;:2;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15076:27:0;15135:21;;15076:27;;-1:-1:-1;15120:12:0;:36;:53;;;;-1:-1:-1;15160:13:0;;;15120:53;15116:294;;;15190:18;15211:52;15227:21;;15250:12;15211:15;:52::i;:::-;15190:73;-1:-1:-1;15302:96:0;15346:37;15374:8;15346:23;15190:73;15364:4;15346:17;:23::i;15302:96::-;15278:120;;15116:294;;15429:95;15505:1;:18;;;15429:53;15477:4;15429:43;15450:21;15429:1;:16;;;:20;;:43;;;;:::i;:95::-;15422:102;14918:614;-1:-1:-1;;;;14918:614:0:o;4515:278::-;4601:7;4636:12;4629:5;4621:28;;;;-1:-1:-1;;;4621:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4660:9;4676:1;4672;:5;;;;;;;4515:278;-1:-1:-1;;;;;4515:278:0:o;2489:192::-;2575:7;2611:12;2603:6;;;;2595:29;;;;-1:-1:-1;;;2595:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2647:5:0;;;2489:192::o;13925:762::-;14049:14;14066:40;:21;14092:13;14066:25;:40::i;:::-;14049:57;;14123:21;;14148:1;14123:26;:44;;;-1:-1:-1;14153:14:0;;14123:44;14119:134;;;-1:-1:-1;14208:12:0;14184:21;:36;14235:7;;14119:134;14265:11;14279:52;14295:21;;14318:12;14279:15;:52::i;:::-;14352:5;;;:33;;;-1:-1:-1;;;14352:33:0;;14371:4;14352:33;;;;;;;;;;;;14265:66;;-1:-1:-1;;;;;;14352:5:0;;;;:10;;:33;;;;;:5;;:33;;;;;;:5;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14396:5:0;;14407:10;;-1:-1:-1;;;;;14396:5:0;;;;-1:-1:-1;14396:10:0;;-1:-1:-1;14407:10:0;14419:43;14448:13;14419:24;:6;10037;14419:10;:24::i;:43::-;14396:67;;;;;;;;;;;;;-1:-1:-1;;;;;14396:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14474:5:0;;-1:-1:-1;;;;;14474:5:0;;-1:-1:-1;14474:10:0;;-1:-1:-1;14485:8:0;14495:41;14522:13;14495:22;:6;10090;14495:10;:22::i;:41::-;14474:63;;;;;;;;;;;;;-1:-1:-1;;;;;14474:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14574:58;14600:31;14621:9;14600:16;14611:4;14600:6;:10;;:16;;;;:::i;:31::-;14574:21;;;:25;:58::i;:::-;14550:21;:82;-1:-1:-1;;14667:12:0;14643:21;:36;13925:762;;:::o;22148:269::-;22227:8;22238:5;;:30;;;-1:-1:-1;;;22238:30:0;;22262:4;22238:30;;;;;;-1:-1:-1;;;;;22238:5:0;;;;:15;;:30;;;;;;;;;;;;;;;:5;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22238:30:0;;-1:-1:-1;22283:13:0;;;22279:131;;;22313:5;;;:24;;;-1:-1:-1;;;22313:24:0;;-1:-1:-1;;;;;22313:24:0;;;;;;;;;;;;;;;:5;;;;;:14;;:24;;;;;;;;;;;;;;;;;;:5;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22279:131:0;;-1:-1:-1;22279:131:0;;22370:5;;;:28;;;-1:-1:-1;;;22370:28:0;;-1:-1:-1;;;;;22370:28:0;;;;;;;;;;;;;;;:5;;;;;:14;;:28;;;;;;;;;;;;;;;;;;:5;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22148:269:0;;;:::o;12988:908::-;13047:2;;:27;;;-1:-1:-1;;;13047:27:0;;13068:4;13047:27;;;;;;13031:13;;-1:-1:-1;;;;;13047:2:0;;:12;;:27;;;;;;;;;;;;;;:2;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13047:27:0;13091:21;;13047:27;;-1:-1:-1;13091:26:0;;:43;;-1:-1:-1;13121:13:0;;13091:43;13087:133;;;-1:-1:-1;13175:12:0;13151:21;:36;13202:7;;13087:133;13232:11;13246:52;13262:21;;13285:12;13246:15;:52::i;:::-;13319:5;;;:33;;;-1:-1:-1;;;13319:33:0;;13338:4;13319:33;;;;;;;;;;;;13232:66;;-1:-1:-1;;;;;;13319:5:0;;;;:10;;:33;;;;;:5;;:33;;;;;;:5;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13363:5:0;;13374:10;;-1:-1:-1;;;;;13363:5:0;;;;-1:-1:-1;13363:10:0;;-1:-1:-1;13374:10:0;13386:43;13415:13;13386:24;:6;10037;13386:10;:24::i;:43::-;13363:67;;;;;;;;;;;;;-1:-1:-1;;;;;13363:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13441:5:0;;-1:-1:-1;;;;;13441:5:0;;-1:-1:-1;13441:10:0;;-1:-1:-1;13452:8:0;13462:41;13489:13;13462:22;:6;10090;13462:10;:22::i;:41::-;13441:63;;;;;;;;;;;;;-1:-1:-1;;;;;13441:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13540:80;13579:30;13600:8;13579:16;13590:4;13579:6;:10;;:16;;;;:::i;:30::-;13540:20;;;:24;:80::i;:::-;13517:20;:103;13655:12;13631:21;:36;13699:24;;:59;;9017:5;13699:28;:59::i;:::-;13683:12;:75;13680:209;;13793:30;13821:1;13793:23;13814:1;13793:16;;:20;;:23;;;;:::i;:30::-;13774:16;:49;13865:12;13838:24;:39;13680:209;12988:908;;:::o;12257:673::-;12326:4;12342:11;12378;12369:5;:20;;:42;;;;;12400:11;12393:3;:18;;12369:42;12366:509;;;12479:9;12470:5;:18;;:38;;;;;12499:9;12492:3;:16;;12470:38;12467:397;;;12537:14;:3;12545:5;12537:7;:14::i;:::-;12528:23;;12467:397;;;12642:9;12633:5;:18;;:37;;;;;12661:9;12655:3;:15;12633:37;12630:234;;;12699:20;:9;12713:5;12699:13;:20::i;12630:234::-;12790:9;12782:5;:17;:36;;;;;12809:9;12803:3;:15;12782:36;12779:85;;;-1:-1:-1;12847:1:0;12779:85;12894:28;:6;12905:16;12894:10;:28::i;11964:260::-;12033:4;12049:11;12085;12076:5;:20;;:42;;;;;12107:11;12100:3;:18;;12076:42;12073:96;;;12143:14;:3;12151:5;12143:7;:14::i;:::-;12134:23;;12073:96;12199:16;;12188:28;;:6;;:10;:28::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://0a4d01bf19c9be3ae010a82ca714584710abfd893d36fa31692f3ceea195c38f

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.