Contract 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f 12

 
Txn Hash Method
Block
From
To
Value
0x41f03a2371b5c18be2a25dc11e0ffee334a7d9a9b83ca4fee771d14793a66a7dGet Reward1178497632024-03-24 16:38:233 days 16 hrs ago0x46c1cf78d5d274992d0536694b5aa5989699293c IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000037553710.0084827
0x69e4ad1e7448f18be97f69fa705f0457f40d1533cb7a488afdbdb5fb4cb23a1bWithdraw1178497302024-03-24 16:37:173 days 16 hrs ago0x46c1cf78d5d274992d0536694b5aa5989699293c IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000024332940.0079391
0x0c49bc9bd6aa201ca8c6b804a9dc790d847433b41a70ad5f0f94d93ced048768Get Reward1164286152024-02-20 19:06:4736 days 14 hrs ago0xf25696defd305ed9cb5fa9bba406a3710f3d1c32 IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000644536140.004181401
0x386920d366901a9da726838a5000b6bf6d9d9a18332f3a3b9551998ea7118b3dWithdraw1163349632024-02-18 15:05:0338 days 18 hrs ago0x5cf016785a2e2ec92054a991db98d3a9a947f431 IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000358865630.006443173
0x09931676cb1eb326d8776921b0733761d8186b445336e760d52dc33bd2181e20Get Reward1163349542024-02-18 15:04:4538 days 18 hrs ago0x5cf016785a2e2ec92054a991db98d3a9a947f431 IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000494805240.006561369
0x2fb09953c7432a42ac9e16232e951e21dd77c9bb8a71efc11f6dc91e8c2c5346Withdraw Token1163344482024-02-18 14:47:5338 days 18 hrs ago0x5cf016785a2e2ec92054a991db98d3a9a947f431 IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000397684760.00594473
0xfcbe654435edf1da623502dd6b6a3f2af34b0179051e12a1af037665558cad70Get Reward1160490632024-02-12 0:15:0345 days 9 hrs ago0x37c14240884086a671ac959e66c9fdc84d63331e IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000627800820.0024658
0xe998a414c600e3a0aca8de48feaf1300e83c1ae127d1b74384c5adf1cd7e5264Withdraw1160490422024-02-12 0:14:2145 days 9 hrs ago0x37c14240884086a671ac959e66c9fdc84d63331e IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000460293830.0030561
0xce930ece3013e1f947de6ff1833a7ab24176f448372de519892f36d4fbb3cb3eWithdraw Token1147833542024-01-13 17:04:4574 days 16 hrs ago0xc557c8b817e241856cac6b4415c1c081ab0d5989 IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000364284850.005926446
0xc9b8d4e09c9a6bb3c1e523715dbaf5b0a5d0bd7d55f3b07390d518b9985a21f8Get Reward1117675822023-11-04 21:39:01144 days 11 hrs ago0xcca2db1d2097e69011e34592eb6a07e07e348356 IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000272356270.009172453
0x5c670ad4ea2101100b72aa4c74ca5900131a8cbb8bb4f129b140a4e7fe2a2bd4Get Reward1116698032023-11-02 15:19:43146 days 18 hrs ago0x6505f5b020bf853a741cd72f803d3a099a5adb2e IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000876697380.035556845
0x8886b7093baabbf5426704e5e6abc4fa1dfdfcac23905ae55de8fa175b547192Withdraw1116695992023-11-02 15:12:55146 days 18 hrs ago0x6505f5b020bf853a741cd72f803d3a099a5adb2e IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000560529660.016403823
0x1bb0d5c11a740c80fe76c34d5ab9b6e75ce6a168975a0cab6f37302ef493721aWithdraw1111636372023-10-21 22:07:31158 days 11 hrs ago0x9f8ace53e22619a1eeb214e64731f95594cb07a4 IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000204943250.018270629
0xca5ede98ef7df0a8e2e11050f6ea5990fe854db35311de4ba5892997acba14f2Get Reward1108455022023-10-14 13:23:01165 days 20 hrs ago0x806346b423ddb4727c1f5dc718886430aa7ce9cf IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000579916470.1154718
0x057dc376244ff75d3e1969035d3bd27264ec2ce7f8dc5325801aedee9a290998Get Reward1107954322023-10-13 9:34:01167 days ago0xc50a08633e285c096828532701e2ba24a9aef30e IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000554790860.1141322
0x8acc72cc998ef6cd1ddca9e2ebf10e23029d809d6f562f9445ede4a05c197e9aWithdraw1107953542023-10-13 9:31:25167 days 3 mins ago0xc50a08633e285c096828532701e2ba24a9aef30e IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000443423940.1171556
0xe33498e6ba1b320d498a287af5782fdcdba51197c04310641dbfe7f350022830Withdraw1098301682023-09-21 1:18:33189 days 8 hrs ago0xda2f80295cf2252c58c8a4b9584931e911aaa04e IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000331040740.062502687
0xafea46836f38f4be9ad1725b23b2037df9dda66a3caec03af97bac6465c0b306Get Reward1098301542023-09-21 1:18:05189 days 8 hrs ago0xda2f80295cf2252c58c8a4b9584931e911aaa04e IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000436479620.068555603
0x1ed68deaf72a32086a2da47d434dc758f94020450d29f10f28b2b9a212c9778bGet Reward1097206532023-09-18 12:28:03191 days 21 hrs ago0x19c21f89e318e0c70f7f84b480584faef5fbb727 IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000507242030.117180231
0x9f5911b48738f0caee7ad1d6cf97ef6e6ea9f7d13dbb9cea8df48b8f1ed732ddWithdraw Token1094700592023-09-12 17:14:55197 days 16 hrs ago0x024af6a5b1caf3ccc7e98136c4e557fb5e291528 IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000611852480.08
0xddb6b797f968d5752f02f2baa22df0eeeb008603814d5c5bcdf0f1b57dd50939Get Reward1094506282023-09-12 6:27:13198 days 3 hrs ago0xa058f9d15551edab64fff26203e53b5b40c0f55c IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000176087460.00001071
0xaac0f1bfeab420713468cebb76db32784b86481fb5e761221d6b45733f37008bWithdraw1094505972023-09-12 6:26:11198 days 3 hrs ago0xa058f9d15551edab64fff26203e53b5b40c0f55c IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000114795990.000009945
0xb24e3195fe20ba6f91002acb15ba29f11ced3b4769db6aa0108aa607c334a739Withdraw1094015422023-09-11 3:11:01199 days 6 hrs ago0x60672216b00c41bd7aff704c61954bea8f081bee IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000259752930.047377716
0x8f7e4ffd3f1f7873b66168cd5af1b795bf31867970714cdb28df30523abff9abGet Reward1094015362023-09-11 3:10:49199 days 6 hrs ago0x60672216b00c41bd7aff704c61954bea8f081bee IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000456272740.077599998
0x1db887ddb96a37974b5e595d7c23f988c369df6b72efcdf2a494601c16343f40Withdraw1091848172023-09-06 2:46:51204 days 6 hrs ago0xed9a912182745fe101ecb4291d00b802d982ba0f IN  0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH0.0000189631210.000000107
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x1fc6ad5ce55d49e534c5bb0c786d1ad2ed4f68a771bf9cb9451b54fcec4f14971075539792023-07-30 8:45:35242 days 49 mins ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f Velodrome Finance: Voter0 ETH
0x1fc6ad5ce55d49e534c5bb0c786d1ad2ed4f68a771bf9cb9451b54fcec4f14971075539792023-07-30 8:45:35242 days 49 mins ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f 0x9056eb7ca982a5dd65a584189994e6a27318067d0 ETH
0x68665accb7bdc895425331e7c6fbabba7f883be42cac099f07f59730b93e7f271075539652023-07-30 8:45:07242 days 49 mins ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f Velodrome Finance: VELO Token0 ETH
0x68665accb7bdc895425331e7c6fbabba7f883be42cac099f07f59730b93e7f271075539652023-07-30 8:45:07242 days 49 mins ago Velodrome Finance: Voter 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH
0x68665accb7bdc895425331e7c6fbabba7f883be42cac099f07f59730b93e7f271075539652023-07-30 8:45:07242 days 49 mins ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f Velodrome Finance: Voter0 ETH
0x5fa8472d262eb3ca4469456c563b90d449b9cda55498a1f57693317a8ae1e5c81075261292023-07-29 17:17:15242 days 16 hrs ago 0x4ed766af5b30a4695f7b247ae1bb0f6b34bc6378 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH
0x5fa8472d262eb3ca4469456c563b90d449b9cda55498a1f57693317a8ae1e5c81075261292023-07-29 17:17:15242 days 16 hrs ago 0x4ed766af5b30a4695f7b247ae1bb0f6b34bc6378 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH
0x5fa8472d262eb3ca4469456c563b90d449b9cda55498a1f57693317a8ae1e5c81075261292023-07-29 17:17:15242 days 16 hrs ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f Velodrome Finance: Voter0 ETH
0x5fa8472d262eb3ca4469456c563b90d449b9cda55498a1f57693317a8ae1e5c81075261292023-07-29 17:17:15242 days 16 hrs ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f 0x9056eb7ca982a5dd65a584189994e6a27318067d0 ETH
0x5fa8472d262eb3ca4469456c563b90d449b9cda55498a1f57693317a8ae1e5c81075261292023-07-29 17:17:15242 days 16 hrs ago 0x4ed766af5b30a4695f7b247ae1bb0f6b34bc6378 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH
0x5fa8472d262eb3ca4469456c563b90d449b9cda55498a1f57693317a8ae1e5c81075261292023-07-29 17:17:15242 days 16 hrs ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f Velodrome Finance: VELO Token0 ETH
0x5fa8472d262eb3ca4469456c563b90d449b9cda55498a1f57693317a8ae1e5c81075261292023-07-29 17:17:15242 days 16 hrs ago Velodrome Finance: Voter 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH
0x5fa8472d262eb3ca4469456c563b90d449b9cda55498a1f57693317a8ae1e5c81075261292023-07-29 17:17:15242 days 16 hrs ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f Velodrome Finance: Voter0 ETH
0x5fa8472d262eb3ca4469456c563b90d449b9cda55498a1f57693317a8ae1e5c81075261292023-07-29 17:17:15242 days 16 hrs ago 0x4ed766af5b30a4695f7b247ae1bb0f6b34bc6378 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH
0x081e17b912161d628014de92b6e96c65b01c53f9065ff7f1420cc19844514e0c1075075562023-07-29 6:58:09243 days 2 hrs ago 0xefd068aac9b0bcb4232ca33b5beb5aa546563a9e 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH
0x081e17b912161d628014de92b6e96c65b01c53f9065ff7f1420cc19844514e0c1075075562023-07-29 6:58:09243 days 2 hrs ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f Velodrome Finance: Voter0 ETH
0x081e17b912161d628014de92b6e96c65b01c53f9065ff7f1420cc19844514e0c1075075562023-07-29 6:58:09243 days 2 hrs ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f 0x9056eb7ca982a5dd65a584189994e6a27318067d0 ETH
0x081e17b912161d628014de92b6e96c65b01c53f9065ff7f1420cc19844514e0c1075075562023-07-29 6:58:09243 days 2 hrs ago 0xefd068aac9b0bcb4232ca33b5beb5aa546563a9e 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH
0x61f47626f9d12da1c425c5f3d0a928fb7bfcc23495e5b7d557c5cebdf18cee9d1075036062023-07-29 4:46:29243 days 4 hrs ago 0xefd068aac9b0bcb4232ca33b5beb5aa546563a9e 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH
0x61f47626f9d12da1c425c5f3d0a928fb7bfcc23495e5b7d557c5cebdf18cee9d1075036062023-07-29 4:46:29243 days 4 hrs ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f Velodrome Finance: Voter0 ETH
0x61f47626f9d12da1c425c5f3d0a928fb7bfcc23495e5b7d557c5cebdf18cee9d1075036062023-07-29 4:46:29243 days 4 hrs ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f 0x9056eb7ca982a5dd65a584189994e6a27318067d0 ETH
0x61f47626f9d12da1c425c5f3d0a928fb7bfcc23495e5b7d557c5cebdf18cee9d1075036062023-07-29 4:46:29243 days 4 hrs ago 0xefd068aac9b0bcb4232ca33b5beb5aa546563a9e 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH
0x61f47626f9d12da1c425c5f3d0a928fb7bfcc23495e5b7d557c5cebdf18cee9d1075036062023-07-29 4:46:29243 days 4 hrs ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f Velodrome Finance: VELO Token0 ETH
0x61f47626f9d12da1c425c5f3d0a928fb7bfcc23495e5b7d557c5cebdf18cee9d1075036062023-07-29 4:46:29243 days 4 hrs ago Velodrome Finance: Voter 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f0 ETH
0x61f47626f9d12da1c425c5f3d0a928fb7bfcc23495e5b7d557c5cebdf18cee9d1075036062023-07-29 4:46:29243 days 4 hrs ago 0x099b3368eb5bbe6f67f14a791ecaef8bc1628a7f Velodrome Finance: Voter0 ETH
[ Download CSV Export 
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x6b8edc43de878fd5cd5113c42747d32500db3873
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
Gauge

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Optimistic.Etherscan.io on 2022-06-01
*/

// File: contracts/interfaces/IVotingEscrow.sol

pragma solidity 0.8.13;

interface IVotingEscrow {

    struct Point {
        int128 bias;
        int128 slope; // # -dweight / dt
        uint256 ts;
        uint256 blk; // block
    }

    function token() external view returns (address);
    function team() external returns (address);
    function epoch() external view returns (uint);
    function point_history(uint loc) external view returns (Point memory);
    function user_point_history(uint tokenId, uint loc) external view returns (Point memory);
    function user_point_epoch(uint tokenId) external view returns (uint);

    function ownerOf(uint) external view returns (address);
    function isApprovedOrOwner(address, uint) external view returns (bool);
    function transferFrom(address, address, uint) external;

    function voting(uint tokenId) external;
    function abstain(uint tokenId) external;
    function attach(uint tokenId) external;
    function detach(uint tokenId) external;

    function checkpoint() external;
    function deposit_for(uint tokenId, uint value) external;
    function create_lock_for(uint, uint, address) external returns (uint);

    function balanceOfNFT(uint) external view returns (uint);
    function totalSupply() external view returns (uint);
}

// File: contracts/interfaces/IVoter.sol

pragma solidity 0.8.13;

interface IVoter {
    function _ve() external view returns (address);
    function governor() external view returns (address);
    function emergencyCouncil() external view returns (address);
    function attachTokenToGauge(uint _tokenId, address account) external;
    function detachTokenFromGauge(uint _tokenId, address account) external;
    function emitDeposit(uint _tokenId, address account, uint amount) external;
    function emitWithdraw(uint _tokenId, address account, uint amount) external;
    function isWhitelisted(address token) external view returns (bool);
    function notifyRewardAmount(uint amount) external;
    function distribute(address _gauge) external;
}

// File: contracts/interfaces/IPair.sol

pragma solidity 0.8.13;

interface IPair {
    function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1);
    function claimFees() external returns (uint, uint);
    function tokens() external returns (address, address);
    function transferFrom(address src, address dst, uint amount) external returns (bool);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function burn(address to) external returns (uint amount0, uint amount1);
    function mint(address to) external returns (uint liquidity);
    function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast);
    function getAmountOut(uint, address) external view returns (uint);
}

// File: contracts/interfaces/IGauge.sol

pragma solidity 0.8.13;

interface IGauge {
    function notifyRewardAmount(address token, uint amount) external;
    function getReward(address account, address[] memory tokens) external;
    function claimFees() external returns (uint claimed0, uint claimed1);
    function left(address token) external view returns (uint);
    function isForPair() external view returns (bool);
}

// File: contracts/interfaces/IERC20.sol

pragma solidity 0.8.13;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

// File: contracts/interfaces/IBribe.sol

pragma solidity 0.8.13;

interface IBribe {
    function _deposit(uint amount, uint tokenId) external;
    function _withdraw(uint amount, uint tokenId) external;
    function getRewardForOwner(uint tokenId, address[] memory tokens) external;
    function notifyRewardAmount(address token, uint amount) external;
    function left(address token) external view returns (uint);
}

// File: contracts/libraries/Math.sol

pragma solidity 0.8.13;

library Math {
    function max(uint a, uint b) internal pure returns (uint) {
        return a >= b ? a : b;
    }
    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
    function cbrt(uint256 n) internal pure returns (uint256) { unchecked {
        uint256 x = 0;
        for (uint256 y = 1 << 255; y > 0; y >>= 3) {
            x <<= 1;
            uint256 z = 3 * x * (x + 1) + 1;
            if (n / y >= z) {
                n -= y * z;
                x += 1;
            }
        }
        return x;
    }}
}

// File: contracts/Gauge.sol


pragma solidity 0.8.13;








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

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

    uint public derivedSupply;
    mapping(address => uint) public derivedBalances;

    bool public isForPair;

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

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

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

    mapping(address => uint) public tokenIds;

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

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

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

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

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

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

    uint public fees0;
    uint public fees1;

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

    constructor(address _stake, address _internal_bribe, address _external_bribe, address  __ve, address _voter, bool _forPair, address[] memory _allowedRewardTokens) {
        stake = _stake;
        internal_bribe = _internal_bribe;
        external_bribe = _external_bribe;
        _ve = __ve;
        voter = _voter;
        isForPair = _forPair;

        for (uint i; i < _allowedRewardTokens.length; i++) {
            if (_allowedRewardTokens[i] != address(0)) {
                isReward[_allowedRewardTokens[i]] = true;
                rewards.push(_allowedRewardTokens[i]);
            }
        }
    }

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

    function claimFees() external lock returns (uint claimed0, uint claimed1) {
        return _claimFees();
    }

    function _claimFees() internal returns (uint claimed0, uint claimed1) {
        if (!isForPair) {
            return (0, 0);
        }
        (claimed0, claimed1) = IPair(stake).claimFees();
        if (claimed0 > 0 || claimed1 > 0) {
            uint _fees0 = fees0 + claimed0;
            uint _fees1 = fees1 + claimed1;
            (address _token0, address _token1) = IPair(stake).tokens();
            if (_fees0 > IBribe(internal_bribe).left(_token0) && _fees0 / DURATION > 0) {
                fees0 = 0;
                _safeApprove(_token0, internal_bribe, _fees0);
                IBribe(internal_bribe).notifyRewardAmount(_token0, _fees0);
            } else {
                fees0 = _fees0;
            }
            if (_fees1 > IBribe(internal_bribe).left(_token1) && _fees1 / DURATION > 0) {
                fees1 = 0;
                _safeApprove(_token1, internal_bribe, _fees1);
                IBribe(internal_bribe).notifyRewardAmount(_token1, _fees1);
            } else {
                fees1 = _fees1;
            }

            emit ClaimFees(msg.sender, claimed0, claimed1);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint _reward = earned(tokens[i], account);
            lastEarn[tokens[i]][account] = block.timestamp;
            userRewardPerTokenStored[tokens[i]][account] = rewardPerTokenStored[tokens[i]];
            if (_reward > 0) _safeTransfer(tokens[i], account, _reward);

            emit ClaimRewards(msg.sender, tokens[i], _reward);
        }

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

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


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

    function derivedBalance(address account) public view returns (uint) {
        return balanceOf[account];
    }

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

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

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

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

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

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

        return (reward, _startTimestamp);
    }

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

    /// @dev Update stored rewardPerToken values without the last one snapshot
    ///      If the contract will get "out of gas" error on users actions this will be helpful
    function batchUpdateRewardPerToken(address token, uint maxRuns) external {
      (rewardPerTokenStored[token], lastUpdateTime[token]) = _updateRewardPerToken(token, maxRuns, false);
    }

    function _updateRewardForAllTokens() internal {
      uint length = rewards.length;
      for (uint i; i < length; i++) {
        address token = rewards[i];
        (rewardPerTokenStored[token], lastUpdateTime[token]) = _updateRewardPerToken(token, type(uint).max, true);
      }
    }

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

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

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

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

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

        // need to override the last value with actual numbers only on deposit/withdraw/claim/notify actions
        if (actualLast) {
            SupplyCheckpoint memory sp = supplyCheckpoints[_endIndex];
            if (sp.supply > 0) {
                (uint _reward,) = _calcRewardPerToken(token, lastTimeRewardApplicable(token), Math.max(sp.timestamp, _startTimestamp), sp.supply, _startTimestamp);
                reward += _reward;
                _writeRewardPerTokenCheckpoint(token, reward, block.timestamp);
                _startTimestamp = block.timestamp;
            }
        }

        return (reward, _startTimestamp);
    }

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

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

        uint reward = 0;

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

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

        return reward;
    }

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

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

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

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

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

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

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

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

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

    function withdrawToken(uint amount, uint tokenId) public lock {
        _updateRewardForAllTokens();

        totalSupply -= amount;
        balanceOf[msg.sender] -= amount;
        _safeTransfer(stake, msg.sender, amount);

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

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

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

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

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

    function notifyRewardAmount(address token, uint amount) external lock {
        require(token != stake);
        require(amount > 0);
        if (!isReward[token]) {
            require(IVoter(voter).isWhitelisted(token), "rewards tokens must be whitelisted");
            require(rewards.length < MAX_REWARD_TOKENS, "too many rewards tokens");
        }
        if (rewardRate[token] == 0) _writeRewardPerTokenCheckpoint(token, 0, block.timestamp);
        (rewardPerTokenStored[token], lastUpdateTime[token]) = _updateRewardPerToken(token, type(uint).max, true);
        _claimFees();

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

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

    function swapOutRewardToken(uint i, address oldToken, address newToken) external {
        require(msg.sender == IVotingEscrow(_ve).team(), 'only team');
        require(rewards[i] == oldToken);
        isReward[oldToken] = false;
        isReward[newToken] = true;
        rewards[i] = newToken;
    }

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_stake","type":"address"},{"internalType":"address","name":"_internal_bribe","type":"address"},{"internalType":"address","name":"_external_bribe","type":"address"},{"internalType":"address","name":"__ve","type":"address"},{"internalType":"address","name":"_voter","type":"address"},{"internalType":"bool","name":"_forPair","type":"bool"},{"internalType":"address[]","name":"_allowedRewardTokens","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimed0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claimed1","type":"uint256"}],"name":"ClaimFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NotifyReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"maxRuns","type":"uint256"}],"name":"batchRewardPerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"maxRuns","type":"uint256"}],"name":"batchUpdateRewardPerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"checkpoints","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"balanceOf","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFees","outputs":[{"internalType":"uint256","name":"claimed0","type":"uint256"},{"internalType":"uint256","name":"claimed1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"derivedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"derivedBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"derivedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"external_bribe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getPriorBalanceIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getPriorRewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getPriorSupplyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"internal_bribe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isForPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"lastEarn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"left","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPerTokenCheckpoints","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"rewardPerToken","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardPerTokenNumCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stake","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyCheckpoints","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyNumCheckpoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"address","name":"oldToken","type":"address"},{"internalType":"address","name":"newToken","type":"address"}],"name":"swapOutRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102955760003560e01c8063853828b611610167578063d7da4bb0116100ce578063f122977711610087578063f1229777146106fe578063f301af4214610711578063f7412baf14610724578063fc97a3031461074b578063fd3140981461076b578063fdb483c71461077e57600080fd5b8063d7da4bb0146106a4578063da09d19d146106ad578063e2bbb158146106cd578063e5748213146106e0578063e6886396146106ed578063e8111a12146106f557600080fd5b8063a495e5b511610120578063a495e5b514610602578063aa4796521461062d578063b66503cf1461064d578063c6f678bd14610660578063d294f09314610673578063d35e25441461067b57600080fd5b8063853828b6146105845780638dd598fb1461058c57806393f1c442146105b35780639418f939146105bc57806399bcc052146105cf5780639ce43f90146105e257600080fd5b80633ca068b61161020b57806363fb415b116101c457806363fb415b146104d757806368fcee1a146104f75780636fcfff451461050a57806370a082311461052a57806376f4be361461054a578063770f85711461055d57600080fd5b80633ca068b61461042357806346c96aac1461044e5780634c02a21c146104755780634d5ce0381461047e5780635a45d052146104b1578063638634ee146104c457600080fd5b8063211dc32d1161025d578063211dc32d14610381578063221ca18c146103945780632ce9aead146103b45780632e1a7d4d146103d457806331279d3d146103e95780633a4b66f1146103fc57600080fd5b806301316ddf1461029a57806303fbf83a146102e65780630cdfebfa14610325578063115c6f391461035757806318160ddd14610378575b600080fd5b6102cc6102a836600461303d565b60126020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152015b60405180910390f35b61030d7f00000000000000000000000042ea76108c3cf6614153c7ac0239678753d8804681565b6040516001600160a01b0390911681526020016102dd565b6102cc61033336600461303d565b600e6020908152600092835260408084209091529082529020805460019091015482565b61036a61036536600461303d565b610791565b6040519081526020016102dd565b61036a600a5481565b61036a61038f366004613069565b610900565b61036a6103a23660046130a2565b60036020526000908152604090205481565b61036a6103c23660046130a2565b60056020526000908152604090205481565b6103e76103e23660046130bf565b610b84565b005b6103e76103f73660046130ee565b610bba565b61030d7f0000000000000000000000009056eb7ca982a5dd65a584189994e6a27318067d81565b61036a610431366004613069565b600860209081526000928352604080842090915290825290205481565b61030d7f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e81565b61036a60155481565b6104a161048c3660046130a2565b600d6020526000908152604090205460ff1681565b60405190151581526020016102dd565b6103e76104bf36600461303d565b610fba565b61036a6104d23660046130a2565b610ff2565b61036a6104e53660046130a2565b60016020526000908152604090205481565b6103e761050536600461303d565b611016565b61036a6105183660046130a2565b600f6020526000908152604090205481565b61036a6105383660046130a2565b600b6020526000908152604090205481565b61036a6105583660046130bf565b611022565b61030d7f00000000000000000000000028786388d30e322bffbaff851c6fac958963b43d81565b6103e7611156565b61030d7f0000000000000000000000009c7305eb78a432ced5c4d14cac27e8ed569a2e2681565b61036a60145481565b6103e76105ca3660046131c8565b611171565b61036a6105dd3660046130a2565b611302565b61036a6105f03660046130a2565b60066020526000908152604090205481565b61036a610610366004613069565b600760209081526000928352604080842090915290825290205481565b61036a61063b3660046130a2565b60136020526000908152604090205481565b6103e761065b36600461303d565b611373565b6103e761066e3660046130bf565b611865565b6102cc6118fa565b61036a6106893660046130a2565b6001600160a01b03166000908152600b602052604090205490565b61036a60005481565b61036a6106bb3660046130a2565b60046020526000908152604090205481565b6103e76106db36600461320a565b611926565b6002546104a19060ff1681565b600c5461036a565b61036a60115481565b61036a61070c3660046130a2565b611c73565b61030d61071f3660046130bf565b611d32565b6102cc6107323660046130bf565b6010602052600090815260409020805460019091015482565b61036a6107593660046130a2565b60096020526000908152604090205481565b6102cc61077936600461303d565b611d5c565b6103e761078c36600461320a565b611f7d565b6001600160a01b0382166000908152600f60205260408120548082036107bb5760009150506108fa565b6001600160a01b0384166000908152600e6020526040812084916107e0600185613242565b8152602001908152602001600020600001541161080a57610802600182613242565b9150506108fa565b6001600160a01b0384166000908152600e6020908152604080832083805290915290205483101561083f5760009150506108fa565b60008061084d600184613242565b90505b818111156108f557600060026108668484613242565b6108709190613259565b61087a9083613242565b6001600160a01b0388166000908152600e602090815260408083208484528252918290208251808401909352805480845260019091015491830191909152919250908790036108cf575093506108fa92505050565b80518711156108e0578193506108ee565b6108eb600183613242565b92505b5050610850565b509150505b92915050565b6001600160a01b0380831660008181526007602090815260408083209486168352938152838220549282526012815283822082805290529182205482916109469161220c565b6001600160a01b0384166000908152600f6020526040812054919250036109715760009150506108fa565b600061097d8483610791565b6001600160a01b0385166000908152600f6020526040812054919250906109a690600190613242565b905060008115610ab857825b6109bd600184613242565b8111610ab6576001600160a01b0387166000818152600e602081815260408084208685528083528185208251808401909352805483526001908101548385015295855292909152928290610a1290869061327b565b81526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000610a518b8460000151611d5c565b5090506000610a648c8460000151611d5c565b509050670de0b6b3a7640000610a7a8383613242565b8560200151610a899190613293565b610a939190613259565b610a9d908761327b565b9550505050508080610aae906132b2565b9150506109b2565b505b6001600160a01b0386166000908152600e60209081526040808320858452825280832081518083019092528054808352600190910154928201929092529190610b02908a90611d5c565b506001600160a01b03808b166000908152600860209081526040808320938d1683529290522054909150670de0b6b3a764000090610b4190839061220c565b610b4a8b611c73565b610b549190613242565b8360200151610b639190613293565b610b6d9190613259565b610b77908461327b565b9998505050505050505050565b336000908152600b60205260408120548203610bac5750336000908152600960205260409020545b610bb68282611f7d565b5050565b601654600114610bc957600080fd5b6002601655336001600160a01b0383161480610c0d5750336001600160a01b037f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e16145b610c1657600080fd5b60016016556040516363453ae160e01b81523060048201527f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e6001600160a01b0316906363453ae190602401600060405180830381600087803b158015610c7c57600080fd5b505af1158015610c90573d6000803e3d6000fd5b5050600260165550600090505b8151811015610f1357610ccd828281518110610cbb57610cbb6132cb565b60200260200101516000196001612223565b60066000858581518110610ce357610ce36132cb565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600060056000878781518110610d2357610d236132cb565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008491905055839190505550506000610d7e838381518110610d7057610d706132cb565b602002602001015185610900565b90504260076000858581518110610d9757610d976132cb565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000866001600160a01b03166001600160a01b031681526020019081526020016000208190555060066000848481518110610dfc57610dfc6132cb565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205460086000858581518110610e3b57610e3b6132cb565b6020908102919091018101516001600160a01b039081168352828201939093526040918201600090812093891681529290529020558015610e9a57610e9a838381518110610e8b57610e8b6132cb565b60200260200101518583612413565b828281518110610eac57610eac6132cb565b60200260200101516001600160a01b0316336001600160a01b03167f9aa05b3d70a9e3e2f004f039648839560576334fb45c81f91b6db03ad9e2efc983604051610ef891815260200190565b60405180910390a35080610f0b816132b2565b915050610c9d565b506001600160a01b0382166000908152600160205260408120548154909182918190610f40908490613242565b9091555050506001600160a01b0382166000908152600b6020908152604080832054600190925282208190558154909182918190610f7f90849061327b565b90915550506001600160a01b038316600090815260016020526040902054610fa8908490612513565b610fb061261e565b5050600160165550565b610fc482826126c1565b6001600160a01b03909316600090815260066020908152604080832060059092529091209390935590915550565b6001600160a01b0381166000908152600460205260408120546108fa904290612824565b610fc482826000612223565b6011546000908082036110385750600092915050565b8260106000611048600185613242565b815260200190815260200160002060000154116110715761106a600182613242565b9392505050565b6000805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01548310156110ac5750600092915050565b6000806110ba600184613242565b90505b8181111561114e57600060026110d38484613242565b6110dd9190613259565b6110e79083613242565b600081815260106020908152604091829020825180840190935280548084526001909101549183019190915291925090879003611128575095945050505050565b805187111561113957819350611147565b611144600183613242565b92505b50506110bd565b509392505050565b336000908152600b602052604090205461116f90610b84565b565b7f0000000000000000000000009c7305eb78a432ced5c4d14cac27e8ed569a2e266001600160a01b03166385f2aef26040518163ffffffff1660e01b81526004016020604051808303816000875af11580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f591906132e1565b6001600160a01b0316336001600160a01b0316146112465760405162461bcd60e51b81526020600482015260096024820152686f6e6c79207465616d60b81b60448201526064015b60405180910390fd5b816001600160a01b0316600c8481548110611263576112636132cb565b6000918252602090912001546001600160a01b03161461128257600080fd5b6001600160a01b038083166000908152600d6020526040808220805460ff199081169091559284168252902080549091166001179055600c8054829190859081106112cf576112cf6132cb565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b6001600160a01b038116600090815260046020526040812054421061132957506000919050565b6001600160a01b03821660009081526004602052604081205461134d904290613242565b6001600160a01b03841660009081526003602052604090205490915061106a9082613293565b60165460011461138257600080fd5b60026016556001600160a01b037f0000000000000000000000009056eb7ca982a5dd65a584189994e6a27318067d8116908316036113bf57600080fd5b600081116113cc57600080fd5b6001600160a01b0382166000908152600d602052604090205460ff1661151f57604051633af32abf60e01b81526001600160a01b0383811660048301527f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e1690633af32abf90602401602060405180830381865afa158015611452573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147691906132fe565b6114cd5760405162461bcd60e51b815260206004820152602260248201527f7265776172647320746f6b656e73206d7573742062652077686974656c697374604482015261195960f21b606482015260840161123d565b600c5460101161151f5760405162461bcd60e51b815260206004820152601760248201527f746f6f206d616e79207265776172647320746f6b656e73000000000000000000604482015260640161123d565b6001600160a01b038216600090815260036020526040812054900361154a5761154a82600042612833565b611558826000196001612223565b6001600160a01b038416600090815260066020908152604080832060059092529091209190915555611588612922565b50506001600160a01b03821660009081526004602052604090205442106115e0576115b582333084612d97565b6115c262093a8082613259565b6001600160a01b038316600090815260036020526040902055611679565b6001600160a01b038216600090815260046020526040812054611604904290613242565b6001600160a01b0384166000908152600360205260408120549192509061162b9083613293565b905080831161163957600080fd5b61164584333086612d97565b62093a80611653828561327b565b61165d9190613259565b6001600160a01b03851660009081526003602052604090205550505b6001600160a01b03821660009081526003602052604090205461169b57600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156116e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117069190613320565b905061171562093a8082613259565b6001600160a01b038416600090815260036020526040902054111561177c5760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015260640161123d565b61178962093a804261327b565b6001600160a01b038416600090815260046020908152604080832093909355600d9052205460ff1661181b576001600160a01b0383166000818152600d60205260408120805460ff19166001908117909155600c805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b03191690911790555b6040518281526001600160a01b0384169033907ff70d5c697de7ea828df48e5c4573cb2194c659f1901f70110c52b066dcf508269060200160405180910390a35050600160165550565b6040516370a0823160e01b81523360048201526118f7907f0000000000000000000000009056eb7ca982a5dd65a584189994e6a27318067d6001600160a01b0316906370a0823190602401602060405180830381865afa1580156118cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f19190613320565b82611926565b50565b60008060165460011461190c57600080fd5b6002601655611919612922565b9150915060016016559091565b60165460011461193557600080fd5b60026016558161194457600080fd5b61194c612e8f565b6119787f0000000000000000000000009056eb7ca982a5dd65a584189994e6a27318067d333085612d97565b81600a600082825461198a919061327b565b9091555050336000908152600b6020526040812080548492906119ae90849061327b565b90915550508015611b22576040516331a9108f60e11b81526004810182905233906001600160a01b037f0000000000000000000000009c7305eb78a432ced5c4d14cac27e8ed569a2e261690636352211e90602401602060405180830381865afa158015611a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4491906132e1565b6001600160a01b031614611a5757600080fd5b336000908152600960205260408120549003611b025733600081815260096020526040908190208390555163698473e360e01b81526004810183905260248101919091526001600160a01b037f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e169063698473e390604401600060405180830381600087803b158015611ae957600080fd5b505af1158015611afd573d6000803e3d6000fd5b505050505b336000908152600960205260409020548114611b1d57600080fd5b611b34565b50336000908152600960205260409020545b336000908152600160205260408120548154909182918190611b57908490613242565b9091555050336000908152600b60209081526040808320546001909252822081905581549092508291908190611b8e90849061327b565b90915550611b9e90503382612513565b611ba661261e565b60405163530e389d60e11b815260048101839052336024820152604481018490527f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e6001600160a01b03169063a61c713a90606401600060405180830381600087803b158015611c1557600080fd5b505af1158015611c29573d6000803e3d6000fd5b505060408051858152602081018790523393507f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159250015b60405180910390a25050600160165550565b60008054600003611c9a57506001600160a01b031660009081526006602052604090205490565b600080546001600160a01b038416825260036020908152604080842054600583528185205460049093529320549192670de0b6b3a7640000929091611cde91612824565b611ce786610ff2565b611cf19190613242565b611cfb9190613293565b611d059190613293565b611d0f9190613259565b6001600160a01b0383166000908152600660205260409020546108fa919061327b565b600c8181548110611d4257600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b0382166000908152601360205260408120548190808203611d8b576000809250925050611f76565b6001600160a01b03851660009081526012602052604081208591611db0600185613242565b81526020019081526020016000206000015411611e4d576001600160a01b038516600090815260126020526040812090611deb600184613242565b81526020019081526020016000206001015460126000876001600160a01b03166001600160a01b031681526020019081526020016000206000600184611e319190613242565b8152602001908152602001600020600001549250925050611f76565b6001600160a01b0385166000908152601260209081526040808320838052909152902054841015611e85576000809250925050611f76565b600080611e93600184613242565b90505b81811115611f455760006002611eac8484613242565b611eb69190613259565b611ec09083613242565b6001600160a01b0389166000908152601260209081526040808320848452825291829020825180840190935280548084526001909101549183019190915291925090889003611f1f57602081015190519096509450611f769350505050565b8051881115611f3057819350611f3e565b611f3b600183613242565b92505b5050611e96565b506001600160a01b038616600090815260126020908152604080832093835292905220600181015490549093509150505b9250929050565b601654600114611f8c57600080fd5b6002601655611f99612e8f565b81600a6000828254611fab9190613242565b9091555050336000908152600b602052604081208054849290611fcf908490613242565b9091555061200090507f0000000000000000000000009056eb7ca982a5dd65a584189994e6a27318067d3384612413565b80156120ba5733600090815260096020526040902054811461202157600080fd5b33600081815260096020526040808220919091555163411b1f7760e01b81526004810183905260248101919091526001600160a01b037f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e169063411b1f7790604401600060405180830381600087803b15801561209d57600080fd5b505af11580156120b1573d6000803e3d6000fd5b505050506120cc565b50336000908152600960205260409020545b3360009081526001602052604081205481549091829181906120ef908490613242565b9091555050336000908152600b6020908152604080832054600190925282208190558154909250829190819061212690849061327b565b9091555050336000818152600160205260409020546121459190612513565b61214d61261e565b604051633aa53b9160e21b815260048101839052336024820152604481018490527f00000000000000000000000009236cff45047dbee6b921e00704bed6d6b8cf7e6001600160a01b03169063ea94ee4490606401600060405180830381600087803b1580156121bc57600080fd5b505af11580156121d0573d6000803e3d6000fd5b505060408051858152602081018790523393507ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568925001611c61565b60008183101561221c578161106a565b5090919050565b6001600160a01b038316600090815260056020908152604080832054600690925282205460115483929190830361225d579250905061240b565b6001600160a01b038716600090815260036020526040812054900361228857925042915061240b9050565b600061229383611022565b905060006122af60016011546122a99190613242565b89612824565b9050801561238857815b6122c4600183613242565b811161238657600081815260106020908152604091829020825180840190935280548352600101549082018190521561237357600060108161230785600161327b565b81526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000806123528e8460000151866000015187602001518d612f13565b9092509050612361828961327b565b975061236e8e8983612833565b975050505b508061237e816132b2565b9150506122b9565b505b86156124025760008181526010602090815260409182902082518084019093528054835260010154908201819052156124005760006123e18b6123ca8d610ff2565b84516123d6908a61220c565b85602001518a612f13565b5090506123ee818661327b565b94506123fb8b8642612833565b429550505b505b50909350909150505b935093915050565b6000836001600160a01b03163b1161242a57600080fd5b6040516001600160a01b03838116602483015260448201839052600091829186169063a9059cbb60e01b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516124979190613339565b6000604051808303816000865af19150503d80600081146124d4576040519150601f19603f3d011682016040523d82523d6000602084013e6124d9565b606091505b509150915081801561250357508051158061250357508080602001905181019061250391906132fe565b61250c57600080fd5b5050505050565b6001600160a01b0382166000908152600f60205260409020544290801580159061257157506001600160a01b0384166000908152600e60205260408120839161255d600185613242565b815260200190815260200160002060000154145b156125b4576001600160a01b0384166000908152600e60205260408120849161259b600185613242565b8152602081019190915260400160002060010155612618565b60408051808201825283815260208082018681526001600160a01b0388166000908152600e83528481208682529092529290209051815590516001918201556125fe90829061327b565b6001600160a01b0385166000908152600f60205260409020555b50505050565b6011544281158015906126505750806010600061263c600186613242565b815260200190815260200160002060000154145b1561268157600054601060006001856126699190613242565b81526020810191909152604001600020600101555050565b604080518082018252828152600080546020808401918252868352601090529290209051815590516001918201556126ba90839061327b565b6011555050565b6001600160a01b03821660009081526005602090815260408083205460069092528220546011548392919083036126fb5792509050611f76565b6001600160a01b0386166000908152600360205260408120549003612726579250429150611f769050565b600061273183611022565b9050600061274d60016011546127479190613242565b88612824565b9050815b8181101561281557600081815260106020908152604091829020825180840190935280548352600101549082018190521561280257600060108161279685600161327b565b81526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000806127e18d8460000151866000015187602001518d612f13565b90925090506127f0828961327b565b97506127fd8d8983612833565b975050505b508061280d816132b2565b915050612751565b50919792965091945050505050565b600081831061221c578161106a565b6001600160a01b038316600090815260136020526040902054801580159061288f57506001600160a01b0384166000908152601260205260408120839161287b600185613242565b815260200190815260200160002060000154145b156128b9576001600160a01b0384166000908152601260205260408120849161259b600185613242565b60408051808201825283815260208082018681526001600160a01b03881660009081526012835284812086825290925292902090518155905160019182015561290390829061327b565b6001600160a01b03851660009081526013602052604090205550505050565b600254600090819060ff1661293a5750600091829150565b7f0000000000000000000000009056eb7ca982a5dd65a584189994e6a27318067d6001600160a01b031663d294f0936040518163ffffffff1660e01b815260040160408051808303816000875af1158015612999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bd9190613374565b9092509050811515806129d05750600081115b15612d93576000826014546129e5919061327b565b90506000826015546129f7919061327b565b90506000807f0000000000000000000000009056eb7ca982a5dd65a584189994e6a27318067d6001600160a01b0316639d63848a6040518163ffffffff1660e01b815260040160408051808303816000875af1158015612a5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7f9190613398565b604051634cde602960e11b81526001600160a01b0380841660048301529294509092507f00000000000000000000000028786388d30e322bffbaff851c6fac958963b43d909116906399bcc05290602401602060405180830381865afa158015612aed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b119190613320565b84118015612b2b57506000612b2962093a8086613259565b115b15612be7576000601455612b60827f00000000000000000000000028786388d30e322bffbaff851c6fac958963b43d86612fce565b60405163b66503cf60e01b81526001600160a01b038381166004830152602482018690527f00000000000000000000000028786388d30e322bffbaff851c6fac958963b43d169063b66503cf90604401600060405180830381600087803b158015612bca57600080fd5b505af1158015612bde573d6000803e3d6000fd5b50505050612bed565b60148490555b604051634cde602960e11b81526001600160a01b0382811660048301527f00000000000000000000000028786388d30e322bffbaff851c6fac958963b43d16906399bcc05290602401602060405180830381865afa158015612c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c779190613320565b83118015612c9157506000612c8f62093a8085613259565b115b15612d4d576000601555612cc6817f00000000000000000000000028786388d30e322bffbaff851c6fac958963b43d85612fce565b60405163b66503cf60e01b81526001600160a01b038281166004830152602482018590527f00000000000000000000000028786388d30e322bffbaff851c6fac958963b43d169063b66503cf90604401600060405180830381600087803b158015612d3057600080fd5b505af1158015612d44573d6000803e3d6000fd5b50505050612d53565b60158390555b604080518781526020810187905233917fbc567d6cbad26368064baa0ab5a757be46aae4d70f707f9203d9d9b6c8ccbfa3910160405180910390a2505050505b9091565b6000846001600160a01b03163b11612dae57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612e129190613339565b6000604051808303816000865af19150503d8060008114612e4f576040519150601f19603f3d011682016040523d82523d6000602084013e612e54565b606091505b5091509150818015612e7e575080511580612e7e575080806020019051810190612e7e91906132fe565b612e8757600080fd5b505050505050565b600c5460005b81811015610bb6576000600c8281548110612eb257612eb26132cb565b6000918252602090912001546001600160a01b03169050612ed7816000196001612223565b6001600160a01b039092166000908152600660209081526040808320600590925290912092909255905580612f0b816132b2565b915050612e95565b6000806000612f22878561220c565b6001600160a01b0389166000908152600360205260409020549091508590670de0b6b3a764000090612f75612f578a8961220c565b6001600160a01b038d16600090815260046020526040902054612824565b6001600160a01b038c16600090815260046020526040902054612f99908690612824565b612fa39190613242565b612fad9190613293565b612fb79190613293565b612fc19190613259565b9890975095505050505050565b6000836001600160a01b03163b11612fe557600080fd5b6040516001600160a01b03838116602483015260448201839052600091829186169063095ea7b360e01b90606401612459565b6001600160a01b03811681146118f757600080fd5b803561303881613018565b919050565b6000806040838503121561305057600080fd5b823561305b81613018565b946020939093013593505050565b6000806040838503121561307c57600080fd5b823561308781613018565b9150602083013561309781613018565b809150509250929050565b6000602082840312156130b457600080fd5b813561106a81613018565b6000602082840312156130d157600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561310157600080fd5b823561310c81613018565b915060208381013567ffffffffffffffff8082111561312a57600080fd5b818601915086601f83011261313e57600080fd5b813581811115613150576131506130d8565b8060051b604051601f19603f83011681018181108582111715613175576131756130d8565b60405291825284820192508381018501918983111561319357600080fd5b938501935b828510156131b8576131a98561302d565b84529385019392850192613198565b8096505050505050509250929050565b6000806000606084860312156131dd57600080fd5b8335925060208401356131ef81613018565b915060408401356131ff81613018565b809150509250925092565b6000806040838503121561321d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b6000828210156132545761325461322c565b500390565b60008261327657634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561328e5761328e61322c565b500190565b60008160001904831182151516156132ad576132ad61322c565b500290565b6000600182016132c4576132c461322c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156132f357600080fd5b815161106a81613018565b60006020828403121561331057600080fd5b8151801515811461106a57600080fd5b60006020828403121561333257600080fd5b5051919050565b6000825160005b8181101561335a5760208186018101518583015201613340565b81811115613369576000828501525b509190910192915050565b6000806040838503121561338757600080fd5b505080516020909101519092909150565b600080604083850312156133ab57600080fd5b82516133b681613018565b60208401519092506130978161301856fea26469706673582212209cbd20125a25a94a5234f0308c21588b2e92d8d0a2106edd5a30cc6f6565597a64736f6c634300080d0033

Deployed ByteCode Sourcemap

5926:23948:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8167:96;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;783:25:1;;;839:2;824:18;;817:34;;;;756:18;8167:96:0;;;;;;;;6162:39;;;;;;;;-1:-1:-1;;;;;1026:32:1;;;1008:51;;996:2;981:18;6162:39:0;862:203:1;7682:68:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11317:1058;;;;;;:::i;:::-;;:::i;:::-;;;1216:25:1;;;1204:2;1189:18;11317:1058:0;1070:177:1;7019:23:0;;;;;;22791:1317;;;;;;:::i;:::-;;:::i;6604:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;6704:46;;;;;;:::i;:::-;;;;;;;;;;;;;;25501:218;;;;;;:::i;:::-;;:::i;:::-;;16785:1144;;;;;;:::i;:::-;;:::i;5960:30::-;;;;;6885:76;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;6208:30;;;;;8422:17;;;;;;7130:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3640:14:1;;3633:22;3615:41;;3603:2;3588:18;7130:40:0;3475:187:1;18422:178:0;;;;;;:::i;:::-;;:::i;16629:148::-;;;;;;:::i;:::-;;:::i;6279:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;20334:189;;;;;;:::i;:::-;;:::i;7817:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;7049:41;;;;;;:::i;:::-;;;;;;;;;;;;;;12383:1034;;;;;;:::i;:::-;;:::i;6116:39::-;;;;;25411:82;;;:::i;6049:28::-;;;;;8398:17;;;;;;28522:308;;;;;;:::i;:::-;;:::i;26724:243::-;;;;;;:::i;:::-;;:::i;6757:52::-;;;;;;:::i;:::-;;;;;;;;;;;;;;6818:60;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;8328:61;;;;;;:::i;:::-;;;;;;;;;;;;;;26975:1539;;;;;;:::i;:::-;;:::i;24116:115::-;;;;;;:::i;:::-;;:::i;9654:112::-;;;:::i;18302:::-;;;;;;:::i;:::-;-1:-1:-1;;;;;18388:18:0;18364:4;18388:18;;;:9;:18;;;;;;;18302:112;6247:25;;;;;;6653:44;;;;;;:::i;:::-;;;;;;;;;;;;;;24239:1164;;;;;;:::i;:::-;;:::i;6335:21::-;;;;;;;;;16429:98;16505:7;:14;16429:98;;8054:32;;;;;;17939:355;;;;;;:::i;:::-;;:::i;7099:24::-;;;;;;:::i;:::-;;:::i;7945:59::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;6970:40;;;;;;:::i;:::-;;;;;;;;;;;;;;13425:1374;;;;;;:::i;:::-;;:::i;25727:989::-;;;;;;:::i;:::-;;:::i;11317:1058::-;-1:-1:-1;;;;;11438:23:0;;11401:4;11438:23;;;:14;:23;;;;;;11476:17;;;11472:58;;11517:1;11510:8;;;;;11472:58;-1:-1:-1;;;;;11590:20:0;;;;;;:11;:20;;;;;11642:9;;11611:16;11626:1;11611:12;:16;:::i;:::-;11590:38;;;;;;;;;;;:48;;;:61;11586:119;;11676:16;11691:1;11676:12;:16;:::i;:::-;11668:25;;;;;11586:119;-1:-1:-1;;;;;11766:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:45;-1:-1:-1;11762:86:0;;;11835:1;11828:8;;;;;11762:86;11860:10;;11898:16;11913:1;11898:12;:16;:::i;:::-;11885:29;;11925:420;11940:5;11932;:13;11925:420;;;11962:11;12002:1;11985:13;11993:5;11985;:13;:::i;:::-;11984:19;;;;:::i;:::-;11976:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;12068:20:0;;12045;12068;;;:11;:20;;;;;;;;:28;;;;;;;;;12045:51;;;;;;;;;;;;;;;;;;;;;;;;;11962:41;;-1:-1:-1;12045:51:0;12115:25;;;12111:223;;-1:-1:-1;12168:6:0;-1:-1:-1;12161:13:0;;-1:-1:-1;;;12161:13:0;12111:223;12200:12;;:24;-1:-1:-1;12196:138:0;;;12253:6;12245:14;;12196:138;;;12308:10;12317:1;12308:6;:10;:::i;:::-;12300:18;;12196:138;11947:398;;11925:420;;;-1:-1:-1;12362:5:0;-1:-1:-1;;11317:1058:0;;;;;:::o;22791:1317::-;-1:-1:-1;;;;;22909:15:0;;;22860:4;22909:15;;;:8;:15;;;;;;;;:24;;;;;;;;;;;;22935:32;;;:25;:32;;;;;:35;;;;;;;;:45;22860:4;;22900:81;;:8;:81::i;:::-;-1:-1:-1;;;;;22996:23:0;;;;;;:14;:23;;;;;;22877:104;;-1:-1:-1;22996:28:0;22992:69;;23048:1;23041:8;;;;;22992:69;23073:16;23092:46;23113:7;23122:15;23092:20;:46::i;:::-;-1:-1:-1;;;;;23166:23:0;;23149:14;23166:23;;;:14;:23;;;;;;23073:65;;-1:-1:-1;23149:14:0;23166:25;;23190:1;;23166:25;:::i;:::-;23149:42;-1:-1:-1;23204:11:0;23236:13;;23232:543;;23280:11;23266:498;23298:11;23308:1;23298:9;:11;:::i;:::-;23293:1;:16;23266:498;;-1:-1:-1;;;;;23359:20:0;;23335:21;23359:20;;;:11;:20;;;;;;;;:23;;;;;;;;;23335:47;;;;;;;;;;;;;;;;;;;;;23425:20;;;;;;;23335:47;:21;;23446:3;;23380:1;;23446:3;:::i;:::-;23425:25;;;;;;;;;;;23401:49;;;;;;;;;;;;;;;;;;;;;;;;;;;23470:27;23502:44;23525:5;23532:3;:13;;;23502:22;:44::i;:::-;23469:77;;;23566:27;23598:44;23621:5;23628:3;:13;;;23598:22;:44::i;:::-;-1:-1:-1;23565:77:0;-1:-1:-1;6483:8:0;23688:47;23713:22;23565:77;23688:47;:::i;:::-;23671:3;:13;;;:65;;;;:::i;:::-;:77;;;;:::i;:::-;23661:87;;;;:::i;:::-;;;23316:448;;;;23311:3;;;;;:::i;:::-;;;;23266:498;;;;23232:543;-1:-1:-1;;;;;23810:20:0;;23787;23810;;;:11;:20;;;;;;;;:31;;;;;;;;23787:54;;;;;;;;;;;;;;;;;;;;;;;;;;:20;23884:43;;23907:5;;23884:22;:43::i;:::-;-1:-1:-1;;;;;;24020:31:0;;;;;;;:24;:31;;;;;;;;:40;;;;;;;;;;23852:75;;-1:-1:-1;6483:8:0;;23988:73;;23852:75;;23988:8;:73::i;:::-;23964:21;23979:5;23964:14;:21::i;:::-;:97;;;;:::i;:::-;23948:2;:12;;;:114;;;;:::i;:::-;:126;;;;:::i;:::-;23938:136;;;;:::i;:::-;;22791:1317;-1:-1:-1;;;;;;;;;22791:1317:0:o;25501:218::-;25601:10;25550:12;25591:21;;;:9;:21;;;;;;25581:31;;25577:94;;-1:-1:-1;25648:10:0;25639:20;;;;:8;:20;;;;;;25577:94;25681:30;25695:6;25703:7;25681:13;:30::i;:::-;25539:180;25501:218;:::o;16785:1144::-;9563:9;;9576:1;9563:14;9555:23;;;;;;9601:1;9589:9;:13;16879:10:::1;-1:-1:-1::0;;;;;16879:21:0;::::1;;::::0;:44:::1;;-1:-1:-1::0;16904:10:0::1;-1:-1:-1::0;;;;;16918:5:0::1;16904:19;;16879:44;16871:53;;;::::0;::::1;;16947:1;16935:9;:13:::0;16959:39:::1;::::0;-1:-1:-1;;;16959:39:0;;16992:4:::1;16959:39;::::0;::::1;1008:51:1::0;16966:5:0::1;-1:-1:-1::0;;;;;16959:24:0::1;::::0;::::1;::::0;981:18:1;;16959:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;17021:1:0::1;17009:9;:13:::0;-1:-1:-1;17040:6:0::1;::::0;-1:-1:-1;17035:537:0::1;17056:6;:13;17052:1;:17;17035:537;;;17154:54;17176:6;17183:1;17176:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;17203:4:0::1;17154:21;:54::i;:::-;17092:20;:31;17113:6;17120:1;17113:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;17092:31:0::1;-1:-1:-1::0;;;;;17092:31:0::1;;;;;;;;;;;;;17125:14;:25;17140:6;17147:1;17140:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;17125:25:0::1;-1:-1:-1::0;;;;;17125:25:0::1;;;;;;;;;;;;;17091:117;;;;;;;;;;;;17225:12;17240:26;17247:6;17254:1;17247:9;;;;;;;;:::i;:::-;;;;;;;17258:7;17240:6;:26::i;:::-;17225:41;;17312:15;17281:8;:19;17290:6;17297:1;17290:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;17281:19:0::1;-1:-1:-1::0;;;;;17281:19:0::1;;;;;;;;;;;;:28;17301:7;-1:-1:-1::0;;;;;17281:28:0::1;-1:-1:-1::0;;;;;17281:28:0::1;;;;;;;;;;;;:46;;;;17389:20;:31;17410:6;17417:1;17410:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;17389:31:0::1;-1:-1:-1::0;;;;;17389:31:0::1;;;;;;;;;;;;;17342:24;:35;17367:6;17374:1;17367:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;17342:35:0;;::::1;::::0;;;;::::1;::::0;;;;;;;;-1:-1:-1;17342:35:0;;;:44;;::::1;::::0;;;;;;;:78;17439:11;;17435:59:::1;;17452:42;17466:6;17473:1;17466:9;;;;;;;;:::i;:::-;;;;;;;17477:7;17486;17452:13;:42::i;:::-;17541:6;17548:1;17541:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;17516:44:0::1;17529:10;-1:-1:-1::0;;;;;17516:44:0::1;;17552:7;17516:44;;;;1216:25:1::0;;1204:2;1189:18;;1070:177;17516:44:0::1;;;;;;;;-1:-1:-1::0;17071:3:0;::::1;::::0;::::1;:::i;:::-;;;;17035:537;;;-1:-1:-1::0;;;;;;17607:24:0;::::1;17584:20;17607:24:::0;;;:15:::1;:24;::::0;;;;;17642:32;;17607:24;;;;17584:20;;17642:32:::1;::::0;17607:24;;17642:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;18388:18:0;;18364:4;18388:18;;;:9;:18;;;;;;;;;17737:15:::1;:24:::0;;;;;:42;;;17790:32;;18388:18;;;;18364:4;;17790:32:::1;::::0;18388:18;;17790:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;17861:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;;17835:51:::1;::::0;17852:7;;17835:16:::1;:51::i;:::-;17897:24;:22;:24::i;:::-;-1:-1:-1::0;;9637:1:0;9625:9;:13;-1:-1:-1;16785:1144:0:o;18422:178::-;18556:36;18577:5;18584:7;18556:20;:36::i;:::-;-1:-1:-1;;;;;18501:27:0;;;;;;;:20;:27;;;;;;;;18530:14;:21;;;;;;18500:92;;;;;;;-1:-1:-1;18422:178:0:o;16629:148::-;-1:-1:-1;;;;;16749:19:0;;16699:4;16749:19;;;:12;:19;;;;;;16723:46;;16732:15;;16723:8;:46::i;20334:189::-;20471:44;20493:5;20500:7;20509:5;20471:21;:44::i;12383:1034::-;12486:20;;12449:4;;12521:17;;;12517:58;;-1:-1:-1;12562:1:0;;12383:1034;-1:-1:-1;;12383:1034:0:o;12517:58::-;12684:9;12635:17;:35;12653:16;12668:1;12653:12;:16;:::i;:::-;12635:35;;;;;;;;;;;:45;;;:58;12631:116;;12718:16;12733:1;12718:12;:16;:::i;:::-;12710:25;12383:1034;-1:-1:-1;;;12383:1034:0:o;12631:116::-;12808:20;;;:17;:20;;;:30;:42;-1:-1:-1;12804:83:0;;;-1:-1:-1;12874:1:0;;12383:1034;-1:-1:-1;;12383:1034:0:o;12804:83::-;12899:10;;12937:16;12952:1;12937:12;:16;:::i;:::-;12924:29;;12964:423;12979:5;12971;:13;12964:423;;;13001:11;13041:1;13024:13;13032:5;13024;:13;:::i;:::-;13023:19;;;;:::i;:::-;13015:27;;:5;:27;:::i;:::-;13084:26;13113:25;;;:17;:25;;;;;;;;;13084:54;;;;;;;;;;;;;;;;;;;;;;;;;13001:41;;-1:-1:-1;13084:54:0;13157:25;;;13153:223;;-1:-1:-1;13210:6:0;12383:1034;-1:-1:-1;;;;;12383:1034:0:o;13153:223::-;13242:12;;:24;-1:-1:-1;13238:138:0;;;13295:6;13287:14;;13238:138;;;13350:10;13359:1;13350:6;:10;:::i;:::-;13342:18;;13238:138;12986:401;;12964:423;;;-1:-1:-1;13404:5:0;12383:1034;-1:-1:-1;;;12383:1034:0:o;25411:82::-;25473:10;25463:21;;;;:9;:21;;;;;;25454:31;;:8;:31::i;:::-;25411:82::o;28522:308::-;28650:3;-1:-1:-1;;;;;28636:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28622:39:0;:10;-1:-1:-1;;;;;28622:39:0;;28614:61;;;;-1:-1:-1;;;28614:61:0;;5901:2:1;28614:61:0;;;5883:21:1;5940:1;5920:18;;;5913:29;-1:-1:-1;;;5958:18:1;;;5951:39;6007:18;;28614:61:0;;;;;;;;;28708:8;-1:-1:-1;;;;;28694:22:0;:7;28702:1;28694:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28694:10:0;:22;28686:31;;;;;;-1:-1:-1;;;;;28728:18:0;;;28749:5;28728:18;;;:8;:18;;;;;;:26;;-1:-1:-1;;28728:26:0;;;;;;28765:18;;;;;;;:25;;;;;28728:26;28765:25;;;28801:7;:10;;28774:8;;28801:7;28809:1;;28801:10;;;;;;:::i;:::-;;;;;;;;;:21;;;;;-1:-1:-1;;;;;28801:21:0;;;;;-1:-1:-1;;;;;28801:21:0;;;;;;28522:308;;;:::o;26724:243::-;-1:-1:-1;;;;;26816:19:0;;26776:4;26816:19;;;:12;:19;;;;;;26797:15;:38;26793:52;;-1:-1:-1;26844:1:0;;26724:243;-1:-1:-1;26724:243:0:o;26793:52::-;-1:-1:-1;;;;;26874:19:0;;26856:15;26874:19;;;:12;:19;;;;;;:37;;26896:15;;26874:37;:::i;:::-;-1:-1:-1;;;;;26942:17:0;;;;;;:10;:17;;;;;;26856:55;;-1:-1:-1;26929:30:0;;26856:55;26929:30;:::i;26975:1539::-;9563:9;;9576:1;9563:14;9555:23;;;;;;9601:1;9589:9;:13;-1:-1:-1;;;;;27073:5:0::1;27064:14:::0;::::1;::::0;;::::1;::::0;27056:23:::1;;;::::0;::::1;;27107:1;27098:6;:10;27090:19;;;::::0;::::1;;-1:-1:-1::0;;;;;27125:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;;::::1;;27120:215;;27165:34;::::0;-1:-1:-1;;;27165:34:0;;-1:-1:-1;;;;;1026:32:1;;;27165:34:0::1;::::0;::::1;1008:51:1::0;27172:5:0::1;27165:27;::::0;::::1;::::0;981:18:1;;27165:34:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27157:81;;;::::0;-1:-1:-1;;;27157:81:0;;6520:2:1;27157:81:0::1;::::0;::::1;6502:21:1::0;6559:2;6539:18;;;6532:30;6598:34;6578:18;;;6571:62;-1:-1:-1;;;6649:18:1;;;6642:32;6691:19;;27157:81:0::1;6318:398:1::0;27157:81:0::1;27261:7;:14:::0;6541:2:::1;-1:-1:-1::0;27253:70:0::1;;;::::0;-1:-1:-1;;;27253:70:0;;6923:2:1;27253:70:0::1;::::0;::::1;6905:21:1::0;6962:2;6942:18;;;6935:30;7001:25;6981:18;;;6974:53;7044:18;;27253:70:0::1;6721:347:1::0;27253:70:0::1;-1:-1:-1::0;;;;;27349:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;:22;;27345:85:::1;;27373:57;27404:5;27411:1;27414:15;27373:30;:57::i;:::-;27496:50;27518:5;-1:-1:-1::0;;27541:4:0::1;27496:21;:50::i;:::-;-1:-1:-1::0;;;;;27442:27:0;::::1;;::::0;;;:20:::1;:27;::::0;;;;;;;27471:14:::1;:21:::0;;;;;;27441:105;;;;;27557:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;;;27605:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;27586:15:::1;:38;27582:502;;27641:59;27659:5;27666:10;27686:4;27693:6;27641:17;:59::i;:::-;27735:17;6399:6;27735::::0;:17:::1;:::i;:::-;-1:-1:-1::0;;;;;27715:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:37;27582:502:::1;;;-1:-1:-1::0;;;;;27803:19:0;::::1;27785:15;27803:19:::0;;;:12:::1;:19;::::0;;;;;:37:::1;::::0;27825:15:::1;::::0;27803:37:::1;:::i;:::-;-1:-1:-1::0;;;;;27881:17:0;::::1;27855:10;27881:17:::0;;;:10:::1;:17;::::0;;;;;27785:55;;-1:-1:-1;27855:10:0;27868:30:::1;::::0;27785:55;27868:30:::1;:::i;:::-;27855:43;;27930:5;27921:6;:14;27913:23;;;::::0;::::1;;27951:59;27969:5;27976:10;27996:4;28003:6;27951:17;:59::i;:::-;6399:6;28046:14;28055:5:::0;28046:6;:14:::1;:::i;:::-;28045:27;;;;:::i;:::-;-1:-1:-1::0;;;;;28025:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:47;-1:-1:-1;;27582:502:0::1;-1:-1:-1::0;;;;;28102:17:0;::::1;28122:1;28102:17:::0;;;:10:::1;:17;::::0;;;;;28094:30:::1;;;::::0;::::1;;28150:38;::::0;-1:-1:-1;;;28150:38:0;;28182:4:::1;28150:38;::::0;::::1;1008:51:1::0;28135:12:0::1;::::0;-1:-1:-1;;;;;28150:23:0;::::1;::::0;::::1;::::0;981:18:1;;28150:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28135:53:::0;-1:-1:-1;28228:18:0::1;6399:6;28135:53:::0;28228:18:::1;:::i;:::-;-1:-1:-1::0;;;;;28207:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;:39:::1;;28199:76;;;::::0;-1:-1:-1;;;28199:76:0;;7464:2:1;28199:76:0::1;::::0;::::1;7446:21:1::0;7503:2;7483:18;;;7476:30;7542:26;7522:18;;;7515:54;7586:18;;28199:76:0::1;7262:348:1::0;28199:76:0::1;28308:26;6399:6;28308:15;:26;:::i;:::-;-1:-1:-1::0;;;;;28286:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;;;:48;;;;28350:8:::1;:15:::0;;;;::::1;;28345:105;;-1:-1:-1::0;;;;;28382:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:22;;-1:-1:-1;;28382:22:0::1;28400:4;28382:22:::0;;::::1;::::0;;;28419:7:::1;:19:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;28419:19:0::1;::::0;;::::1;::::0;;28345:105:::1;28467:39;::::0;1216:25:1;;;-1:-1:-1;;;;;28467:39:0;::::1;::::0;28480:10:::1;::::0;28467:39:::1;::::0;1204:2:1;1189:18;28467:39:0::1;;;;;;;-1:-1:-1::0;;9637:1:0;9625:9;:13;-1:-1:-1;26975:1539:0:o;24116:115::-;24178:35;;-1:-1:-1;;;24178:35:0;;24202:10;24178:35;;;1008:51:1;24170:53:0;;24185:5;-1:-1:-1;;;;;24178:23:0;;;;981:18:1;;24178:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24215:7;24170;:53::i;:::-;24116:115;:::o;9654:112::-;9698:13;9713;9563:9;;9576:1;9563:14;9555:23;;;;;;9601:1;9589:9;:13;9746:12:::1;:10;:12::i;:::-;9739:19;;;;9637:1:::0;9625:9;:13;9654:112;;:::o;24239:1164::-;9563:9;;9576:1;9563:14;9555:23;;;;;;9601:1;9589:9;:13;24314:10;24306:19:::1;;;::::0;::::1;;24336:27;:25;:27::i;:::-;24376:59;24394:5;24401:10;24421:4;24428:6;24376:17;:59::i;:::-;24461:6;24446:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;24488:10:0::1;24478:21;::::0;;;:9:::1;:21;::::0;;;;:31;;24503:6;;24478:21;:31:::1;::::0;24503:6;;24478:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;24526:11:0;;24522:402:::1;;24562:35;::::0;-1:-1:-1;;;24562:35:0;;::::1;::::0;::::1;1216:25:1::0;;;24601:10:0::1;::::0;-1:-1:-1;;;;;24576:3:0::1;24562:26;::::0;::::1;::::0;1189:18:1;;24562:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24562:49:0::1;;24554:58;;;::::0;::::1;;24640:10;24631:20;::::0;;;:8:::1;:20;::::0;;;;;:25;;24627:168:::1;;24686:10;24677:20;::::0;;;:8:::1;:20;::::0;;;;;;:30;;;24726:53;-1:-1:-1;;;24726:53:0;;::::1;::::0;::::1;7789:25:1::0;;;7830:18;;;7823:60;;;;-1:-1:-1;;;;;24733:5:0::1;24726:32;::::0;::::1;::::0;7762:18:1;;24726:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24627:168;24826:10;24817:20;::::0;;;:8:::1;:20;::::0;;;;;:31;::::1;24809:40;;;::::0;::::1;;24522:402;;;-1:-1:-1::0;24901:10:0::1;24892:20;::::0;;;:8:::1;:20;::::0;;;;;24522:402:::1;24975:10;24936:20;24959:27:::0;;;:15:::1;:27;::::0;;;;;24997:32;;24959:27;;;;24936:20;;24997:32:::1;::::0;24959:27;;24997:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;25073:10:0::1;18364:4:::0;18388:18;;;:9;:18;;;;;;;;;25095:15:::1;:27:::0;;;;;:45;;;25151:32;;18388:18;;-1:-1:-1;18388:18:0;;18364:4;;;25151:32:::1;::::0;18388:18;;25151:32:::1;:::i;:::-;::::0;;;-1:-1:-1;25196:45:0::1;::::0;-1:-1:-1;25213:10:0::1;25225:15:::0;25196:16:::1;:45::i;:::-;25252:24;:22;:24::i;:::-;25289:54;::::0;-1:-1:-1;;;25289:54:0;;::::1;::::0;::::1;8096:25:1::0;;;25324:10:0::1;8137:18:1::0;;;8130:60;8206:18;;;8199:34;;;25296:5:0::1;-1:-1:-1::0;;;;;25289:25:0::1;::::0;::::1;::::0;8069:18:1;;25289:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25359:36:0::1;::::0;;783:25:1;;;839:2;824:18;;817:34;;;25367:10:0::1;::::0;-1:-1:-1;25359:36:0::1;::::0;-1:-1:-1;756:18:1;25359:36:0::1;;;;;;;;-1:-1:-1::0;;9637:1:0;9625:9;:13;-1:-1:-1;24239:1164:0:o;17939:355::-;17999:4;18020:13;;18037:1;18020:18;18016:85;;-1:-1:-1;;;;;;18062:27:0;;;;;:20;:27;;;;;;;17939:355::o;18016:85::-;18272:13;;;-1:-1:-1;;;;;18240:17:0;;;;:10;:17;;;;;;;;;18193:14;:21;;;;;;18216:12;:19;;;;;;18272:13;;6483:8;;18240:17;;18184:52;;:8;:52::i;:::-;18150:31;18175:5;18150:24;:31::i;:::-;:86;;;;:::i;:::-;18149:108;;;;:::i;:::-;:120;;;;:::i;:::-;:136;;;;:::i;:::-;-1:-1:-1;;;;;18118:27:0;;;;;;:20;:27;;;;;;:168;;;;:::i;7099:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7099:24:0;;-1:-1:-1;7099:24:0;:::o;13425:1374::-;-1:-1:-1;;;;;13552:35:0;;13509:4;13552:35;;;:28;:35;;;;;;13509:4;;13602:17;;;13598:62;;13644:1;13646;13636:12;;;;;;;13598:62;-1:-1:-1;;;;;13720:32:0;;;;;;:25;:32;;;;;13784:9;;13753:16;13768:1;13753:12;:16;:::i;:::-;13720:50;;;;;;;;;;;:60;;;:73;13716:242;;-1:-1:-1;;;;;13818:32:0;;;;;;:25;:32;;;;;;13851:16;13866:1;13851:12;:16;:::i;:::-;13818:50;;;;;;;;;;;:65;;;13885:25;:32;13911:5;-1:-1:-1;;;;;13885:32:0;-1:-1:-1;;;;;13885:32:0;;;;;;;;;;;;:50;13933:1;13918:12;:16;;;;:::i;:::-;13885:50;;;;;;;;;;;:60;;;13810:136;;;;;;;13716:242;-1:-1:-1;;;;;14019:32:0;;;;;;:25;:32;;;;;;;;:35;;;;;;;;:45;:57;-1:-1:-1;14015:102:0;;;14101:1;14103;14093:12;;;;;;;14015:102;14129:10;;14167:16;14182:1;14167:12;:16;:::i;:::-;14154:29;;14194:473;14209:5;14201;:13;14194:473;;;14231:11;14271:1;14254:13;14262:5;14254;:13;:::i;:::-;14253:19;;;;:::i;:::-;14245:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;14351:32:0;;14314:34;14351:32;;;:25;:32;;;;;;;;:40;;;;;;;;;14314:77;;;;;;;;;;;;;;;;;;;;;;;;;14231:41;;-1:-1:-1;14314:77:0;14410:25;;;14406:250;;14464:17;;;;14483:12;;14464:17;;-1:-1:-1;14483:12:0;-1:-1:-1;14456:40:0;;-1:-1:-1;;;;14456:40:0;14406:250;14522:12;;:24;-1:-1:-1;14518:138:0;;;14575:6;14567:14;;14518:138;;;14630:10;14639:1;14630:6;:10;:::i;:::-;14622:18;;14518:138;14216:451;;14194:473;;;-1:-1:-1;;;;;;14685:32:0;;;;;;:25;:32;;;;;;;;:39;;;;;;;:54;;;;14741:49;;14685:54;;-1:-1:-1;14741:49:0;-1:-1:-1;;13425:1374:0;;;;;;:::o;25727:989::-;9563:9;;9576:1;9563:14;9555:23;;;;;;9601:1;9589:9;:13;25800:27:::1;:25;:27::i;:::-;25855:6;25840:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25882:10:0::1;25872:21;::::0;;;:9:::1;:21;::::0;;;;:31;;25897:6;;25872:21;:31:::1;::::0;25897:6;;25872:31:::1;:::i;:::-;::::0;;;-1:-1:-1;25914:40:0::1;::::0;-1:-1:-1;25928:5:0::1;25935:10;25947:6:::0;25914:13:::1;:40::i;:::-;25971:11:::0;;25967:256:::1;;26027:10;26018:20;::::0;;;:8:::1;:20;::::0;;;;;26007:31;::::1;25999:40;;;::::0;::::1;;26063:10;26077:1;26054:20:::0;;;:8:::1;:20;::::0;;;;;:24;;;;26093:55;-1:-1:-1;;;26093:55:0;;::::1;::::0;::::1;7789:25:1::0;;;7830:18;;;7823:60;;;;-1:-1:-1;;;;;26100:5:0::1;26093:34;::::0;::::1;::::0;7762:18:1;;26093:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25967:256;;;-1:-1:-1::0;26200:10:0::1;26191:20;::::0;;;:8:::1;:20;::::0;;;;;25967:256:::1;26274:10;26235:20;26258:27:::0;;;:15:::1;:27;::::0;;;;;26296:32;;26258:27;;;;26235:20;;26296:32:::1;::::0;26258:27;;26296:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;26372:10:0::1;18364:4:::0;18388:18;;;:9;:18;;;;;;;;;26394:15:::1;:27:::0;;;;;:45;;;26450:32;;18388:18;;-1:-1:-1;18388:18:0;;18364:4;;;26450:32:::1;::::0;18388:18;;26450:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;26512:10:0::1;26524:27;::::0;;;:15:::1;:27;::::0;;;;;26495:57:::1;::::0;26512:10;26495:16:::1;:57::i;:::-;26563:24;:22;:24::i;:::-;26600:55;::::0;-1:-1:-1;;;26600:55:0;;::::1;::::0;::::1;8096:25:1::0;;;26636:10:0::1;8137:18:1::0;;;8130:60;8206:18;;;8199:34;;;26607:5:0::1;-1:-1:-1::0;;;;;26600:26:0::1;::::0;::::1;::::0;8069:18:1;;26600:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;26671:37:0::1;::::0;;783:25:1;;;839:2;824:18;;817:34;;;26680:10:0::1;::::0;-1:-1:-1;26671:37:0::1;::::0;-1:-1:-1;756:18:1;26671:37:0::1;609:248:1::0;4875:98:0;4927:4;4956:1;4951;:6;;:14;;4964:1;4951:14;;;-1:-1:-1;4960:1:0;;4944:21;-1:-1:-1;4875:98:0:o;20831:1846::-;-1:-1:-1;;;;;20972:21:0;;20926:4;20972:21;;;:14;:21;;;;;;;;;21018:20;:27;;;;;;21062:20;;20926:4;;20972:21;21018:27;21062:25;;21058:90;;21112:6;-1:-1:-1;21120:15:0;-1:-1:-1;21104:32:0;;21058:90;-1:-1:-1;;;;;21164:17:0;;;;;;:10;:17;;;;;;:22;;21160:87;;21211:6;-1:-1:-1;21219:15:0;;-1:-1:-1;21203:32:0;;-1:-1:-1;21203:32:0;21160:87;21259:16;21278:36;21298:15;21278:19;:36::i;:::-;21259:55;;21325:14;21342:43;21374:1;21351:20;;:24;;;;:::i;:::-;21377:7;21342:8;:43::i;:::-;21325:60;-1:-1:-1;21402:13:0;;21398:622;;21446:11;21432:577;21464:13;21476:1;21464:9;:13;:::i;:::-;21459:1;:18;21432:577;;21503:27;21533:20;;;:17;:20;;;;;;;;;21503:50;;;;;;;;;;;;;;;;;;;;;21576:14;21572:422;;21615:27;21645:17;21615:27;21663:3;:1;21665;21663:3;:::i;:::-;21645:22;;;;;;;;;;;21615:52;;;;;;;;;;;;;;;;;;;;;;;;;;;21691:12;21705:13;21722:85;21742:5;21749:3;:13;;;21764:3;:13;;;21779:3;:10;;;21791:15;21722:19;:85::i;:::-;21690:117;;-1:-1:-1;21690:117:0;-1:-1:-1;21830:17:0;21690:117;21830:17;;:::i;:::-;;;21870:55;21901:5;21908:6;21916:8;21870:30;:55::i;:::-;21966:8;-1:-1:-1;;;21572:422:0;-1:-1:-1;21479:3:0;;;;:::i;:::-;;;;21432:577;;;;21398:622;22146:10;22142:483;;;22173:26;22202:28;;;:17;:28;;;;;;;;;22173:57;;;;;;;;;;;;;;;;;;;;;22249:13;22245:369;;22284:12;22301:128;22321:5;22328:31;22353:5;22328:24;:31::i;:::-;22370:12;;22361:39;;22384:15;22361:8;:39::i;:::-;22402:2;:9;;;22413:15;22301:19;:128::i;:::-;-1:-1:-1;22283:146:0;-1:-1:-1;22448:17:0;22283:146;22448:17;;:::i;:::-;;;22484:62;22515:5;22522:6;22530:15;22484:30;:62::i;:::-;22583:15;22565:33;;22264:350;22245:369;22158:467;22142:483;-1:-1:-1;22645:6:0;;-1:-1:-1;22653:15:0;;-1:-1:-1;;20831:1846:0;;;;;;;:::o;28838:327::-;28951:1;28931:5;-1:-1:-1;;;;;28931:17:0;;:21;28923:30;;;;;;29020:59;;-1:-1:-1;;;;;8436:32:1;;;29020:59:0;;;8418:51:1;8485:18;;;8478:34;;;28965:12:0;;;;29009:10;;;-1:-1:-1;;;29043:24:0;8391:18:1;;29020:59:0;;;;-1:-1:-1;;29020:59:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29020:59:0;-1:-1:-1;;;;;;29020:59:0;;;;;;;;;;29009:71;;;;29020:59;29009:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28964:116;;;;29099:7;:57;;;;-1:-1:-1;29111:11:0;;:16;;:44;;;29142:4;29131:24;;;;;;;;;;;;:::i;:::-;29091:66;;;;;;28912:253;;28838:327;;;:::o;14807:521::-;-1:-1:-1;;;;;14949:23:0;;14884:15;14949:23;;;:14;:23;;;;;;14902:15;;14989:17;;;;;:84;;-1:-1:-1;;;;;;15010:20:0;;;;;;:11;:20;;;;;15063:10;;15031:17;15047:1;15031:13;:17;:::i;:::-;15010:39;;;;;;;;;;;:49;;;:63;14989:84;14985:336;;;-1:-1:-1;;;;;15090:20:0;;;;;;:11;:20;;;;;15142:7;;15111:17;15127:1;15111:13;:17;:::i;:::-;15090:39;;;;;;;;;;;-1:-1:-1;15090:39:0;:49;;:59;14985:336;;;15220:31;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15182:20:0;;-1:-1:-1;15182:20:0;;;:11;:20;;;;;:35;;;;;;;;;:69;;;;;;;;;;;15292:17;;15203:13;;15292:17;:::i;:::-;-1:-1:-1;;;;;15266:23:0;;;;;;:14;:23;;;;;:43;14985:336;14873:455;;14807:521;;:::o;15923:498::-;15998:20;;16047:15;16079:17;;;;;:81;;-1:-1:-1;16150:10:0;16100:17;:36;16118:17;16134:1;16118:13;:17;:::i;:::-;16100:36;;;;;;;;;;;:46;;;:60;16079:81;16075:339;;;16223:13;;16177:17;:36;16211:1;16195:13;:17;;;;:::i;:::-;16177:36;;;;;;;;;;;-1:-1:-1;16177:36:0;:43;;:59;25539:180;25501:218;:::o;16075:339::-;16304:43;;;;;;;;;;;-1:-1:-1;16333:13:0;;16304:43;;;;;;;16269:32;;;:17;:32;;;;;:78;;;;;;;;;;;16385:17;;16287:13;;16385:17;:::i;:::-;16362:20;:40;15966:455;;15923:498::o;18608:1135::-;-1:-1:-1;;;;;18731:21:0;;18685:4;18731:21;;;:14;:21;;;;;;;;;18777:20;:27;;;;;;18821:20;;18685:4;;18731:21;18777:27;18821:25;;18817:90;;18871:6;-1:-1:-1;18879:15:0;-1:-1:-1;18863:32:0;;18817:90;-1:-1:-1;;;;;18923:17:0;;;;;;:10;:17;;;;;;:22;;18919:87;;18970:6;-1:-1:-1;18978:15:0;;-1:-1:-1;18962:32:0;;-1:-1:-1;18962:32:0;18919:87;19018:16;19037:36;19057:15;19037:19;:36::i;:::-;19018:55;;19084:14;19101:41;19131:1;19110:20;;:22;;;;:::i;:::-;19134:7;19101:8;:41::i;:::-;19084:58;-1:-1:-1;19169:11:0;19155:536;19186:9;19182:1;:13;19155:536;;;19217:27;19247:20;;;:17;:20;;;;;;;;;19217:50;;;;;;;;;;;;;;;;;;;;;19286:14;19282:398;;19321:27;19351:17;19321:27;19369:3;:1;19371;19369:3;:::i;:::-;19351:22;;;;;;;;;;;19321:52;;;;;;;;;;;;;;;;;;;;;;;;;;;19393:12;19407:13;19424:85;19444:5;19451:3;:13;;;19466:3;:13;;;19481:3;:10;;;19493:15;19424:19;:85::i;:::-;19392:117;;-1:-1:-1;19392:117:0;-1:-1:-1;19528:17:0;19392:117;19528:17;;:::i;:::-;;;19564:55;19595:5;19602:6;19610:8;19564:30;:55::i;:::-;19656:8;-1:-1:-1;;;19282:398:0;-1:-1:-1;19197:3:0;;;;:::i;:::-;;;;19155:536;;;-1:-1:-1;19711:6:0;;19719:15;;-1:-1:-1;18608:1135:0;;-1:-1:-1;;;;;18608:1135:0:o;4979:97::-;5031:4;5059:1;5055;:5;:13;;5067:1;5055:13;;15336:579;-1:-1:-1;;;;;15461:35:0;;15440:18;15461:35;;;:28;:35;;;;;;15513:17;;;;;:95;;-1:-1:-1;;;;;;15534:32:0;;;;;;:25;:32;;;;;15599:9;;15567:17;15583:1;15567:13;:17;:::i;:::-;15534:51;;;;;;;;;;;:61;;;:74;15513:95;15509:399;;;-1:-1:-1;;;;;15625:32:0;;;;;;:25;:32;;;;;15694:6;;15658:17;15674:1;15658:13;:17;:::i;15509:399::-;15783:43;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15733:32:0;;-1:-1:-1;15733:32:0;;;:25;:32;;;;;:47;;;;;;;;;:93;;;;;;;;;;;15879:17;;15766:13;;15879:17;:::i;:::-;-1:-1:-1;;;;;15841:35:0;;;;;;:28;:35;;;;;:55;15429:486;15336:579;;;:::o;9774:1144::-;9860:9;;9814:13;;;;9860:9;;9855:56;;-1:-1:-1;9894:1:0;;;;-1:-1:-1;9774:1144:0:o;9855:56::-;9950:5;-1:-1:-1;;;;;9944:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9921:47;;-1:-1:-1;9921:47:0;-1:-1:-1;9983:12:0;;;;:28;;;10010:1;9999:8;:12;9983:28;9979:932;;;10028:11;10050:8;10042:5;;:16;;;;:::i;:::-;10028:30;;10073:11;10095:8;10087:5;;:16;;;;:::i;:::-;10073:30;;10119:15;10136;10161:5;-1:-1:-1;;;;;10155:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10204:36;;-1:-1:-1;;;10204:36:0;;-1:-1:-1;;;;;1026:32:1;;;10204:36:0;;;1008:51:1;10118:58:0;;-1:-1:-1;10118:58:0;;-1:-1:-1;10211:14:0;10204:27;;;;;;981:18:1;;10204:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10195:6;:45;:70;;;;-1:-1:-1;10264:1:0;10244:17;6399:6;10244;:17;:::i;:::-;:21;10195:70;10191:316;;;10294:1;10286:5;:9;10314:45;10327:7;10336:14;10352:6;10314:12;:45::i;:::-;10378:58;;-1:-1:-1;;;10378:58:0;;-1:-1:-1;;;;;8436:32:1;;;10378:58:0;;;8418:51:1;8485:18;;;8478:34;;;10385:14:0;10378:41;;;;8391:18:1;;10378:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10191:316;;;10477:5;:14;;;10191:316;10534:36;;-1:-1:-1;;;10534:36:0;;-1:-1:-1;;;;;1026:32:1;;;10534:36:0;;;1008:51:1;10541:14:0;10534:27;;;;981:18:1;;10534:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10525:6;:45;:70;;;;-1:-1:-1;10594:1:0;10574:17;6399:6;10574;:17;:::i;:::-;:21;10525:70;10521:316;;;10624:1;10616:5;:9;10644:45;10657:7;10666:14;10682:6;10644:12;:45::i;:::-;10708:58;;-1:-1:-1;;;10708:58:0;;-1:-1:-1;;;;;8436:32:1;;;10708:58:0;;;8418:51:1;8485:18;;;8478:34;;;10715:14:0;10708:41;;;;8391:18:1;;10708:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10521:316;;;10807:5;:14;;;10521:316;10858:41;;;783:25:1;;;839:2;824:18;;817:34;;;10868:10:0;;10858:41;;756:18:1;10858:41:0;;;;;;;10013:898;;;;9979:932;9774:1144;;:::o;29173:355::-;29304:1;29284:5;-1:-1:-1;;;;;29284:17:0;;:21;29276:30;;;;;;29373:69;;;-1:-1:-1;;;;;9852:15:1;;;29373:69:0;;;9834:34:1;9904:15;;;9884:18;;;9877:43;9936:18;;;;9929:34;;;29373:69:0;;;;;;;;;;9769:18:1;;;;29373:69:0;;;;;;;-1:-1:-1;;;;;29373:69:0;-1:-1:-1;;;29373:69:0;;;29362:81;;-1:-1:-1;;;;29362:10:0;;;;:81;;29373:69;29362:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29317:126;;;;29462:7;:57;;;;-1:-1:-1;29474:11:0;;:16;;:44;;;29505:4;29494:24;;;;;;;;;;;;:::i;:::-;29454:66;;;;;;29265:263;;29173:355;;;;:::o;20531:292::-;20600:7;:14;20586:11;20623:193;20640:6;20636:1;:10;20623:193;;;20664:13;20680:7;20688:1;20680:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;20680:10:0;;-1:-1:-1;20756:50:0;20680:10;-1:-1:-1;;20680:10:0;20756:21;:50::i;:::-;-1:-1:-1;;;;;20702:27:0;;;;;;;:20;:27;;;;;;;;20731:14;:21;;;;;;20701:105;;;;;;20648:3;;;;:::i;:::-;;;;20623:193;;19751:399;19886:4;19892;19909:12;19924:36;19933:10;19945:14;19924:8;:36::i;:::-;-1:-1:-1;;;;;20093:17:0;;;;;;:10;:17;;;;;;19909:51;;-1:-1:-1;20125:6:0;;6483:8;;20022:67;20031:36;20040:10;20052:14;20031:8;:36::i;:::-;-1:-1:-1;;;;;20069:19:0;;;;;;:12;:19;;;;;;20022:8;:67::i;:::-;-1:-1:-1;;;;;19999:19:0;;;;;;:12;:19;;;;;;19981:38;;19990:7;;19981:8;:38::i;:::-;:108;;;;:::i;:::-;19980:130;;;;:::i;:::-;:142;;;;:::i;:::-;:151;;;;:::i;:::-;19971:171;20134:7;;-1:-1:-1;19751:399:0;-1:-1:-1;;;;;;19751:399:0:o;29536:335::-;29653:1;29633:5;-1:-1:-1;;;;;29633:17:0;;:21;29625:30;;;;;;29722:63;;-1:-1:-1;;;;;8436:32:1;;;29722:63:0;;;8418:51:1;8485:18;;;8478:34;;;29667:12:0;;;;29711:10;;;-1:-1:-1;;;29745:23:0;8391:18:1;;29722:63:0;8244:274:1;14:131;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;:::-;150:134;;;:::o;289:315::-;357:6;365;418:2;406:9;397:7;393:23;389:32;386:52;;;434:1;431;424:12;386:52;473:9;460:23;492:31;517:5;492:31;:::i;:::-;542:5;594:2;579:18;;;;566:32;;-1:-1:-1;;;289:315:1:o;1252:388::-;1320:6;1328;1381:2;1369:9;1360:7;1356:23;1352:32;1349:52;;;1397:1;1394;1387:12;1349:52;1436:9;1423:23;1455:31;1480:5;1455:31;:::i;:::-;1505:5;-1:-1:-1;1562:2:1;1547:18;;1534:32;1575:33;1534:32;1575:33;:::i;:::-;1627:7;1617:17;;;1252:388;;;;;:::o;1645:247::-;1704:6;1757:2;1745:9;1736:7;1732:23;1728:32;1725:52;;;1773:1;1770;1763:12;1725:52;1812:9;1799:23;1831:31;1856:5;1831:31;:::i;1897:180::-;1956:6;2009:2;1997:9;1988:7;1984:23;1980:32;1977:52;;;2025:1;2022;2015:12;1977:52;-1:-1:-1;2048:23:1;;1897:180;-1:-1:-1;1897:180:1:o;2082:127::-;2143:10;2138:3;2134:20;2131:1;2124:31;2174:4;2171:1;2164:15;2198:4;2195:1;2188:15;2214:1256;2307:6;2315;2368:2;2356:9;2347:7;2343:23;2339:32;2336:52;;;2384:1;2381;2374:12;2336:52;2423:9;2410:23;2442:31;2467:5;2442:31;:::i;:::-;2492:5;-1:-1:-1;2516:2:1;2554:18;;;2541:32;2592:18;2622:14;;;2619:34;;;2649:1;2646;2639:12;2619:34;2687:6;2676:9;2672:22;2662:32;;2732:7;2725:4;2721:2;2717:13;2713:27;2703:55;;2754:1;2751;2744:12;2703:55;2790:2;2777:16;2812:2;2808;2805:10;2802:36;;;2818:18;;:::i;:::-;2864:2;2861:1;2857:10;2896:2;2890:9;2959:2;2955:7;2950:2;2946;2942:11;2938:25;2930:6;2926:38;3014:6;3002:10;2999:22;2994:2;2982:10;2979:18;2976:46;2973:72;;;3025:18;;:::i;:::-;3061:2;3054:22;3111:18;;;3145:15;;;;-1:-1:-1;3187:11:1;;;3183:20;;;3215:19;;;3212:39;;;3247:1;3244;3237:12;3212:39;3271:11;;;;3291:148;3307:6;3302:3;3299:15;3291:148;;;3373:23;3392:3;3373:23;:::i;:::-;3361:36;;3324:12;;;;3417;;;;3291:148;;;3458:6;3448:16;;;;;;;;2214:1256;;;;;:::o;3667:456::-;3744:6;3752;3760;3813:2;3801:9;3792:7;3788:23;3784:32;3781:52;;;3829:1;3826;3819:12;3781:52;3865:9;3852:23;3842:33;;3925:2;3914:9;3910:18;3897:32;3938:31;3963:5;3938:31;:::i;:::-;3988:5;-1:-1:-1;4045:2:1;4030:18;;4017:32;4058:33;4017:32;4058:33;:::i;:::-;4110:7;4100:17;;;3667:456;;;;;:::o;4128:248::-;4196:6;4204;4257:2;4245:9;4236:7;4232:23;4228:32;4225:52;;;4273:1;4270;4263:12;4225:52;-1:-1:-1;;4296:23:1;;;4366:2;4351:18;;;4338:32;;-1:-1:-1;4128:248:1:o;4381:127::-;4442:10;4437:3;4433:20;4430:1;4423:31;4473:4;4470:1;4463:15;4497:4;4494:1;4487:15;4513:125;4553:4;4581:1;4578;4575:8;4572:34;;;4586:18;;:::i;:::-;-1:-1:-1;4623:9:1;;4513:125::o;4643:217::-;4683:1;4709;4699:132;;4753:10;4748:3;4744:20;4741:1;4734:31;4788:4;4785:1;4778:15;4816:4;4813:1;4806:15;4699:132;-1:-1:-1;4845:9:1;;4643:217::o;4865:128::-;4905:3;4936:1;4932:6;4929:1;4926:13;4923:39;;;4942:18;;:::i;:::-;-1:-1:-1;4978:9:1;;4865:128::o;4998:168::-;5038:7;5104:1;5100;5096:6;5092:14;5089:1;5086:21;5081:1;5074:9;5067:17;5063:45;5060:71;;;5111:18;;:::i;:::-;-1:-1:-1;5151:9:1;;4998:168::o;5171:135::-;5210:3;5231:17;;;5228:43;;5251:18;;:::i;:::-;-1:-1:-1;5298:1:1;5287:13;;5171:135::o;5311:127::-;5372:10;5367:3;5363:20;5360:1;5353:31;5403:4;5400:1;5393:15;5427:4;5424:1;5417:15;5443:251;5513:6;5566:2;5554:9;5545:7;5541:23;5537:32;5534:52;;;5582:1;5579;5572:12;5534:52;5614:9;5608:16;5633:31;5658:5;5633:31;:::i;6036:277::-;6103:6;6156:2;6144:9;6135:7;6131:23;6127:32;6124:52;;;6172:1;6169;6162:12;6124:52;6204:9;6198:16;6257:5;6250:13;6243:21;6236:5;6233:32;6223:60;;6279:1;6276;6269:12;7073:184;7143:6;7196:2;7184:9;7175:7;7171:23;7167:32;7164:52;;;7212:1;7209;7202:12;7164:52;-1:-1:-1;7235:16:1;;7073:184;-1:-1:-1;7073:184:1:o;8523:426::-;8652:3;8690:6;8684:13;8715:1;8725:129;8739:6;8736:1;8733:13;8725:129;;;8837:4;8821:14;;;8817:25;;8811:32;8798:11;;;8791:53;8754:12;8725:129;;;8872:6;8869:1;8866:13;8863:48;;;8907:1;8898:6;8893:3;8889:16;8882:27;8863:48;-1:-1:-1;8927:16:1;;;;;8523:426;-1:-1:-1;;8523:426:1:o;8954:245::-;9033:6;9041;9094:2;9082:9;9073:7;9069:23;9065:32;9062:52;;;9110:1;9107;9100:12;9062:52;-1:-1:-1;;9133:16:1;;9189:2;9174:18;;;9168:25;9133:16;;9168:25;;-1:-1:-1;8954:245:1:o;9204:385::-;9283:6;9291;9344:2;9332:9;9323:7;9319:23;9315:32;9312:52;;;9360:1;9357;9350:12;9312:52;9392:9;9386:16;9411:31;9436:5;9411:31;:::i;:::-;9511:2;9496:18;;9490:25;9461:5;;-1:-1:-1;9524:33:1;9490:25;9524:33;:::i

Swarm Source

ipfs://9cbd20125a25a94a5234f0308c21588b2e92d8d0a2106edd5a30cc6f6565597a
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.