Contract 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c30

 

Contract Overview

Balance:
1.127067672453813544 MATIC

MATIC Value:
$0.85 (@ $0.76/MATIC)

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xef04a3b3953828fd7dd7dbf36632146de9a83ec4d1da70e3e104ce29681a9266Transfer329845702022-09-11 20:53:3513 days 4 hrs ago0x12e67e48534ad3f69750d307e12a2a9156c00c50 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.023858816001 32.000000002
0x9d82243b1bb2779333eeeac31c870394e022bdc5d2619bf155d5c632c8cc937fTransfer323764082022-08-27 12:10:1928 days 12 hrs ago0x12e67e48534ad3f69750d307e12a2a9156c00c50 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021152490051 30.000000073
0xdfb9a85663f340d935e05b56da9a0a3ab13e82a4062fea1adfd9ff83ce9112c3Transfer323764082022-08-27 12:10:1928 days 12 hrs ago0x12e67e48534ad3f69750d307e12a2a9156c00c50 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021632970052 30.000000073
0x9e9bfd6fdc52a5ccffb9e47be5e9d2acffc462045c9978d1573fdcc326a417fbTransfer323763172022-08-27 12:07:0928 days 12 hrs ago0x12e67e48534ad3f69750d307e12a2a9156c00c50 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.023696553081 30.000003901
0x0871c66715b5740b6a29b974c7b8a7e838908f1a071b3e7e5daa19ad7219ab36Transfer323762992022-08-27 12:06:3328 days 12 hrs ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021854648717 30.000011967
0x400d60d943c58fbb9d8ed2f76f5625ba3f31f85ac46404ce97752979ca272abfTransfer323762942022-08-27 12:06:2328 days 12 hrs ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021945461154 30.000015248
0x1243c32704d5abb549e7ba992474da5dce5a8f05e745bf254c264d588e3cd4c1Transfer323762912022-08-27 12:06:1728 days 12 hrs ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021945462969 30.000017729
0x0d42d52525e722a49283875d8f37e3726a012da7d5b414a3d6697210f1e99a46Transfer323762882022-08-27 12:06:1128 days 12 hrs ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.023696566696 30.000021138
0x42590f09acb66c51d6c2b37f3f5893ba47d9a545942e0833b2fe10136b137967Transfer323762632022-08-27 12:05:2128 days 13 hrs ago0x12e67e48534ad3f69750d307e12a2a9156c00c50 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021854686421 30.000063723
0x1230eb58fa5cc20488b45bb72977dde77f205f969e54a300c84b39ce7226022dTransfer323762572022-08-27 12:05:0928 days 13 hrs ago0x12e67e48534ad3f69750d307e12a2a9156c00c50 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021945501554 30.000070476
0xddc7a39f908996bfdbdedab81c354dbb108442cc7f00eb0c9ea6df5989fec74eTransfer323762542022-08-27 12:04:5928 days 13 hrs ago0x12e67e48534ad3f69750d307e12a2a9156c00c50 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021945508098 30.000079422
0x20bee4adc5053fe1e15036a7409835c6811364b66955411c4b6b0bb07d294b4eTransfer323762502022-08-27 12:04:5128 days 13 hrs ago0x12e67e48534ad3f69750d307e12a2a9156c00c50 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021945513835 30.000087265
0x38afe4d99badaef3dd0eb8847efb22560b87fb03bb9096e4cad70d93c38b40f4Transfer323762472022-08-27 12:04:4528 days 13 hrs ago0x12e67e48534ad3f69750d307e12a2a9156c00c50 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.023696617238 30.000085124
0x053a19364f3e1a797f63a20b843e0c2dfdddc3d885d93f8148e7715122fce5c9Transfer323762182022-08-27 12:03:4728 days 13 hrs ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021854919263 30.000383347
0xbb9ef1736505aac2323b92280f7047789dbfcdccff503afa2fed235e6ee79230Transfer323762132022-08-27 12:03:3728 days 13 hrs ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.02194580868 30.000490326
0x19d9a86537b169edebe808f5526fdd9ed74f67d1cad1910b8832ed915c1906deTransfer323762062022-08-27 12:03:2328 days 13 hrs ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021945929035 30.000654854
0x0878b6e55663b501678040b6d4d735c1317a51aabaac2168b929d8fce0a49564Transfer323761992022-08-27 12:03:0928 days 13 hrs ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.02194595303 30.000687656
0x864a86ed5f56a60ae7c74b8def727edaf79f3a9847d49aaf9066574617b91bc4Transfer323761922022-08-27 12:02:5528 days 13 hrs ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.023697409318 30.001087903
0x6351df9e934721c5d2ac3933e7a69c6c89ef1681a34736ebc5fee9fb28bf8c20Transfer323761702022-08-27 12:02:0728 days 13 hrs ago0x12e67e48534ad3f69750d307e12a2a9156c00c50 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021904295993 30.06816309
0x93a073e35258043f426056d6a6b02fc6efae9558db8264ae8bd17d93ee748ec9Transfer323761592022-08-27 12:01:4528 days 13 hrs ago0x12e67e48534ad3f69750d307e12a2a9156c00c50 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.021947680171 30.003048702
0x840c176d5679dc3ff744ae13c76fbb08f78b9f8e50c123565c11dcfbba980aa2Transfer323761492022-08-27 12:01:2528 days 13 hrs ago0x12e67e48534ad3f69750d307e12a2a9156c00c50 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.022460611889 30.002887852
0x7922b39ee1c609dedc8ae64893ef3b5ac859cf0576033afed390de446ceb9908Transfer323585722022-08-26 23:23:3829 days 1 hr ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.025168100007 34.405446242
0xb0c7134eb5f6298c88e7520bd4b0678c0b5f1862eb84781351519e9d822937a7Transfer323585542022-08-26 23:23:0229 days 1 hr ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.025953970544 35.479751672
0x2a35b90cb5307da7add0a4e8c35ed3c7ce9fb8ca5555a6ebc07944ea28675f3bTransfer323585442022-08-26 23:22:4229 days 1 hr ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.001324954709 34.504028892
0x459ef8311189113506c3e64f682cfde97facd482f88264b553d36527729d7bc9Transfer323585352022-08-26 23:22:2429 days 1 hr ago0x2278070fb5f4930ef6827a77b162109414f8dda2 IN  0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300 MATIC0.025760681167 35.215520075
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xef04a3b3953828fd7dd7dbf36632146de9a83ec4d1da70e3e104ce29681a9266329845702022-09-11 20:53:3513 days 4 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300x972c56de17466958891bede00fe68d24eab8c2c40.006391972165719771 MATIC
0xef04a3b3953828fd7dd7dbf36632146de9a83ec4d1da70e3e104ce29681a9266329845702022-09-11 20:53:3513 days 4 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c30 0x7e3bd60e7b95dffc3bdfea4e3237e8d5bd3e2cc30.025567888662879085 MATIC
0xef04a3b3953828fd7dd7dbf36632146de9a83ec4d1da70e3e104ce29681a9266329845702022-09-11 20:53:3513 days 4 hrs ago QuickSwap: Router 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300.038351832994318628 MATIC
0x9d82243b1bb2779333eeeac31c870394e022bdc5d2619bf155d5c632c8cc937f323764082022-08-27 12:10:1928 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300x972c56de17466958891bede00fe68d24eab8c2c40.00642014138956635 MATIC
0x9d82243b1bb2779333eeeac31c870394e022bdc5d2619bf155d5c632c8cc937f323764082022-08-27 12:10:1928 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c30 0x7e3bd60e7b95dffc3bdfea4e3237e8d5bd3e2cc30.025680565558265402 MATIC
0x9d82243b1bb2779333eeeac31c870394e022bdc5d2619bf155d5c632c8cc937f323764082022-08-27 12:10:1928 days 12 hrs ago QuickSwap: Router 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300.038520848337398103 MATIC
0xdfb9a85663f340d935e05b56da9a0a3ab13e82a4062fea1adfd9ff83ce9112c3323764082022-08-27 12:10:1928 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300x972c56de17466958891bede00fe68d24eab8c2c40.006448497330052525 MATIC
0xdfb9a85663f340d935e05b56da9a0a3ab13e82a4062fea1adfd9ff83ce9112c3323764082022-08-27 12:10:1928 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c30 0x7e3bd60e7b95dffc3bdfea4e3237e8d5bd3e2cc30.025793989320210101 MATIC
0xdfb9a85663f340d935e05b56da9a0a3ab13e82a4062fea1adfd9ff83ce9112c3323764082022-08-27 12:10:1928 days 12 hrs ago QuickSwap: Router 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300.038690983980315152 MATIC
0x9e9bfd6fdc52a5ccffb9e47be5e9d2acffc462045c9978d1573fdcc326a417fb323763172022-08-27 12:07:0928 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300x972c56de17466958891bede00fe68d24eab8c2c40.006477041641424519 MATIC
0x9e9bfd6fdc52a5ccffb9e47be5e9d2acffc462045c9978d1573fdcc326a417fb323763172022-08-27 12:07:0928 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c30 0x7e3bd60e7b95dffc3bdfea4e3237e8d5bd3e2cc30.025908166565698077 MATIC
0x9e9bfd6fdc52a5ccffb9e47be5e9d2acffc462045c9978d1573fdcc326a417fb323763172022-08-27 12:07:0928 days 12 hrs ago QuickSwap: Router 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300.038862249848547116 MATIC
0x0871c66715b5740b6a29b974c7b8a7e838908f1a071b3e7e5daa19ad7219ab36323762992022-08-27 12:06:3328 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300x972c56de17466958891bede00fe68d24eab8c2c40.006505775996292087 MATIC
0x0871c66715b5740b6a29b974c7b8a7e838908f1a071b3e7e5daa19ad7219ab36323762992022-08-27 12:06:3328 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c30 0x7e3bd60e7b95dffc3bdfea4e3237e8d5bd3e2cc30.026023103985168348 MATIC
0x0871c66715b5740b6a29b974c7b8a7e838908f1a071b3e7e5daa19ad7219ab36323762992022-08-27 12:06:3328 days 12 hrs ago QuickSwap: Router 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300.039034655977752522 MATIC
0x400d60d943c58fbb9d8ed2f76f5625ba3f31f85ac46404ce97752979ca272abf323762942022-08-27 12:06:2328 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300x972c56de17466958891bede00fe68d24eab8c2c40.006534702085873704 MATIC
0x400d60d943c58fbb9d8ed2f76f5625ba3f31f85ac46404ce97752979ca272abf323762942022-08-27 12:06:2328 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c30 0x7e3bd60e7b95dffc3bdfea4e3237e8d5bd3e2cc30.026138808343494817 MATIC
0x400d60d943c58fbb9d8ed2f76f5625ba3f31f85ac46404ce97752979ca272abf323762942022-08-27 12:06:2328 days 12 hrs ago QuickSwap: Router 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300.039208212515242226 MATIC
0x1243c32704d5abb549e7ba992474da5dce5a8f05e745bf254c264d588e3cd4c1323762912022-08-27 12:06:1728 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300x972c56de17466958891bede00fe68d24eab8c2c40.006563821620245586 MATIC
0x1243c32704d5abb549e7ba992474da5dce5a8f05e745bf254c264d588e3cd4c1323762912022-08-27 12:06:1728 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c30 0x7e3bd60e7b95dffc3bdfea4e3237e8d5bd3e2cc30.026255286480982346 MATIC
0x1243c32704d5abb549e7ba992474da5dce5a8f05e745bf254c264d588e3cd4c1323762912022-08-27 12:06:1728 days 12 hrs ago QuickSwap: Router 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300.03938292972147352 MATIC
0x0d42d52525e722a49283875d8f37e3726a012da7d5b414a3d6697210f1e99a46323762882022-08-27 12:06:1128 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300x972c56de17466958891bede00fe68d24eab8c2c40.006593136328594603 MATIC
0x0d42d52525e722a49283875d8f37e3726a012da7d5b414a3d6697210f1e99a46323762882022-08-27 12:06:1128 days 12 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c30 0x7e3bd60e7b95dffc3bdfea4e3237e8d5bd3e2cc30.026372545314378414 MATIC
0x0d42d52525e722a49283875d8f37e3726a012da7d5b414a3d6697210f1e99a46323762882022-08-27 12:06:1128 days 12 hrs ago QuickSwap: Router 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300.039558817971567622 MATIC
0x42590f09acb66c51d6c2b37f3f5893ba47d9a545942e0833b2fe10136b137967323762632022-08-27 12:05:2128 days 13 hrs ago 0xd88ad19e67238d8bc7a217913e8d8ccb983d8c300x972c56de17466958891bede00fe68d24eab8c2c40.006622647959475161 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ICash

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 8 : ACash.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./DividendDistributor.sol";

contract ICash is IERC20, Auth {
    using SafeMath for uint256;
    using Address for address;

    IERC20 WETH;
    IERC20 REWARDS;
    IERC20 USDT = IERC20(0xc2132D05D31c914a87C6611C10748AEb04B58e8F);
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;
    address DEAD_NON_CHECKSUM = 0x000000000000000000000000000000000000dEaD;

    string constant _name = "iCash";
    string constant _symbol = "iCash";
    uint8 constant _decimals = 9;

    uint256 _totalSupply = 10_000_000 * (10 ** _decimals);
    uint256 public _maxTxAmount = _totalSupply.div(400); // 0.25%

    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) _allowances;

    mapping (address => bool) isFeeExempt;
    mapping (address => bool) isTxLimitExempt;
    mapping (address => bool) isDividendExempt;
    mapping (address => bool) public automatedMarketMakerPairs;

    uint256 liquidityFee = 100;
    uint256 buybackFee = 100;
    uint256 reflectionFee = 800;
    uint256 marketingFee = 200;
    uint256 totalFee = 1200;
    uint256 feeDenominator = 10000;

    address payable public autoLiquidityReceiver;
    address payable public marketingFeeReceiver;

    uint256 targetLiquidity = 25;
    uint256 targetLiquidityDenominator = 100;

    IUniswapV2Router02 public router;
    address public pair;

    uint256 public launchedAt;
    uint256 public launchedAtTimestamp;

    uint256 buybackMultiplierNumerator = 200;
    uint256 buybackMultiplierDenominator = 100;
    uint256 buybackMultiplierTriggeredAt;
    uint256 buybackMultiplierLength = 30 minutes;

    bool public autoBuybackEnabled = false;
    bool public autoBuybackOverride = false;
    mapping(address => bool) internal bots;
    uint256 autoBuybackCap;
    uint256 autoBuybackAccumulator;
    uint256 autoBuybackAmount;
    uint256 autoBuybackBlockPeriod;
    uint256 autoBuybackBlockLast;

    DividendDistributor distributor;
    address public distributorAddress;

    uint256 distributorGas = 500000;

    bool public swapEnabled = true;
    bool public antiBotEnabled;
    uint256 public swapThreshold = _totalSupply / 2000; // 0.005%
    bool inSwap;

    event SetAutomatedMarketMakerPair(address amm);
    event RemoveAutomatedMarketMakerPair(address amm);

    modifier swapping() { inSwap = true; _; inSwap = false; }

    constructor () Auth(payable(msg.sender)) {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff
        );
        router = _uniswapV2Router;
        WETH = IERC20(router.WETH());
        pair = IUniswapV2Factory(router.factory()).createPair(address(this), router.WETH());

        _allowances[address(this)][address(router)] = _totalSupply;
        _allowances[address(this)][address(pair)] = _totalSupply;
        distributor = new DividendDistributor();
        distributorAddress = address(distributor);

        autoLiquidityReceiver = payable(0x70032EFedf038906Bb09BF17CB01E77DB5B01FFA);
        marketingFeeReceiver = payable(0x933951D597660754e7C14EC2F689738ba11C0F92);

        antiBotEnabled = true;
        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(this)] = true;
        isFeeExempt[address(pair)] = true;
        isFeeExempt[address(router)] = true;
        isFeeExempt[address(distributorAddress)] = true;
        isFeeExempt[address(autoLiquidityReceiver)] = true;
        isFeeExempt[address(marketingFeeReceiver)] = true;
        isTxLimitExempt[msg.sender] = true;
        isTxLimitExempt[address(this)] = true;
        isTxLimitExempt[address(pair)] = true;
        isTxLimitExempt[address(router)] = true;
        isTxLimitExempt[address(distributorAddress)] = true;
        isTxLimitExempt[address(autoLiquidityReceiver)] = true;
        isTxLimitExempt[address(marketingFeeReceiver)] = true;
        isDividendExempt[msg.sender] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[address(pair)] = true;
        isDividendExempt[address(router)] = true;
        isDividendExempt[address(distributorAddress)] = true;
        isDividendExempt[address(autoLiquidityReceiver)] = true;
        isDividendExempt[address(marketingFeeReceiver)] = true;
        isDividendExempt[DEAD] = true;
        
        setAutomatedMarketMakerPair(address(pair));
        authorize(msg.sender);

        _balances[msg.sender] = _totalSupply;

        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable {}

    function totalSupply() external view override returns (uint256) { return _totalSupply; }
    function decimals() external pure returns (uint8) { return _decimals; }
    function symbol() external pure returns (string memory) { return _symbol; }
    function name() external pure returns (string memory) { return _name; }
    function getOwner() external view returns (address) { return owner; }
    function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function approveMax(address spender) external returns (bool) {
        return approve(spender, _totalSupply);
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if(_allowances[sender][msg.sender] != _totalSupply){
            require(_allowances[sender][msg.sender] >= amount, "Request exceeds sender token allowance.");
            _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        }
        return _transferFrom(sender, recipient, amount);
    }

    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        uint256 senderTokenBalance = IERC20(address(this)).balanceOf(address(sender));
        require(amount <= senderTokenBalance, "Request exceeds sender token balance.");
        require(amount > 0, "Transfer amount must be greater than zero");
        if (antiBotEnabled) {
            checkBotsBlacklist(sender, recipient);
        }
        if(inSwap){ return _basicTransfer(sender, recipient, amount); }

        checkTxLimit(sender, amount);
        if(shouldSwapBack(address(sender))){ swapBack(); }
        if(shouldAutoBuyback(address(sender))){ triggerAutoBuyback(); }

        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");

        uint256 amountReceived = shouldTakeFee(sender) ? takeFee(payable(sender), payable(recipient), amount) : amount;

        _balances[recipient] = _balances[recipient].add(amountReceived);

        if(!isDividendExempt[sender]){ try distributor.setShare(payable(sender), _balances[sender]) {} catch {} }
        if(!isDividendExempt[recipient]){ try distributor.setShare(payable(recipient), _balances[recipient]) {} catch {} }

        try distributor.process(distributorGas) {} catch {}

        emit Transfer(sender, recipient, amountReceived);
        return true;
    }

    function rescueStuckTokens(address _tok, address payable recipient, uint256 amount) public payable onlyOwner {
        uint256 contractTokenBalance = IERC20(_tok).balanceOf(address(this));
        require(amount <= contractTokenBalance, "Request exceeds contract token balance.");
        // rescue stuck tokens 
        IERC20(_tok).transfer(recipient, amount);
    }

    function rescueStuckNative(address payable recipient) public payable onlyOwner {
        // get the amount of Ether stored in this contract
        uint contractETHBalance = address(this).balance;
        // rescue Ether to recipient
        (bool success, ) = recipient.call{value: contractETHBalance}("");
        require(success, "Failed to rescue Ether");
    }

    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        _balances[recipient] = _balances[recipient].add(amount);
        return true;
    }

    function checkTxLimit(address sender, uint256 amount) internal view {
        require(amount <= _maxTxAmount || isTxLimitExempt[sender], "TX Limit Exceeded");
    }
    
    function checkBotsBlacklist(address sender, address recipient) internal view {
        require(!bots[sender] && !bots[recipient], "TOKEN: Your account is blacklisted!");
    }
 
    function blockBots(address[] memory bots_) public authorized {
        for (uint256 i = 0; i < bots_.length; i++) {
            bots[bots_[i]] = true;
        }
    }
    
    function blockBot(address bot_) public authorized {
        bots[bot_] = true;
    }
 
    function unblockBots(address[] memory bots_) public authorized {
        for (uint256 i = 0; i < bots_.length; i++) {
            bots[bots_[i]] = false;
        }
    }

    function unblockBot(address notbot) public authorized {
        bots[notbot] = false;
    }

    function shouldTakeFee(address sender) internal view returns (bool) {
        return !isFeeExempt[sender];
    }

    function getTotalFee(bool selling) public view returns (uint256) {
        if(launchedAt + 1 >= block.number){ return feeDenominator.sub(1); }
        if(selling){ return getMultipliedFee(); }
        return totalFee;
    }

    function getMultipliedFee() public view returns (uint256) {
        if (launchedAtTimestamp + 1 days > block.timestamp) {
            return totalFee.mul(18000).div(feeDenominator);
        } else if (buybackMultiplierTriggeredAt.add(buybackMultiplierLength) > block.timestamp) {
            uint256 remainingTime = buybackMultiplierTriggeredAt.add(buybackMultiplierLength).sub(block.timestamp);
            uint256 feeIncrease = totalFee.mul(buybackMultiplierNumerator).div(buybackMultiplierDenominator).sub(totalFee);
            return totalFee.add(feeIncrease.mul(remainingTime).div(buybackMultiplierLength));
        }
        return totalFee;
    }

    function takeFee(address payable sender, address payable receiver, uint256 amount) internal returns (uint256) {
        uint256 feeAmount = amount.mul(getTotalFee(receiver == pair)).div(feeDenominator);

        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);

        return amount.sub(feeAmount);
    }

    function shouldSwapBack(address from) internal view returns (bool) {
        if (!inSwap && swapEnabled && !automatedMarketMakerPairs[from] && _balances[address(this)] >= swapThreshold){
            return true;
        } else {
            return false;
            }
    }

    function swapBack() internal swapping {
        uint256 dynamicLiquidityFee = isOverLiquified(targetLiquidity, targetLiquidityDenominator) ? 0 : liquidityFee;
        uint256 amountToLiquify = swapThreshold.mul(dynamicLiquidityFee).div(totalFee).div(2);
        uint256 amountToSwap = swapThreshold.sub(amountToLiquify);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = address(WETH);
        uint256 balanceBefore = address(this).balance;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountETH = address(this).balance.sub(balanceBefore);
        uint256 totalETHFee = totalFee.sub(dynamicLiquidityFee.div(2));
        uint256 amountETHLiquidity = amountETH.mul(dynamicLiquidityFee).div(totalETHFee).div(2);
        uint256 amountETHReflection = amountETH.mul(reflectionFee).div(totalETHFee);
        uint256 amountETHMarketing = amountETH.mul(marketingFee).div(totalETHFee);

        try distributor.deposit{value: amountETHReflection}() {} catch {}
        payable(marketingFeeReceiver).transfer(amountETHMarketing);

        if(amountToLiquify > 0){
            router.addLiquidityETH{value: amountETHLiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                autoLiquidityReceiver,
                block.timestamp
            );
            emit AutoLiquify(amountETHLiquidity, amountToLiquify);
        }
    }

    function shouldAutoBuyback(address from) internal view returns (bool) {
        if(autoBuybackBlockLast + autoBuybackBlockPeriod <= block.number || autoBuybackOverride == true){
            if (!inSwap && autoBuybackEnabled && !automatedMarketMakerPairs[from] && address(this).balance >= autoBuybackAmount){
                return true;
            } else {
                return false;
                }
        } else { 
            return false; 
        }
    }

    function triggerZeusBuyback(uint256 amount, bool triggerBuybackMultiplier) external authorized {
        buyTokens(amount, DEAD);
        if(triggerBuybackMultiplier){
            buybackMultiplierTriggeredAt = block.timestamp;
            emit BuybackMultiplierActive(buybackMultiplierLength);
        }
    }

    function clearBuybackMultiplier() external authorized {
        buybackMultiplierTriggeredAt = 0;
    }

    function triggerAutoBuyback() internal {
        buyTokens(autoBuybackAmount, DEAD);
        autoBuybackBlockLast = block.number;
        autoBuybackAccumulator = autoBuybackAccumulator.add(autoBuybackAmount);
        if(autoBuybackAccumulator > autoBuybackCap){ autoBuybackEnabled = false; }
    }

    function buyTokens(uint256 amount, address to) internal swapping {
        address[] memory path = new address[](2);
        path[0] = address(WETH);
        path[1] = address(this);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            to,
            block.timestamp
        );
    }

    function setAutoBuybackSettings(bool _enabled, uint256 _cap, uint256 _amount, uint256 _period) public authorized returns (bool) {
        autoBuybackEnabled = _enabled;
        autoBuybackCap = _cap;
        autoBuybackAccumulator = 0;
        autoBuybackAmount = _amount;
        autoBuybackBlockPeriod = _period;
        autoBuybackBlockLast = block.number;
        require(autoBuybackEnabled == true || autoBuybackEnabled == false);
        return true;
    }

    function setBuybackMultiplierSettings(uint256 numerator, uint256 denominator, uint256 length) external authorized returns (bool) {
        require(numerator / denominator <= 2 && numerator > denominator);
        buybackMultiplierNumerator = numerator;
        buybackMultiplierDenominator = denominator;
        buybackMultiplierLength = length;
        return true;
    }

    function launched() internal view returns (bool) {
        return launchedAt != 0;
    }

    function launch() public authorized {
        require(launchedAt == 0, "Already launched");
        launchedAt = block.number;
        launchedAtTimestamp = block.timestamp;
    }

    function setTxLimit(uint256 amount) external authorized {
        require(amount >= _totalSupply / 1000);
        _maxTxAmount = amount;
    }

    function setIsDividendExempt(address payable holder, bool exempt) external authorized {
        require(holder != address(this) && holder != pair);
        isDividendExempt[address(holder)] = exempt;
        if(exempt){
            distributor.setShare(payable(holder), 0);
        } else{
            distributor.setShare(payable(holder), _balances[holder]);
        }
    }
    
    function enableAutoBuyBackOverride() external authorized {
        autoBuybackOverride = true;
    }

    function disableAutoBuyBackOverride() external authorized {
        autoBuybackOverride = false;
    }

    function setIsFeeExempt(address holder, bool exempt) external authorized {
        isFeeExempt[holder] = exempt;
    }

    function setIsTxLimitExempt(address holder, bool exempt) external authorized {
        isTxLimitExempt[holder] = exempt;
    }

    function setFees(uint256 _liquidityFee, uint256 _buybackFee, uint256 _reflectionFee, uint256 _marketingFee, uint256 _feeDenominator) external authorized returns (bool) {
        liquidityFee = _liquidityFee;
        buybackFee = _buybackFee;
        reflectionFee = _reflectionFee;
        marketingFee = _marketingFee;
        uint256 ttlFee = setTotalFee(_liquidityFee,_buybackFee,_reflectionFee,_marketingFee);
        feeDenominator = _feeDenominator;
        require(ttlFee < feeDenominator/4);
        return true;
    }

    function setFeeReceivers(address payable _autoLiquidityReceiver, address payable _marketingFeeReceiver) public authorized {
        autoLiquidityReceiver = _autoLiquidityReceiver;
        marketingFeeReceiver = _marketingFeeReceiver;
    }

    function setSwapBackSettings(bool _enabled, uint256 _amount) public authorized {
        swapEnabled = _enabled;
        swapThreshold = _amount;
    }

    function setTargetLiquidity(uint256 _target, uint256 _denominator) external authorized {
        targetLiquidity = _target;
        targetLiquidityDenominator = _denominator;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external authorized {
        distributor.setDistributionCriteria(_minPeriod, _minDistribution);
    }

    function setDistributorSettings(uint256 gas) external authorized returns (bool) {        
        require(
            gas >= 200000 && gas <= 500000,
            "gas must be between 200,000 and 500,000"
        );
        require(gas != distributorGas, "Cannot update gasForProcessing to same value");
        distributorGas = gas;
        return true;
    }

    function setTotalFee(uint256 _liquidityFee, uint256 _buybackFee, uint256 _reflectionFee, uint256 _marketingFee) internal authorized returns (uint256) {
        totalFee = (_liquidityFee + _buybackFee + _reflectionFee + _marketingFee);
        return totalFee; 
    }

    function getCirculatingSupply() public view returns (uint256) {
        uint256 deadBal = IERC20(address(this)).balanceOf(address(DEAD));
        uint256 zeroBal = IERC20(address(this)).balanceOf(address(ZERO));
        return _totalSupply.sub(deadBal).sub(zeroBal);
    }

    function getLiquidityBacking(uint256 accuracy) public view returns (uint256) {
        uint256 pairBal = IERC20(address(this)).balanceOf(address(pair));
        return accuracy.mul(pairBal.mul(2)).div(getCirculatingSupply());
    }

    function isOverLiquified(uint256 target, uint256 accuracy) public view returns (bool) {
        return getLiquidityBacking(accuracy) > target;
    }

    function changeRouter(address _newRouter) external onlyOwner {        
        IUniswapV2Router02 _newUniswapRouter = IUniswapV2Router02(_newRouter);
        pair = IUniswapV2Factory(_newUniswapRouter.factory()).createPair(address(this), _newUniswapRouter.WETH());
        router = _newUniswapRouter;
    }

    function changeDividendDistributor() external onlyOwner {
        distributor = new DividendDistributor();
        distributorAddress = address(distributor);
    }

    function setAutomatedMarketMakerPair(address amm) public onlyOwner {
        automatedMarketMakerPairs[amm] = true;
        emit SetAutomatedMarketMakerPair(amm);
    }
    
    function removeAutomatedMarketMakerPair(address amm) public onlyOwner {
        automatedMarketMakerPairs[amm] = false;
        emit RemoveAutomatedMarketMakerPair(amm);
    }

    /**
     * Transfer ownership to new address. Caller must be owner. 
     * Deauthorizes old owner, and sets fee receivers to new owner, while disabling swapBack()
     * New owner must reset fees, and re-enable swapBack()
     */
    function transferOwnership(address payable adr) public virtual override onlyOwner returns (bool) {
        unauthorize(owner);
        owner = adr;
        authorizations[adr] = true;
        setFeeReceivers(adr, adr);
        autoBuybackEnabled = false;
        setSwapBackSettings(false, 0);
        emit OwnershipTransferred(adr);
        return true;
    }

    /**
    * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized
    */
    function takeOwnership() public virtual override {
        require(isOwner(address(0)) || isAuthorized(msg.sender), "Unauthorized! Non-Zero address detected as this contract current owner. Contact this contract current owner to takeOwnership(). ");
        unauthorize(owner);
        unauthorize(_owner);
        _owner = payable(msg.sender);
        owner = _owner;
        authorize(msg.sender);
        emit OwnershipTransferred(msg.sender);
    }

    event AutoLiquify(uint256 amountETH, uint256 amountBOG);
    event BuybackMultiplierActive(uint256 duration);
}

File 2 of 8 : SafeMath.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
 * SAFEMATH LIBRARY
 */
library SafeMath {
    
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 3 of 8 : IUniswap.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

File 4 of 8 : IERC20.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

File 5 of 8 : IDividendDistributor.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address payable shareholder, uint256 amount) external;
    function deposit() external payable;
    function process(uint256 gas) external;
}

File 6 of 8 : DividendDistributor.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./SafeMath.sol";
import "./Auth.sol";
import "./IUniswap.sol";
import "./IDividendDistributor.sol";
import "./IERC20.sol";
contract DividendDistributor is IDividendDistributor, Auth {
    using SafeMath for uint256;
    using Address for address;

    address payable public _token;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }

    IERC20 WETH;
    IERC20 REWARDS;
    IERC20 USDT = IERC20(0xc2132D05D31c914a87C6611C10748AEb04B58e8F);
    IUniswapV2Router02 public router = IUniswapV2Router02(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff);

    address payable[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;
    mapping (address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;
    uint256 public minPeriod = 1 hours;
    uint256 public minDistribution = 1 * (10 ** 18);
    uint256 currentIndex;

    bool initialized;

    event Received(address, uint);
    event ReceivedFallback(address, uint);

    modifier onlyToken() virtual {
        require(msg.sender == _token,"UNAUTHORIZED!"); _;
    }

    modifier onlyOwner() override {
        require(msg.sender == owner,"UNAUTHORIZED!"); _;
    }

    constructor () Auth(payable(msg.sender)) {
        initialized = true;
        address sender = 0x972c56de17466958891BeDE00Fe68d24eAb8c2C4;
        _token = payable(msg.sender);
        WETH = IERC20(router.WETH());
        REWARDS = IERC20(0xc2132D05D31c914a87C6611C10748AEb04B58e8F);
        authorize(sender);
    }

    receive() external payable {
        if(msg.sender == _token){
            deposit();
        } else {
            bankroll();
        }
        emit Received(msg.sender, msg.value);
    }

    fallback() external payable {
        bankroll();
        emit ReceivedFallback(msg.sender, msg.value);
    }

    function getContractAddress() public view returns (address) {
        return address(this);
    }

    function getContractEtherBalance() public view returns (uint256) {
        return address(this).balance;
    }

    function getContractNativeTokenBalance() public view returns (uint256) {
        return IERC20(address(this)).balanceOf(address(this));
    }

    function rescueStuckTokens(address _tok, address payable recipient, uint256 amount) public onlyOwner returns (bool){
        require(msg.sender == owner, "UNAUTHORIZED");
        uint256 contractTokenBalance = IERC20(_tok).balanceOf(address(this));
        require(amount <= contractTokenBalance, "Request exceeds contract token balance.");
        // rescue stuck tokens 
        IERC20(_tok).transfer(recipient, amount);
        return true;
    }

    function rescueStuckNative(address payable recipient) public onlyOwner returns (bool) {
        require(msg.sender == owner, "UNAUTHORIZED");
        // get the amount of Ether stored in this contract
        uint contractETHBalance = address(this).balance;
        // rescue Ether to recipient
        (bool success, ) = recipient.call{value: contractETHBalance}("");
        require(success, "Failed to rescue Ether");
        return true;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) public override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
    }

    function setShare(address payable shareholder, uint256 amount) public override onlyToken {
        if(shares[payable(shareholder)].amount > 0){
            distributeDividend(payable(shareholder));
        }

        if(amount > 0 && shares[payable(shareholder)].amount == 0){
            addShareholder(payable(shareholder));
        }else if(amount == 0 && shares[payable(shareholder)].amount > 0){
            removeShareholder(payable(shareholder));
        }

        totalShares = totalShares.sub(shares[payable(shareholder)].amount).add(amount);
        shares[payable(shareholder)].amount = amount;
        shares[payable(shareholder)].totalExcluded = getCumulativeDividends(shares[payable(shareholder)].amount);
    }

    function deposit() public payable override onlyToken {
        if(address(REWARDS) != address(USDT)){
            uint256 balanceBefore = REWARDS.balanceOf(address(this));

            address[] memory path = new address[](2);
            path[0] = address(WETH);
            path[1] = address(REWARDS);

            router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}(
                0,
                path,
                address(this),
                block.timestamp
            );

            uint256 amount = REWARDS.balanceOf(address(this)).sub(balanceBefore);
            totalDividends = totalDividends.add(amount);
            dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
        } else {
            uint256 balanceBefore = USDT.balanceOf(address(this));

            address[] memory path = new address[](2);
            path[0] = address(WETH);
            path[1] = address(USDT);

            router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}(
                0,
                path,
                address(this),
                block.timestamp
            );

            uint256 amount = USDT.balanceOf(address(this)).sub(balanceBefore);
            totalDividends = totalDividends.add(amount);
            dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
        }
    }
    
    function bankroll() public payable onlyOwner {
        if(address(REWARDS) != address(USDT)){
            uint256 balanceBefore = REWARDS.balanceOf(address(this));

            address[] memory path = new address[](2);
            path[0] = address(WETH);
            path[1] = address(REWARDS);

            router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}(
                0,
                path,
                address(this),
                block.timestamp
            );

            uint256 amount = REWARDS.balanceOf(address(this)).sub(balanceBefore);
            totalDividends = totalDividends.add(amount);
            dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
        } else {
            uint256 balanceBefore = USDT.balanceOf(address(this));

            address[] memory path = new address[](2);
            path[0] = address(WETH);
            path[1] = address(USDT);

            router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}(
                0,
                path,
                address(this),
                block.timestamp
            );

            uint256 amount = USDT.balanceOf(address(this)).sub(balanceBefore);
            totalDividends = totalDividends.add(amount);
            dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
        }
    }

    function process(uint256 gas) public override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        uint256 iterations = 0;

        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){
                currentIndex = 0;
            }

            if(shouldDistribute(shareholders[currentIndex])){
                distributeDividend(shareholders[currentIndex]);
            }

            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }

    function shouldDistribute(address payable shareholder) internal view returns (bool) {
        return shareholderClaims[payable(shareholder)] + minPeriod < block.timestamp
        && getUnpaidEarnings(payable(shareholder)) > minDistribution;
    }

    function distributeDividend(address payable shareholder) internal {
        if(shares[payable(shareholder)].amount == 0){ return; }

        uint256 amount = getUnpaidEarnings(payable(shareholder));
        if(amount > 0){
            totalDistributed = totalDistributed.add(amount);
            if(address(REWARDS) != address(USDT)){
                REWARDS.transfer(payable(shareholder), amount);
            } else {
                USDT.transfer(payable(shareholder), amount);
            }
            shareholderClaims[shareholder] = block.timestamp;
            shares[payable(shareholder)].totalRealised = shares[payable(shareholder)].totalRealised.add(amount);
            shares[payable(shareholder)].totalExcluded = getCumulativeDividends(shares[payable(shareholder)].amount);
        }
    }

    function claimDividend() external {
        distributeDividend(payable(msg.sender));
    }

    function getUnpaidEarnings(address payable shareholder) public view returns (uint256) {
        if(shares[payable(shareholder)].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[payable(shareholder)].amount);
        uint256 shareholderTotalExcluded = shares[payable(shareholder)].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address payable shareholder) internal virtual {
        shareholderIndexes[payable(shareholder)] = shareholders.length;
        shareholders.push(payable(shareholder));
    }

    function removeShareholder(address payable shareholder) internal virtual {
        shareholders[shareholderIndexes[payable(shareholder)]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[payable(shareholder)];
        shareholders.pop();
    }

    function changeRouter(address _newRouter, address payable _newRewards) public virtual onlyOwner returns (bool) {
        require(msg.sender == owner, "UNAUTHORIZED");
        router = IUniswapV2Router02(_newRouter);
        return changeRewardsContract(payable(_newRewards));
    }

    function changeTokenContract(address payable _newToken) public virtual onlyOwner returns (bool) {
        require(msg.sender == owner, "UNAUTHORIZED");
        _token = payable(_newToken);
        return true;
    }

    function changeRewardsContract(address payable _newRewardsToken) public virtual onlyOwner returns (bool) {
        require(msg.sender == owner, "UNAUTHORIZED");
        REWARDS = IERC20(_newRewardsToken);
        return true;
    }

    function transferOwnership(address payable adr) public virtual override onlyOwner returns (bool) {
        require(msg.sender == owner, "UNAUTHORIZED");
        owner = payable(adr);
        emit OwnershipTransferred(adr);
        return true;
    }

    /**
    * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized
    */
    function takeOwnership() public virtual override {
        require(isOwner(address(0)) || isAuthorized(msg.sender), "Unauthorized! Non-Zero address detected as this contract current owner. Contact this contract current owner to takeOwnership(). ");
        unauthorize(owner);
        unauthorize(_owner);
        _owner = payable(msg.sender);
        owner = _owner;
        authorize(msg.sender);
        emit OwnershipTransferred(msg.sender);
    }
}

File 7 of 8 : Auth.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./Address.sol";
abstract contract Auth {
    using Address for address;
    address public owner;
    address public _owner;
    mapping (address => bool) internal authorizations;

    constructor(address payable _maintainer) {
        _owner = payable(_maintainer);
        owner = payable(_owner);
        authorizations[_owner] = true;
        authorize(msg.sender);
    }

    /**
     * Function modifier to require caller to be contract owner
     */
    modifier onlyOwner() virtual {
        require(isOwner(msg.sender), "!OWNER"); _;
    }

    /**
     * Function modifier to require caller to be contract owner
     */
    modifier onlyZero() virtual {
        require(isOwner(address(0)), "!ZERO"); _;
    }

    /**
     * Function modifier to require caller to be authorized
     */
    modifier authorized() virtual {
        require(isAuthorized(msg.sender), "!AUTHORIZED"); _;
    }

    /**
     * Authorize address. Owner only
     */
    function authorize(address adr) public onlyOwner {
        authorizations[adr] = true;
    }

    /**
     * Remove address' authorization. Owner only
     */
    function unauthorize(address adr) public onlyOwner {
        authorizations[adr] = false;
    }

    /**
     * Check if address is owner
     */
    function isOwner(address account) public view returns (bool) {
        if(account == owner || account == _owner){
            return true;
        } else {
            return false;
        }
    }

    /**
     * Return address' authorization status
     */
    function isAuthorized(address adr) public view returns (bool) {
        return authorizations[adr];
    }

    /**
    * @dev Leaves the contract without owner. It will not be possible to call
    * `onlyOwner` functions anymore. Can only be called by the current owner.
    *
    * NOTE: Renouncing ownership will leave the contract without an owner,
    * thereby removing any functionality that is only available to the owner.
    */
    function renounceOwnership() public virtual onlyOwner {
        require(isOwner(msg.sender), "Unauthorized!");
        emit OwnershipTransferred(address(0));
        unauthorize(owner);
        unauthorize(_owner);
        _owner = address(0);
        owner = _owner;
    }

    /**
     * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized
     */
    function transferOwnership(address payable adr) public virtual onlyOwner returns (bool) {
        unauthorize(owner);
        unauthorize(_owner);
        _owner = payable(adr);
        owner = _owner;
        authorize(adr);
        emit OwnershipTransferred(adr);
        return true;
    }    
    
    /**
     * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized
     */
    function takeOwnership() public virtual {
        require(isOwner(address(0)) || isAuthorized(msg.sender), "Unauthorized! Non-Zero address detected as this contract current owner. Contact this contract current owner to takeOwnership(). ");
        unauthorize(owner);
        unauthorize(_owner);
        _owner = payable(msg.sender);
        owner = _owner;
        authorize(msg.sender);
        emit OwnershipTransferred(msg.sender);
    }

    event OwnershipTransferred(address owner);
}

File 8 of 8 : Address.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountBOG","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"BuybackMultiplierActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"amm","type":"address"}],"name":"RemoveAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"amm","type":"address"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiBotEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBuybackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoBuybackOverride","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoLiquidityReceiver","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"bot_","type":"address"}],"name":"blockBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"bots_","type":"address[]"}],"name":"blockBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeDividendDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRouter","type":"address"}],"name":"changeRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearBuybackMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"disableAutoBuyBackOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableAutoBuyBackOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"accuracy","type":"uint256"}],"name":"getLiquidityBacking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMultipliedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"selling","type":"bool"}],"name":"getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"accuracy","type":"uint256"}],"name":"isOverLiquified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAtTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeReceiver","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"amm","type":"address"}],"name":"removeAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"rescueStuckNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_tok","type":"address"},{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueStuckTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setAutoBuybackSettings","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"amm","type":"address"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"setBuybackMultiplierSettings","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistribution","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setDistributorSettings","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_autoLiquidityReceiver","type":"address"},{"internalType":"address payable","name":"_marketingFeeReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"},{"internalType":"uint256","name":"_reflectionFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_feeDenominator","type":"uint256"}],"name":"setFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"setTargetLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"takeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"triggerBuybackMultiplier","type":"bool"}],"name":"triggerZeusBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"notbot","type":"address"}],"name":"unblockBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"bots_","type":"address[]"}],"name":"unblockBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600580546001600160a01b031990811673c2132d05d31c914a87c6611c10748aeb04b58e8f1790915560068054821661dead9081179091556007805483169055600880549092161790556200005c6009600a62000886565b6200006b906298968062000971565b6009556200008c6101906009546200068360201b6200260d1790919060201c565b600a5560646011819055601281905561032060135560c860148190556104b060155561271060165560198055601a829055601f556020556107086022556023805461ffff191690556207a120602c55602d805460ff19166001179055600954620000fa906107d09062000818565b602e553480156200010a57600080fd5b5060018054336001600160a01b031991821681178355600080549092168117825580825260026020526040909120805460ff19169092179091556200014f8162000698565b50601b80546001600160a01b03191673a5e0829caced8ffdd4de3c43696c57f7d7a678ff908117909155604080516315ab88c960e31b81529051829163ad5c4648916004808301926020929190829003018186803b158015620001b157600080fd5b505afa158015620001c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ec9190620007ef565b600380546001600160a01b0319166001600160a01b03928316179055601b546040805163c45a015560e01b81529051919092169163c45a0155916004808301926020929190829003018186803b1580156200024657600080fd5b505afa1580156200025b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002819190620007ef565b6001600160a01b031663c9c6539630601b60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620002df57600080fd5b505afa158015620002f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200031a9190620007ef565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200036357600080fd5b505af115801562000378573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039e9190620007ef565b601c80546001600160a01b0319166001600160a01b03928316178155600954306000908152600c60209081526040808320601b548716845290915280822083905592549093168352918190209190915551620003fa90620007e1565b604051809103906000f08015801562000417573d6000803e3d6000fd5b50602a80546001600160a01b039283166001600160a01b03199182168117909255602b8054821690921782556017805482167370032efedf038906bb09bf17cb01e77db5b01ffa1781556018805490921673933951d597660754e7c14ec2f689738ba11c0f92178255602d805461ff001916610100179055336000818152600d60209081526040808320805460ff199081166001908117909255308086528386208054831684179055601c80548c1687528487208054841685179055601b80548d16885285882080548516861790558b548d168852858820805485168617905589548d16885285882080548516861790558a548d1688528588208054851686179055888852600e87528588208054851686179055828852858820805485168617905581548d168852858820805485168617905580548d16885285882080548516861790558b548d168852858820805485168617905589548d16885285882080548516861790558a548d1688528588208054851686179055978752600f90955283862080548316841790558552828520805482168317905583548a16855282852080548216831790559454891684528184208054861682179055965488168352808320805485168817905593548716825283822080548416871790559354861681528281208054831686179055600654861681529190912080549091169092179091555462000626911662000702565b620006313362000698565b600954336000818152600b6020908152604080832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350620009a9565b600062000691828462000818565b9392505050565b620006a3336200079e565b620006de5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b60448201526064015b60405180910390fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b6200070d336200079e565b620007445760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401620006d5565b6001600160a01b038116600081815260106020908152604091829020805460ff1916600117905590519182527f358f3cb203433a03de149efbff60641f40bcd6fe750981527942877c50b838da910160405180910390a150565b600080546001600160a01b0383811691161480620007c957506001546001600160a01b038381169116145b15620007d857506001620007dc565b5060005b919050565b612075806200646883390190565b60006020828403121562000801578081fd5b81516001600160a01b038116811462000691578182fd5b6000826200083457634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116200084d57506200087d565b81870482111562000862576200086262000993565b808616156200087057918102915b9490941c9380026200083c565b94509492505050565b60006200069160001960ff851684600082620008a55750600162000691565b81620008b45750600062000691565b8160018114620008cd5760028114620008d8576200090c565b600191505062000691565b60ff841115620008ec57620008ec62000993565b6001841b91508482111562000905576200090562000993565b5062000691565b5060208310610133831016604e8410600b841016171562000944575081810a838111156200093e576200093e62000993565b62000691565b62000953848484600162000839565b80860482111562000968576200096862000993565b02949350505050565b60008160001904831182151516156200098e576200098e62000993565b500290565b634e487b7160e01b600052601160045260246000fd5b615aaf80620009b96000396000f3fe6080604052600436106200043e5760003560e01c8063821a675e116200022f578063d51ed1c81162000133578063e96fada211620000bb578063f5cfec0a1162000085578063f5cfec0a1462000c71578063f708a64f1462000c96578063f84ba65d1462000cbb578063f887ea401462000ce0578063fe9fbb801462000d025762000446565b8063e96fada21462000be0578063f0b37c041462000c02578063f1f3bca31462000c27578063f2fde38b1462000c4c5762000446565b8063dd62ed3e11620000fd578063dd62ed3e1462000b34578063df20fd491462000b7e578063df92fd3e1462000ba3578063e70ef8a41462000bbb5762000446565b8063d51ed1c81462000abe578063d806d12f1462000ae3578063d8c6404b1462000afb578063dbae24541462000b1c5762000446565b8063a9059cbb11620001b7578063b6a5d7de1162000181578063b6a5d7de1462000a47578063bf56b3711462000a6c578063c6d2577d1462000a84578063ca33e64c1462000a9c5762000446565b8063a9059cbb14620009b4578063b210b06d14620009d9578063b2bdfa7b14620009f1578063b62496f51462000a135762000446565b80639d1944f511620001f95780639d1944f51462000926578063a4b45c00146200094b578063a51af4c51462000970578063a8aa1b3114620009925762000446565b8063821a675e14620008b9578063893d20e814620008d05780638da5cb5b146200090457806395d89b4114620005105762000446565b80632e31876b11620003435780635c85974f11620002cb5780636ddd171311620002955780636ddd1713146200080e57806370a08231146200082a578063715018a614620008645780637d1db4a5146200087c5780637e11c05914620008945762000446565b80635c85974f14620007875780636053617214620007ac578063658d4b7f14620007c45780636b99905314620007e95762000446565b8063349c1f09116200030d578063349c1f0914620006fc5780633bb8a8d4146200072157806346c8df23146200073d578063571ac8b014620007625762000446565b80632e31876b146200067d5780632f54bf6e1462000694578063313ce56714620006b9578063340ac20f14620006d75762000446565b806318160ddd11620003c757806323b872dd116200039157806323b872dd1462000603578063287e31d714620006285780632b112e4914620006405780632d48e89614620006585762000446565b806318160ddd14620005815780631f4b20b21462000598578063201e799114620005b95780632375ce4014620005de5762000446565b806304a66b48116200040957806304a66b4814620004eb57806306fdde031462000510578063095ea7b314620005375780631161ae39146200055c5762000446565b8062b8cf2a146200044b57806301339c2114620004725780630445b667146200048a578063048c7baf14620004b55762000446565b366200044657005b600080fd5b3480156200045857600080fd5b50620004706200046a36600462003545565b62000d27565b005b3480156200047f57600080fd5b506200047062000dd9565b3480156200049757600080fd5b50620004a2602e5481565b6040519081526020015b60405180910390f35b348015620004c257600080fd5b50620004da620004d436600462003678565b62000e52565b6040519015158152602001620004ac565b348015620004f857600080fd5b50620004da6200050a3660046200378a565b62000ed3565b3480156200051d57600080fd5b506200052862000f50565b604051620004ac919062003841565b3480156200054457600080fd5b50620004da6200055636600462003517565b62000f70565b3480156200056957600080fd5b50620004da6200057b3660046200370e565b62000fdd565b3480156200058e57600080fd5b50600954620004a2565b348015620005a557600080fd5b50602354620004da90610100900460ff1681565b348015620005c657600080fd5b5062000470620005d83660046200370e565b62000ff3565b348015620005eb57600080fd5b50620004da620005fd36600462003730565b62001028565b3480156200061057600080fd5b50620004da6200062236600462003502565b62001094565b3480156200063557600080fd5b5062000470620011e0565b3480156200064d57600080fd5b50620004a262001263565b3480156200066557600080fd5b5062000470620006773660046200370e565b62001398565b620004706200068e366004620034bd565b6200142e565b348015620006a157600080fd5b50620004da620006b3366004620033fd565b620015c7565b348015620006c657600080fd5b5060405160098152602001620004ac565b348015620006e457600080fd5b5062000470620006f6366004620033fd565b6200160a565b3480156200070957600080fd5b50620004706200071b366004620033fd565b620017e8565b3480156200072e57600080fd5b50602354620004da9060ff1681565b3480156200074a57600080fd5b50620004706200075c366004620033fd565b6200186d565b3480156200076f57600080fd5b50620004da62000781366004620033fd565b620018e9565b3480156200079457600080fd5b5062000470620007a6366004620036b5565b620018ff565b348015620007b957600080fd5b50620004706200194d565b348015620007d157600080fd5b5062000470620007e336600462003478565b62001aba565b348015620007f657600080fd5b506200047062000808366004620033fd565b62001b0f565b3480156200081b57600080fd5b50602d54620004da9060ff1681565b3480156200083757600080fd5b50620004a262000849366004620033fd565b6001600160a01b03166000908152600b602052604090205490565b3480156200087157600080fd5b506200047062001b5a565b3480156200088957600080fd5b50620004a2600a5481565b348015620008a157600080fd5b5062000470620008b336600462003545565b62001c4d565b62000470620008ca366004620033fd565b62001cf2565b348015620008dd57600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001620004ac565b3480156200091157600080fd5b50600054620008eb906001600160a01b031681565b3480156200093357600080fd5b50620004da62000945366004620036b5565b62001dc1565b3480156200095857600080fd5b50620004706200096a3660046200343b565b62001ed4565b3480156200097d57600080fd5b50602b54620008eb906001600160a01b031681565b3480156200099f57600080fd5b50601c54620008eb906001600160a01b031681565b348015620009c157600080fd5b50620004da620009d336600462003517565b62001f2c565b348015620009e657600080fd5b506200047062001f3b565b348015620009fe57600080fd5b50600154620008eb906001600160a01b031681565b34801562000a2057600080fd5b50620004da62000a32366004620033fd565b60106020526000908152604090205460ff1681565b34801562000a5457600080fd5b506200047062000a66366004620033fd565b62001f6c565b34801562000a7957600080fd5b50620004a2601d5481565b34801562000a9157600080fd5b50620004a2601e5481565b34801562000aa957600080fd5b50601754620008eb906001600160a01b031681565b34801562000acb57600080fd5b50620004a262000add366004620036b5565b62001fba565b34801562000af057600080fd5b50620004a26200206e565b34801562000b0857600080fd5b50602d54620004da90610100900460ff1681565b34801562000b2957600080fd5b50620004706200215c565b34801562000b4157600080fd5b50620004a262000b53366004620034aa565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b34801562000b8b57600080fd5b506200047062000b9d36600462003658565b62002197565b34801562000bb057600080fd5b5062000470620021d8565b34801562000bc857600080fd5b506200047062000bda366004620033fd565b6200220f565b34801562000bed57600080fd5b50601854620008eb906001600160a01b031681565b34801562000c0f57600080fd5b506200047062000c21366004620033fd565b6200225d565b34801562000c3457600080fd5b50620004a262000c463660046200361a565b620022a8565b34801562000c5957600080fd5b50620004da62000c6b366004620033fd565b620022f3565b34801562000c7e57600080fd5b506200047062000c90366004620036e7565b620023d0565b34801562000ca357600080fd5b506200047062000cb536600462003478565b62002458565b34801562000cc857600080fd5b506200047062000cda36600462003478565b6200259a565b34801562000ced57600080fd5b50601b54620008eb906001600160a01b031681565b34801562000d0f57600080fd5b50620004da62000d21366004620033fd565b620025ef565b62000d3233620025ef565b62000d5a5760405162461bcd60e51b815260040162000d5190620038b7565b60405180910390fd5b60005b815181101562000dd55760016024600084848151811062000d8e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062000dcc8162003992565b91505062000d5d565b5050565b62000de433620025ef565b62000e035760405162461bcd60e51b815260040162000d5190620038b7565b601d541562000e485760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481b185d5b98da195960821b604482015260640162000d51565b43601d5542601e55565b600062000e5f33620025ef565b62000e7e5760405162461bcd60e51b815260040162000d5190620038b7565b6023805460ff191686151590811790915560258590556000602655602784905560288390554360295560ff1615156001148062000ebe575060235460ff16155b62000ec857600080fd5b506001949350505050565b600062000ee033620025ef565b62000eff5760405162461bcd60e51b815260040162000d5190620038b7565b6011869055601285905560138490556014839055600062000f23878787876200261b565b6016849055905062000f3760048462003935565b811062000f4357600080fd5b5060019695505050505050565b6040805180820190915260058152640d286c2e6d60db1b60208201525b90565b336000818152600c602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259062000fcc9086815260200190565b60405180910390a350600192915050565b60008262000feb8362001fba565b119392505050565b62000ffe33620025ef565b6200101d5760405162461bcd60e51b815260040162000d5190620038b7565b601991909155601a55565b60006200103533620025ef565b620010545760405162461bcd60e51b815260040162000d5190620038b7565b600262001062848662003935565b111580156200107057508284115b6200107a57600080fd5b50601f8390556020829055602281905560015b9392505050565b6009546001600160a01b0384166000908152600c60209081526040808320338452909152812054909114620011cb576001600160a01b0384166000908152600c60209081526040808320338452909152902054821115620011485760405162461bcd60e51b815260206004820152602760248201527f5265717565737420657863656564732073656e64657220746f6b656e20616c6c60448201526637bbb0b731b29760c91b606482015260840162000d51565b6040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600c82528381203382529091529190912054620011a69184906200267b565b6001600160a01b0385166000908152600c602090815260408083203384529091529020555b620011d8848484620026aa565b949350505050565b620011eb33620015c7565b6200120a5760405162461bcd60e51b815260040162000d519062003897565b6040516200121890620033e2565b604051809103906000f08015801562001235573d6000803e3d6000fd5b50602a80546001600160a01b03929092166001600160a01b03199283168117909155602b8054909216179055565b6006546040516370a0823160e01b81526001600160a01b039091166004820152600090819030906370a082319060240160206040518083038186803b158015620012ac57600080fd5b505afa158015620012c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012e79190620036ce565b6007546040516370a0823160e01b81526001600160a01b03909116600482015290915060009030906370a082319060240160206040518083038186803b1580156200133157600080fd5b505afa15801562001346573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200136c9190620036ce565b905062001391816200138a8460095462002b2d90919063ffffffff16565b9062002b2d565b9250505090565b620013a333620025ef565b620013c25760405162461bcd60e51b815260040162000d5190620038b7565b602a546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b600060405180830381600087803b1580156200141157600080fd5b505af115801562001426573d6000803e3d6000fd5b505050505050565b6200143933620015c7565b620014585760405162461bcd60e51b815260040162000d519062003897565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b1580156200149b57600080fd5b505afa158015620014b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620014d69190620036ce565b9050808211156200153a5760405162461bcd60e51b815260206004820152602760248201527f52657175657374206578636565647320636f6e747261637420746f6b656e206260448201526630b630b731b29760c91b606482015260840162000d51565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285169063a9059cbb90604401602060405180830381600087803b1580156200158557600080fd5b505af11580156200159a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015c0919062003639565b5050505050565b600080546001600160a01b0383811691161480620015f257506001546001600160a01b038381169116145b15620016015750600162001605565b5060005b919050565b6200161533620015c7565b620016345760405162461bcd60e51b815260040162000d519062003897565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200167357600080fd5b505afa15801562001688573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620016ae91906200341c565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620016f757600080fd5b505afa1580156200170c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200173291906200341c565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200177b57600080fd5b505af115801562001790573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620017b691906200341c565b601c80546001600160a01b039283166001600160a01b031991821617909155601b805493909216921691909117905550565b620017f333620015c7565b620018125760405162461bcd60e51b815260040162000d519062003897565b6001600160a01b038116600081815260106020908152604091829020805460ff1916600117905590519182527f358f3cb203433a03de149efbff60641f40bcd6fe750981527942877c50b838da91015b60405180910390a150565b6200187833620015c7565b620018975760405162461bcd60e51b815260040162000d519062003897565b6001600160a01b038116600081815260106020908152604091829020805460ff1916905590519182527f18a128e0aa208c3d6c38f08feaf99daf3062ff2f2005836354191a0ac83e9964910162001862565b6000620018f98260095462000f70565b92915050565b6200190a33620025ef565b620019295760405162461bcd60e51b815260040162000d5190620038b7565b6103e86009546200193b919062003935565b8110156200194857600080fd5b600a55565b620019596000620015c7565b806200196b57506200196b33620025ef565b62001a2b5760405162461bcd60e51b815260206004820152608060248201527f556e617574686f72697a656421204e6f6e2d5a65726f2061646472657373206460448201527f65746563746564206173207468697320636f6e74726163742063757272656e7460648201527f206f776e65722e20436f6e74616374207468697320636f6e747261637420637560848201527f7272656e74206f776e657220746f2074616b654f776e65727368697028292e2060a482015260c40162000d51565b60005462001a42906001600160a01b03166200225d565b60015462001a59906001600160a01b03166200225d565b60018054336001600160a01b03199182168117909255600080549091168217905562001a859062001f6c565b6040513381527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1565b62001ac533620025ef565b62001ae45760405162461bcd60e51b815260040162000d5190620038b7565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b62001b1a33620025ef565b62001b395760405162461bcd60e51b815260040162000d5190620038b7565b6001600160a01b03166000908152602460205260409020805460ff19169055565b62001b6533620015c7565b62001b845760405162461bcd60e51b815260040162000d519062003897565b62001b8f33620015c7565b62001bcd5760405162461bcd60e51b815260206004820152600d60248201526c556e617574686f72697a65642160981b604482015260640162000d51565b604051600081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a160005462001c18906001600160a01b03166200225d565b60015462001c2f906001600160a01b03166200225d565b600180546001600160a01b0319908116909155600080549091169055565b62001c5833620025ef565b62001c775760405162461bcd60e51b815260040162000d5190620038b7565b60005b815181101562000dd55760006024600084848151811062001cab57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062001ce98162003992565b91505062001c7a565b62001cfd33620015c7565b62001d1c5760405162461bcd60e51b815260040162000d519062003897565b60405147906000906001600160a01b0384169083908381818185875af1925050503d806000811462001d6b576040519150601f19603f3d011682016040523d82523d6000602084013e62001d70565b606091505b505090508062001dbc5760405162461bcd60e51b81526020600482015260166024820152752330b4b632b2103a37903932b9b1bab29022ba3432b960511b604482015260640162000d51565b505050565b600062001dce33620025ef565b62001ded5760405162461bcd60e51b815260040162000d5190620038b7565b62030d40821015801562001e0457506207a1208211155b62001e625760405162461bcd60e51b815260206004820152602760248201527f676173206d757374206265206265747765656e203230302c30303020616e642060448201526603530302c3030360cc1b606482015260840162000d51565b602c5482141562001ecb5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b606482015260840162000d51565b50602c55600190565b62001edf33620025ef565b62001efe5760405162461bcd60e51b815260040162000d5190620038b7565b601780546001600160a01b039384166001600160a01b03199182161790915560188054929093169116179055565b60006200108d338484620026aa565b62001f4633620025ef565b62001f655760405162461bcd60e51b815260040162000d5190620038b7565b6000602155565b62001f7733620015c7565b62001f965760405162461bcd60e51b815260040162000d519062003897565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b601c546040516370a0823160e01b81526001600160a01b039091166004820152600090819030906370a082319060240160206040518083038186803b1580156200200357600080fd5b505afa15801562002018573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200203e9190620036ce565b90506200108d6200204e62001263565b620020676200205f84600262002b3b565b869062002b3b565b906200260d565b600042601e54620151806200208491906200391a565b1115620020b357620020ab6016546200206761465060155462002b3b90919063ffffffff16565b905062000f6d565b42620020cd60225460215462002b4990919063ffffffff16565b111562002155576000620020f4426200138a60225460215462002b4990919063ffffffff16565b905060006200211f6015546200138a60205462002067601f5460155462002b3b90919063ffffffff16565b90506200214b6200214160225462002067858562002b3b90919063ffffffff16565b6015549062002b49565b9250505062000f6d565b5060155490565b6200216733620025ef565b620021865760405162461bcd60e51b815260040162000d5190620038b7565b6023805461ff001916610100179055565b620021a233620025ef565b620021c15760405162461bcd60e51b815260040162000d5190620038b7565b602d805460ff191692151592909217909155602e55565b620021e333620025ef565b620022025760405162461bcd60e51b815260040162000d5190620038b7565b6023805461ff0019169055565b6200221a33620025ef565b620022395760405162461bcd60e51b815260040162000d5190620038b7565b6001600160a01b03166000908152602460205260409020805460ff19166001179055565b6200226833620015c7565b620022875760405162461bcd60e51b815260040162000d519062003897565b6001600160a01b03166000908152600260205260409020805460ff19169055565b600043601d546001620022bc91906200391a565b10620022da57601654620022d290600162002b2d565b905062001605565b8115620022eb57620022d26200206e565b505060155490565b60006200230033620015c7565b6200231f5760405162461bcd60e51b815260040162000d519062003897565b60005462002336906001600160a01b03166200225d565b600080546001600160a01b0319166001600160a01b03841690811782558152600260205260409020805460ff1916600117905562002375828062001ed4565b6023805460ff191690556200238c60008062002197565b6040516001600160a01b03831681527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1506001919050565b620023db33620025ef565b620023fa5760405162461bcd60e51b815260040162000d5190620038b7565b600654620024139083906001600160a01b031662002b57565b801562000dd557426021556022546040519081527f39d2389ec5c1fa77b2c0d374bc61b6d7bd97ccba280fcdeb4e9c7644898d7c3a9060200160405180910390a15050565b6200246333620025ef565b620024825760405162461bcd60e51b815260040162000d5190620038b7565b6001600160a01b0382163014801590620024aa5750601c546001600160a01b03838116911614155b620024b457600080fd5b6001600160a01b0382166000908152600f60205260409020805460ff191682158015919091179091556200255057602a54604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca9690604401600060405180830381600087803b1580156200253157600080fd5b505af115801562002546573d6000803e3d6000fd5b5050505062000dd5565b602a546001600160a01b038381166000818152600b602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401620013f6565b620025a533620025ef565b620025c45760405162461bcd60e51b815260040162000d5190620038b7565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6001600160a01b031660009081526002602052604090205460ff1690565b60006200108d828462003935565b60006200262833620025ef565b620026475760405162461bcd60e51b815260040162000d5190620038b7565b81836200265586886200391a565b6200266191906200391a565b6200266d91906200391a565b601581905595945050505050565b60008184841115620026a25760405162461bcd60e51b815260040162000d51919062003841565b505050900390565b6040516370a0823160e01b81526001600160a01b0384166004820152600090819030906370a082319060240160206040518083038186803b158015620026ef57600080fd5b505afa15801562002704573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200272a9190620036ce565b9050808311156200278c5760405162461bcd60e51b815260206004820152602560248201527f5265717565737420657863656564732073656e64657220746f6b656e2062616c60448201526430b731b29760d91b606482015260840162000d51565b60008311620027f05760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840162000d51565b602d54610100900460ff16156200280d576200280d858562002c82565b602f5460ff16156200282f576200282685858562002d1f565b9150506200108d565b6200283b858462002dc6565b620028468562002e32565b1562002856576200285662002e9b565b62002861856200324c565b15620028715762002871620032d9565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0388166000908152600b9091529190912054620028c59185906200267b565b6001600160a01b0386166000908152600b6020908152604080832093909355600d90529081205460ff1615620028fc578362002909565b6200290986868662003325565b6001600160a01b0386166000908152600b602052604090205490915062002931908262002b49565b6001600160a01b038087166000908152600b60209081526040808320949094559189168152600f909152205460ff16620029d857602a546001600160a01b038781166000818152600b602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015620029c457600080fd5b505af1925050508015620029d6575060015b505b6001600160a01b0385166000908152600f602052604090205460ff1662002a6c57602a546001600160a01b038681166000818152600b602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801562002a5857600080fd5b505af192505050801562002a6a575060015b505b602a54602c546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c4799162002aa59160040190815260200190565b600060405180830381600087803b15801562002ac057600080fd5b505af192505050801562002ad2575060015b50846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162002b1991815260200190565b60405180910390a350600195945050505050565b60006200108d828462003978565b60006200108d828462003956565b60006200108d82846200391a565b602f805460ff19166001179055604080516002808252606082018352600092602083019080368337505060035482519293506001600160a01b03169183915060009062002bb457634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811062002bf757634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601b5460405163b6f9de9560e01b815291169063b6f9de9590859062002c3f906000908690889042906004016200380a565b6000604051808303818588803b15801562002c5957600080fd5b505af115801562002c6e573d6000803e3d6000fd5b5050602f805460ff19169055505050505050565b6001600160a01b03821660009081526024602052604090205460ff1615801562002cc557506001600160a01b03811660009081526024602052604090205460ff16155b62000dd55760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a20596f7572206163636f756e7420697320626c61636b6c69737460448201526265642160e81b606482015260840162000d51565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600b9091529182205462002d729184906200267b565b6001600160a01b038086166000908152600b6020526040808220939093559085168152205462002da3908362002b49565b6001600160a01b0384166000908152600b60205260409020555060019392505050565b600a548111158062002df057506001600160a01b0382166000908152600e602052604090205460ff165b62000dd55760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b604482015260640162000d51565b602f5460009060ff1615801562002e4b5750602d5460ff165b801562002e7157506001600160a01b03821660009081526010602052604090205460ff16155b8015620015f25750602e54306000908152600b602052604090205410620016015750600162001605565b602f805460ff19166001179055601954601a5460009162002ebc9162000fdd565b62002eca5760115462002ecd565b60005b9050600062002ef56002620020676015546200206786602e5462002b3b90919063ffffffff16565b9050600062002f1082602e5462002b2d90919063ffffffff16565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811062002f5957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260035482519116908290600190811062002f9957634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601b5460405163791ac94760e01b81524792919091169063791ac9479062002fe5908690600090879030904290600401620038dc565b600060405180830381600087803b1580156200300057600080fd5b505af115801562003015573d6000803e3d6000fd5b50505050600062003030824762002b2d90919063ffffffff16565b905060006200304f620030458860026200260d565b6015549062002b2d565b90506000620030676002620020678481878d62002b3b565b905060006200308783620020676013548762002b3b90919063ffffffff16565b90506000620030a784620020676014548862002b3b90919063ffffffff16565b9050602a60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015620030fa57600080fd5b505af1935050505080156200310d575060015b506018546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801562003149573d6000803e3d6000fd5b5088156200323657601b5460175460405163f305d71960e01b8152306004820152602481018c905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990859060c4016060604051808303818588803b158015620031bd57600080fd5b505af1158015620031d2573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620031f991906200375c565b505060408051858152602081018c90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050602f805460ff191690555050505050505050565b6000436028546029546200326191906200391a565b1115806200327c575060235460ff6101009091041615156001145b156200160157602f5460ff1615801562003298575060235460ff165b8015620032be57506001600160a01b03821660009081526010602052604090205460ff16155b8015620015f257506027544710620016015750600162001605565b602754600654620032f491906001600160a01b031662002b57565b43602955602754602654620033099162002b49565b6026819055602554101562003323576023805460ff191690555b565b601654601c54600091829162003354919062002067906200205f906001600160a01b03898116911614620022a8565b306000908152600b602052604090205490915062003373908262002b49565b306000818152600b6020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620033c59085815260200190565b60405180910390a3620033d9838262002b2d565b95945050505050565b6120758062003a0583390190565b80356200160581620039dc565b6000602082840312156200340f578081fd5b81356200108d81620039dc565b6000602082840312156200342e578081fd5b81516200108d81620039dc565b600080604083850312156200344e578081fd5b82356200345b81620039dc565b915060208301356200346d81620039dc565b809150509250929050565b600080604083850312156200348b578182fd5b82356200349881620039dc565b915060208301356200346d81620039f5565b600080604083850312156200344e578182fd5b600080600060608486031215620034d2578081fd5b8335620034df81620039dc565b92506020840135620034f181620039dc565b929592945050506040919091013590565b600080600060608486031215620034d2578283fd5b600080604083850312156200352a578182fd5b82356200353781620039dc565b946020939093013593505050565b6000602080838503121562003558578182fd5b823567ffffffffffffffff8082111562003570578384fd5b818501915085601f83011262003584578384fd5b813581811115620035995762003599620039c6565b8060051b604051601f19603f83011681018181108582111715620035c157620035c1620039c6565b604052828152858101935084860182860187018a1015620035e0578788fd5b8795505b838610156200360d57620035f881620033f0565b855260019590950194938601938601620035e4565b5098975050505050505050565b6000602082840312156200362c578081fd5b81356200108d81620039f5565b6000602082840312156200364b578081fd5b81516200108d81620039f5565b600080604083850312156200366b578182fd5b82356200353781620039f5565b600080600080608085870312156200368e578182fd5b84356200369b81620039f5565b966020860135965060408601359560600135945092505050565b600060208284031215620036c7578081fd5b5035919050565b600060208284031215620036e0578081fd5b5051919050565b60008060408385031215620036fa578182fd5b8235915060208301356200346d81620039f5565b6000806040838503121562003721578182fd5b50508035926020909101359150565b60008060006060848603121562003745578081fd5b505081359360208301359350604090920135919050565b60008060006060848603121562003771578081fd5b8351925060208401519150604084015190509250925092565b600080600080600060a08688031215620037a2578283fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000815180845260208085019450808401835b83811015620037ff5781516001600160a01b031687529582019590820190600101620037d8565b509495945050505050565b600085825260806020830152620038256080830186620037c5565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b818110156200386f5785810183015185820160400152820162003851565b81811115620038815783604083870101525b50601f01601f1916929092016040019392505050565b60208082526006908201526510a7aba722a960d11b604082015260600190565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b600086825285602083015260a06040830152620038fd60a0830186620037c5565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115620039305762003930620039b0565b500190565b6000826200395157634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615620039735762003973620039b0565b500290565b6000828210156200398d576200398d620039b0565b500390565b6000600019821415620039a957620039a9620039b0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114620039f257600080fd5b50565b8015158114620039f257600080fdfe6080604052600680546001600160a01b031990811673c2132d05d31c914a87c6611c10748aeb04b58e8f179091556007805490911673a5e0829caced8ffdd4de3c43696c57f7d7a678ff1790556ec097ce7bc90715b34b9f1000000000601055610e10601155670de0b6b3a76400006012553480156200007e57600080fd5b5060018054336001600160a01b031991821681178355600080549092168117825580825260026020526040909120805460ff1916909217909155620000c381620001c7565b506014805460ff19166001179055600380546001600160a01b03191633179055600754604080516315ab88c960e31b8152905173972c56de17466958891bede00fe68d24eab8c2c4926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b1580156200013c57600080fd5b505afa15801562000151573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200017791906200023a565b600480546001600160a01b03929092166001600160a01b03199283161790556005805490911673c2132d05d31c914a87c6611c10748aeb04b58e8f179055620001c081620001c7565b506200026a565b6000546001600160a01b03163314620002165760405162461bcd60e51b815260206004820152600d60248201526c554e415554484f52495a45442160981b604482015260640160405180910390fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b6000602082840312156200024c578081fd5b81516001600160a01b038116811462000263578182fd5b9392505050565b611dfb806200027a6000396000f3fe6080604052600436106101fd5760003560e01c80638da5cb5b1161010d578063ecd0c0c3116100a0578063f2fde38b1161006f578063f2fde38b14610600578063f887ea4014610620578063fe9fbb8014610640578063ffb2c47914610679578063ffd49c841461069957610265565b8063ecd0c0c314610595578063efca2eed146105b5578063f0b37c04146105cb578063f0fc6bca146105eb57610265565b8063c6e9c2c6116100dc578063c6e9c2c614610500578063ce7c2ac214610520578063d0e30db014610577578063e2d2e2191461057f57610265565b80638da5cb5b1461048a578063997664d7146104aa578063b2bdfa7b146104c0578063b6a5d7de146104e057610265565b80632f54bf6e116101905780634fab0ae81161015f5780634fab0ae81461040a578063523aee69146104205780636053617214610440578063715018a614610455578063821a675e1461046a57610265565b80632f54bf6e1461039a57806330e76dae146103ba57806332a2c5d0146103cd5780633a98ef39146103f457610265565b80631b54da29116101cc5780631b54da291461030a57806328fd31981461033a5780632d48e8961461035a5780632e31876b1461037a57610265565b80630c657eb0146102a2578063106f5dbe146102ac57806311ce023d146102d457806314b6ca96146102ea57610265565b36610265576003546001600160a01b03163314156102225761021d6106af565b61022a565b61022a610b46565b604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587491015b60405180910390a1005b61026d610b46565b604080513381523460208201527f78c972371203d575d4b76368a154d92bfb45d32a57696487f3334fbbe5042c14910161025b565b6102aa610b46565b005b3480156102b857600080fd5b506102c1610b70565b6040519081526020015b60405180910390f35b3480156102e057600080fd5b506102c160105481565b3480156102f657600080fd5b506102aa610305366004611b47565b610be6565b34801561031657600080fd5b5061032a610325366004611b2b565b610d71565b60405190151581526020016102cb565b34801561034657600080fd5b506102c1610355366004611b2b565b610dea565b34801561036657600080fd5b506102aa610375366004611c3a565b610e74565b34801561038657600080fd5b5061032a610395366004611baa565b610ea9565b3480156103a657600080fd5b5061032a6103b5366004611b2b565b611068565b3480156103c657600080fd5b50476102c1565b3480156103d957600080fd5b50305b6040516001600160a01b0390911681526020016102cb565b34801561040057600080fd5b506102c1600c5481565b34801561041657600080fd5b506102c160125481565b34801561042c57600080fd5b5061032a61043b366004611b2b565b6110a7565b34801561044c57600080fd5b506102aa611121565b34801561046157600080fd5b506102aa61128c565b34801561047657600080fd5b5061032a610485366004611b2b565b611377565b34801561049657600080fd5b506000546103dc906001600160a01b031681565b3480156104b657600080fd5b506102c1600d5481565b3480156104cc57600080fd5b506001546103dc906001600160a01b031681565b3480156104ec57600080fd5b506102aa6104fb366004611b2b565b611472565b34801561050c57600080fd5b5061032a61051b366004611b72565b6114c0565b34801561052c57600080fd5b5061055c61053b366004611b2b565b600b6020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102cb565b6102aa6106af565b34801561058b57600080fd5b506102c1600f5481565b3480156105a157600080fd5b506003546103dc906001600160a01b031681565b3480156105c157600080fd5b506102c1600e5481565b3480156105d757600080fd5b506102aa6105e6366004611b2b565b611540565b3480156105f757600080fd5b506102aa61158b565b34801561060c57600080fd5b5061032a61061b366004611b2b565b611594565b34801561062c57600080fd5b506007546103dc906001600160a01b031681565b34801561064c57600080fd5b5061032a61065b366004611b2b565b6001600160a01b031660009081526002602052604090205460ff1690565b34801561068557600080fd5b506102aa610694366004611c0a565b611642565b3480156106a557600080fd5b506102c160115481565b6003546001600160a01b031633146106e25760405162461bcd60e51b81526004016106d990611cea565b60405180910390fd5b6006546005546001600160a01b03908116911614610952576005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561073e57600080fd5b505afa158015610752573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107769190611c22565b6040805160028082526060820183529293506000929091602083019080368337505060045482519293506001600160a01b0316918391506000906107ca57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260055482519116908290600190811061080957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de9590349061084f90600090869030904290600401611c5b565b6000604051808303818588803b15801561086857600080fd5b505af115801561087c573d6000803e3d6000fd5b50506005546040516370a0823160e01b81523060048201526000945061090c93508692506001600160a01b03909116906370a08231906024015b60206040518083038186803b1580156108ce57600080fd5b505afa1580156108e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109069190611c22565b90611774565b600d5490915061091c9082611780565b600d55600c546010546109469161093d91610937908561178c565b90611798565b600f5490611780565b600f5550610b44915050565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561099657600080fd5b505afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce9190611c22565b6040805160028082526060820183529293506000929091602083019080368337505060045482519293506001600160a01b031691839150600090610a2257634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654825191169082906001908110610a6157634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de95903490610aa790600090869030904290600401611c5b565b6000604051808303818588803b158015610ac057600080fd5b505af1158015610ad4573d6000803e3d6000fd5b50506006546040516370a0823160e01b815230600482015260009450610b1293508692506001600160a01b03909116906370a08231906024016108b6565b600d54909150610b229082611780565b600d55600c54601054610b3d9161093d91610937908561178c565b600f555050505b565b6000546001600160a01b031633146106e25760405162461bcd60e51b81526004016106d990611cea565b6040516370a0823160e01b815230600482018190526000916370a082319060240160206040518083038186803b158015610ba957600080fd5b505afa158015610bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be19190611c22565b905090565b6003546001600160a01b03163314610c105760405162461bcd60e51b81526004016106d990611cea565b6001600160a01b0382166000908152600b602052604090205415610c3757610c37826117a4565b600081118015610c5d57506001600160a01b0382166000908152600b6020526040902054155b15610cc357600880546001600160a01b0384166000818152600960205260408120839055600183018455929092527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055610cf6565b80158015610ce857506001600160a01b0382166000908152600b602052604090205415155b15610cf657610cf682611976565b6001600160a01b0382166000908152600b6020526040902054600c54610d27918391610d2191611774565b90611780565b600c556001600160a01b0382166000908152600b60205260409020819055610d4e81611ac3565b6001600160a01b039092166000908152600b602052604090206001019190915550565b600080546001600160a01b03163314610d9c5760405162461bcd60e51b81526004016106d990611cea565b6000546001600160a01b03163314610dc65760405162461bcd60e51b81526004016106d990611cc4565b50600580546001600160a01b0319166001600160a01b03831617905560015b919050565b6001600160a01b0381166000908152600b6020526040812054610e0f57506000610de5565b6001600160a01b0382166000908152600b6020526040812054610e3190611ac3565b6001600160a01b0384166000908152600b6020526040902060010154909150808211610e6257600092505050610de5565b610e6c8282611774565b949350505050565b6003546001600160a01b03163314610e9e5760405162461bcd60e51b81526004016106d990611cea565b601191909155601255565b600080546001600160a01b03163314610ed45760405162461bcd60e51b81526004016106d990611cea565b6000546001600160a01b03163314610efe5760405162461bcd60e51b81526004016106d990611cc4565b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b158015610f4057600080fd5b505afa158015610f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f789190611c22565b905080831115610fda5760405162461bcd60e51b815260206004820152602760248201527f52657175657374206578636565647320636f6e747261637420746f6b656e206260448201526630b630b731b29760c91b60648201526084016106d9565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820185905286169063a9059cbb90604401602060405180830381600087803b15801561102457600080fd5b505af1158015611038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105c9190611bea565b50600195945050505050565b600080546001600160a01b038381169116148061109257506001546001600160a01b038381169116145b1561109f57506001610de5565b506000610de5565b600080546001600160a01b031633146110d25760405162461bcd60e51b81526004016106d990611cea565b6000546001600160a01b031633146110fc5760405162461bcd60e51b81526004016106d990611cc4565b50600380546001600160a01b0383166001600160a01b03199091161790556001919050565b61112b6000611068565b8061114557503360009081526002602052604090205460ff165b6112035760405162461bcd60e51b815260206004820152608060248201527f556e617574686f72697a656421204e6f6e2d5a65726f2061646472657373206460448201527f65746563746564206173207468697320636f6e74726163742063757272656e7460648201527f206f776e65722e20436f6e74616374207468697320636f6e747261637420637560848201527f7272656e74206f776e657220746f2074616b654f776e65727368697028292e2060a482015260c4016106d9565b600054611218906001600160a01b0316611540565b60015461122d906001600160a01b0316611540565b60018054336001600160a01b03199182168117909255600080549091168217905561125790611472565b6040513381527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1565b6000546001600160a01b031633146112b65760405162461bcd60e51b81526004016106d990611cea565b6112bf33611068565b6112fb5760405162461bcd60e51b815260206004820152600d60248201526c556e617574686f72697a65642160981b60448201526064016106d9565b604051600081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1600054611344906001600160a01b0316611540565b600154611359906001600160a01b0316611540565b600180546001600160a01b0319908116909155600080549091169055565b600080546001600160a01b031633146113a25760405162461bcd60e51b81526004016106d990611cea565b6000546001600160a01b031633146113cc5760405162461bcd60e51b81526004016106d990611cc4565b60405147906000906001600160a01b0385169083908381818185875af1925050503d8060008114611419576040519150601f19603f3d011682016040523d82523d6000602084013e61141e565b606091505b50509050806114685760405162461bcd60e51b81526020600482015260166024820152752330b4b632b2103a37903932b9b1bab29022ba3432b960511b60448201526064016106d9565b5060019392505050565b6000546001600160a01b0316331461149c5760405162461bcd60e51b81526004016106d990611cea565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b600080546001600160a01b031633146114eb5760405162461bcd60e51b81526004016106d990611cea565b6000546001600160a01b031633146115155760405162461bcd60e51b81526004016106d990611cc4565b600780546001600160a01b0319166001600160a01b03851617905561153982610d71565b9392505050565b6000546001600160a01b0316331461156a5760405162461bcd60e51b81526004016106d990611cea565b6001600160a01b03166000908152600260205260409020805460ff19169055565b610b44336117a4565b600080546001600160a01b031633146115bf5760405162461bcd60e51b81526004016106d990611cea565b6000546001600160a01b031633146115e95760405162461bcd60e51b81526004016106d990611cc4565b600080546001600160a01b0319166001600160a01b0384169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1506001919050565b6003546001600160a01b0316331461166c5760405162461bcd60e51b81526004016106d990611cea565b6008548061167a5750611771565b6000805a905060005b848310801561169157508381105b1561176c5783601354106116a55760006013555b6116e56008601354815481106116cb57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316611ae6565b1561172a5761172a60086013548154811061171057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03166117a4565b61173f6117385a8490611774565b8490611780565b92505a60138054919350600061175483611d7f565b9190505550808061176490611d7f565b915050611683565b505050505b50565b60006115398284611d68565b60006115398284611d11565b60006115398284611d49565b60006115398284611d29565b6001600160a01b0381166000908152600b60205260409020546117c657611771565b60006117d182610dea565b9050801561197257600e546117e69082611780565b600e556006546005546001600160a01b0390811691161461188d5760055460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b15801561184f57600080fd5b505af1158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190611bea565b50611915565b60065460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156118db57600080fd5b505af11580156118ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119139190611bea565b505b6001600160a01b0382166000908152600a60209081526040808320429055600b9091529020600201546119489082611780565b6001600160a01b0383166000908152600b60205260409020600281019190915554610d4e90611ac3565b5050565b6008805461198690600190611d68565b815481106119a457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03848116845260099092526040909220546008805492909316929181106119f057634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260099182905260408120546008805491939291611a3c90600190611d68565b81548110611a5a57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020556008805480611a9e57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000611ae0601054610937600f548561178c90919063ffffffff16565b92915050565b6011546001600160a01b0382166000908152600a602052604081205490914291611b109190611d11565b108015611ae05750601254611b2483610dea565b1192915050565b600060208284031215611b3c578081fd5b813561153981611db0565b60008060408385031215611b59578081fd5b8235611b6481611db0565b946020939093013593505050565b60008060408385031215611b84578182fd5b8235611b8f81611db0565b91506020830135611b9f81611db0565b809150509250929050565b600080600060608486031215611bbe578081fd5b8335611bc981611db0565b92506020840135611bd981611db0565b929592945050506040919091013590565b600060208284031215611bfb578081fd5b81518015158114611539578182fd5b600060208284031215611c1b578081fd5b5035919050565b600060208284031215611c33578081fd5b5051919050565b60008060408385031215611c4c578182fd5b50508035926020909101359150565b600060808201868352602060808185015281875180845260a0860191508289019350845b81811015611ca45784516001600160a01b031683529383019391830191600101611c7f565b50506001600160a01b039690961660408501525050506060015292915050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b6020808252600d908201526c554e415554484f52495a45442160981b604082015260600190565b60008219821115611d2457611d24611d9a565b500190565b600082611d4457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611d6357611d63611d9a565b500290565b600082821015611d7a57611d7a611d9a565b500390565b6000600019821415611d9357611d93611d9a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461177157600080fdfea26469706673582212200253cf81be629b15af40d7e82981ddfb771fdb96a42bd3dfe91a331429696cb964736f6c63430008030033a264697066735822122029ea0dc060363143098fbc0c34b6a67cc3ae56d40340cf1787c1fb512d93781464736f6c634300080300336080604052600680546001600160a01b031990811673c2132d05d31c914a87c6611c10748aeb04b58e8f179091556007805490911673a5e0829caced8ffdd4de3c43696c57f7d7a678ff1790556ec097ce7bc90715b34b9f1000000000601055610e10601155670de0b6b3a76400006012553480156200007e57600080fd5b5060018054336001600160a01b031991821681178355600080549092168117825580825260026020526040909120805460ff1916909217909155620000c381620001c7565b506014805460ff19166001179055600380546001600160a01b03191633179055600754604080516315ab88c960e31b8152905173972c56de17466958891bede00fe68d24eab8c2c4926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b1580156200013c57600080fd5b505afa15801562000151573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200017791906200023a565b600480546001600160a01b03929092166001600160a01b03199283161790556005805490911673c2132d05d31c914a87c6611c10748aeb04b58e8f179055620001c081620001c7565b506200026a565b6000546001600160a01b03163314620002165760405162461bcd60e51b815260206004820152600d60248201526c554e415554484f52495a45442160981b604482015260640160405180910390fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b6000602082840312156200024c578081fd5b81516001600160a01b038116811462000263578182fd5b9392505050565b611dfb806200027a6000396000f3fe6080604052600436106101fd5760003560e01c80638da5cb5b1161010d578063ecd0c0c3116100a0578063f2fde38b1161006f578063f2fde38b14610600578063f887ea4014610620578063fe9fbb8014610640578063ffb2c47914610679578063ffd49c841461069957610265565b8063ecd0c0c314610595578063efca2eed146105b5578063f0b37c04146105cb578063f0fc6bca146105eb57610265565b8063c6e9c2c6116100dc578063c6e9c2c614610500578063ce7c2ac214610520578063d0e30db014610577578063e2d2e2191461057f57610265565b80638da5cb5b1461048a578063997664d7146104aa578063b2bdfa7b146104c0578063b6a5d7de146104e057610265565b80632f54bf6e116101905780634fab0ae81161015f5780634fab0ae81461040a578063523aee69146104205780636053617214610440578063715018a614610455578063821a675e1461046a57610265565b80632f54bf6e1461039a57806330e76dae146103ba57806332a2c5d0146103cd5780633a98ef39146103f457610265565b80631b54da29116101cc5780631b54da291461030a57806328fd31981461033a5780632d48e8961461035a5780632e31876b1461037a57610265565b80630c657eb0146102a2578063106f5dbe146102ac57806311ce023d146102d457806314b6ca96146102ea57610265565b36610265576003546001600160a01b03163314156102225761021d6106af565b61022a565b61022a610b46565b604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587491015b60405180910390a1005b61026d610b46565b604080513381523460208201527f78c972371203d575d4b76368a154d92bfb45d32a57696487f3334fbbe5042c14910161025b565b6102aa610b46565b005b3480156102b857600080fd5b506102c1610b70565b6040519081526020015b60405180910390f35b3480156102e057600080fd5b506102c160105481565b3480156102f657600080fd5b506102aa610305366004611b47565b610be6565b34801561031657600080fd5b5061032a610325366004611b2b565b610d71565b60405190151581526020016102cb565b34801561034657600080fd5b506102c1610355366004611b2b565b610dea565b34801561036657600080fd5b506102aa610375366004611c3a565b610e74565b34801561038657600080fd5b5061032a610395366004611baa565b610ea9565b3480156103a657600080fd5b5061032a6103b5366004611b2b565b611068565b3480156103c657600080fd5b50476102c1565b3480156103d957600080fd5b50305b6040516001600160a01b0390911681526020016102cb565b34801561040057600080fd5b506102c1600c5481565b34801561041657600080fd5b506102c160125481565b34801561042c57600080fd5b5061032a61043b366004611b2b565b6110a7565b34801561044c57600080fd5b506102aa611121565b34801561046157600080fd5b506102aa61128c565b34801561047657600080fd5b5061032a610485366004611b2b565b611377565b34801561049657600080fd5b506000546103dc906001600160a01b031681565b3480156104b657600080fd5b506102c1600d5481565b3480156104cc57600080fd5b506001546103dc906001600160a01b031681565b3480156104ec57600080fd5b506102aa6104fb366004611b2b565b611472565b34801561050c57600080fd5b5061032a61051b366004611b72565b6114c0565b34801561052c57600080fd5b5061055c61053b366004611b2b565b600b6020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016102cb565b6102aa6106af565b34801561058b57600080fd5b506102c1600f5481565b3480156105a157600080fd5b506003546103dc906001600160a01b031681565b3480156105c157600080fd5b506102c1600e5481565b3480156105d757600080fd5b506102aa6105e6366004611b2b565b611540565b3480156105f757600080fd5b506102aa61158b565b34801561060c57600080fd5b5061032a61061b366004611b2b565b611594565b34801561062c57600080fd5b506007546103dc906001600160a01b031681565b34801561064c57600080fd5b5061032a61065b366004611b2b565b6001600160a01b031660009081526002602052604090205460ff1690565b34801561068557600080fd5b506102aa610694366004611c0a565b611642565b3480156106a557600080fd5b506102c160115481565b6003546001600160a01b031633146106e25760405162461bcd60e51b81526004016106d990611cea565b60405180910390fd5b6006546005546001600160a01b03908116911614610952576005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561073e57600080fd5b505afa158015610752573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107769190611c22565b6040805160028082526060820183529293506000929091602083019080368337505060045482519293506001600160a01b0316918391506000906107ca57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260055482519116908290600190811061080957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de9590349061084f90600090869030904290600401611c5b565b6000604051808303818588803b15801561086857600080fd5b505af115801561087c573d6000803e3d6000fd5b50506005546040516370a0823160e01b81523060048201526000945061090c93508692506001600160a01b03909116906370a08231906024015b60206040518083038186803b1580156108ce57600080fd5b505afa1580156108e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109069190611c22565b90611774565b600d5490915061091c9082611780565b600d55600c546010546109469161093d91610937908561178c565b90611798565b600f5490611780565b600f5550610b44915050565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561099657600080fd5b505afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce9190611c22565b6040805160028082526060820183529293506000929091602083019080368337505060045482519293506001600160a01b031691839150600090610a2257634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654825191169082906001908110610a6157634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de95903490610aa790600090869030904290600401611c5b565b6000604051808303818588803b158015610ac057600080fd5b505af1158015610ad4573d6000803e3d6000fd5b50506006546040516370a0823160e01b815230600482015260009450610b1293508692506001600160a01b03909116906370a08231906024016108b6565b600d54909150610b229082611780565b600d55600c54601054610b3d9161093d91610937908561178c565b600f555050505b565b6000546001600160a01b031633146106e25760405162461bcd60e51b81526004016106d990611cea565b6040516370a0823160e01b815230600482018190526000916370a082319060240160206040518083038186803b158015610ba957600080fd5b505afa158015610bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be19190611c22565b905090565b6003546001600160a01b03163314610c105760405162461bcd60e51b81526004016106d990611cea565b6001600160a01b0382166000908152600b602052604090205415610c3757610c37826117a4565b600081118015610c5d57506001600160a01b0382166000908152600b6020526040902054155b15610cc357600880546001600160a01b0384166000818152600960205260408120839055600183018455929092527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055610cf6565b80158015610ce857506001600160a01b0382166000908152600b602052604090205415155b15610cf657610cf682611976565b6001600160a01b0382166000908152600b6020526040902054600c54610d27918391610d2191611774565b90611780565b600c556001600160a01b0382166000908152600b60205260409020819055610d4e81611ac3565b6001600160a01b039092166000908152600b602052604090206001019190915550565b600080546001600160a01b03163314610d9c5760405162461bcd60e51b81526004016106d990611cea565b6000546001600160a01b03163314610dc65760405162461bcd60e51b81526004016106d990611cc4565b50600580546001600160a01b0319166001600160a01b03831617905560015b919050565b6001600160a01b0381166000908152600b6020526040812054610e0f57506000610de5565b6001600160a01b0382166000908152600b6020526040812054610e3190611ac3565b6001600160a01b0384166000908152600b6020526040902060010154909150808211610e6257600092505050610de5565b610e6c8282611774565b949350505050565b6003546001600160a01b03163314610e9e5760405162461bcd60e51b81526004016106d990611cea565b601191909155601255565b600080546001600160a01b03163314610ed45760405162461bcd60e51b81526004016106d990611cea565b6000546001600160a01b03163314610efe5760405162461bcd60e51b81526004016106d990611cc4565b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b158015610f4057600080fd5b505afa158015610f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f789190611c22565b905080831115610fda5760405162461bcd60e51b815260206004820152602760248201527f52657175657374206578636565647320636f6e747261637420746f6b656e206260448201526630b630b731b29760c91b60648201526084016106d9565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820185905286169063a9059cbb90604401602060405180830381600087803b15801561102457600080fd5b505af1158015611038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105c9190611bea565b50600195945050505050565b600080546001600160a01b038381169116148061109257506001546001600160a01b038381169116145b1561109f57506001610de5565b506000610de5565b600080546001600160a01b031633146110d25760405162461bcd60e51b81526004016106d990611cea565b6000546001600160a01b031633146110fc5760405162461bcd60e51b81526004016106d990611cc4565b50600380546001600160a01b0383166001600160a01b03199091161790556001919050565b61112b6000611068565b8061114557503360009081526002602052604090205460ff165b6112035760405162461bcd60e51b815260206004820152608060248201527f556e617574686f72697a656421204e6f6e2d5a65726f2061646472657373206460448201527f65746563746564206173207468697320636f6e74726163742063757272656e7460648201527f206f776e65722e20436f6e74616374207468697320636f6e747261637420637560848201527f7272656e74206f776e657220746f2074616b654f776e65727368697028292e2060a482015260c4016106d9565b600054611218906001600160a01b0316611540565b60015461122d906001600160a01b0316611540565b60018054336001600160a01b03199182168117909255600080549091168217905561125790611472565b6040513381527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1565b6000546001600160a01b031633146112b65760405162461bcd60e51b81526004016106d990611cea565b6112bf33611068565b6112fb5760405162461bcd60e51b815260206004820152600d60248201526c556e617574686f72697a65642160981b60448201526064016106d9565b604051600081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1600054611344906001600160a01b0316611540565b600154611359906001600160a01b0316611540565b600180546001600160a01b0319908116909155600080549091169055565b600080546001600160a01b031633146113a25760405162461bcd60e51b81526004016106d990611cea565b6000546001600160a01b031633146113cc5760405162461bcd60e51b81526004016106d990611cc4565b60405147906000906001600160a01b0385169083908381818185875af1925050503d8060008114611419576040519150601f19603f3d011682016040523d82523d6000602084013e61141e565b606091505b50509050806114685760405162461bcd60e51b81526020600482015260166024820152752330b4b632b2103a37903932b9b1bab29022ba3432b960511b60448201526064016106d9565b5060019392505050565b6000546001600160a01b0316331461149c5760405162461bcd60e51b81526004016106d990611cea565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b600080546001600160a01b031633146114eb5760405162461bcd60e51b81526004016106d990611cea565b6000546001600160a01b031633146115155760405162461bcd60e51b81526004016106d990611cc4565b600780546001600160a01b0319166001600160a01b03851617905561153982610d71565b9392505050565b6000546001600160a01b0316331461156a5760405162461bcd60e51b81526004016106d990611cea565b6001600160a01b03166000908152600260205260409020805460ff19169055565b610b44336117a4565b600080546001600160a01b031633146115bf5760405162461bcd60e51b81526004016106d990611cea565b6000546001600160a01b031633146115e95760405162461bcd60e51b81526004016106d990611cc4565b600080546001600160a01b0319166001600160a01b0384169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1506001919050565b6003546001600160a01b0316331461166c5760405162461bcd60e51b81526004016106d990611cea565b6008548061167a5750611771565b6000805a905060005b848310801561169157508381105b1561176c5783601354106116a55760006013555b6116e56008601354815481106116cb57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316611ae6565b1561172a5761172a60086013548154811061171057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03166117a4565b61173f6117385a8490611774565b8490611780565b92505a60138054919350600061175483611d7f565b9190505550808061176490611d7f565b915050611683565b505050505b50565b60006115398284611d68565b60006115398284611d11565b60006115398284611d49565b60006115398284611d29565b6001600160a01b0381166000908152600b60205260409020546117c657611771565b60006117d182610dea565b9050801561197257600e546117e69082611780565b600e556006546005546001600160a01b0390811691161461188d5760055460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b15801561184f57600080fd5b505af1158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190611bea565b50611915565b60065460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156118db57600080fd5b505af11580156118ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119139190611bea565b505b6001600160a01b0382166000908152600a60209081526040808320429055600b9091529020600201546119489082611780565b6001600160a01b0383166000908152600b60205260409020600281019190915554610d4e90611ac3565b5050565b6008805461198690600190611d68565b815481106119a457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03848116845260099092526040909220546008805492909316929181106119f057634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260099182905260408120546008805491939291611a3c90600190611d68565b81548110611a5a57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020556008805480611a9e57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000611ae0601054610937600f548561178c90919063ffffffff16565b92915050565b6011546001600160a01b0382166000908152600a602052604081205490914291611b109190611d11565b108015611ae05750601254611b2483610dea565b1192915050565b600060208284031215611b3c578081fd5b813561153981611db0565b60008060408385031215611b59578081fd5b8235611b6481611db0565b946020939093013593505050565b60008060408385031215611b84578182fd5b8235611b8f81611db0565b91506020830135611b9f81611db0565b809150509250929050565b600080600060608486031215611bbe578081fd5b8335611bc981611db0565b92506020840135611bd981611db0565b929592945050506040919091013590565b600060208284031215611bfb578081fd5b81518015158114611539578182fd5b600060208284031215611c1b578081fd5b5035919050565b600060208284031215611c33578081fd5b5051919050565b60008060408385031215611c4c578182fd5b50508035926020909101359150565b600060808201868352602060808185015281875180845260a0860191508289019350845b81811015611ca45784516001600160a01b031683529383019391830191600101611c7f565b50506001600160a01b039690961660408501525050506060015292915050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b6020808252600d908201526c554e415554484f52495a45442160981b604082015260600190565b60008219821115611d2457611d24611d9a565b500190565b600082611d4457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611d6357611d63611d9a565b500290565b600082821015611d7a57611d7a611d9a565b500390565b6000600019821415611d9357611d93611d9a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461177157600080fdfea26469706673582212200253cf81be629b15af40d7e82981ddfb771fdb96a42bd3dfe91a331429696cb964736f6c63430008030033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
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.