Contract 0x7eb567F5c781EE8e47C7100DC5046955503fc26A 1

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x8ca89b2b7fab42ae2f2dcbeeae30cc6398a79188019204f72fd42f49abec53d8Withdrawal145690562022-01-21 21:05:501 hr 28 mins ago0x2972d2aa65ea7a4b89654e64fd133b0711a5ddc0 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.00065369
0x36473499cb9418967fe7c478447bf110844894e455627ff9d5efacd326808b8aReinvest145501662022-01-21 5:20:0317 hrs 14 mins ago0xa37fe3caa54d9c093fdaad661946cf0c513a9eeb IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.001397035
0xca95de3cbf72c827170b33c0c097c997b14a99b126dd20f782d74d19917dce03Approve145023992022-01-19 13:24:152 days 9 hrs ago0x2a41955fb9e302a042783802ea565ec4df46f27f IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.0002308
0x8dd91a5b183bc292bea4844e3e6c36937f918f69f9443caff66e968f8d3177adApprove144967662022-01-19 8:42:292 days 13 hrs ago0x251384107fcaa63b45e15b08804af40db90a922e IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.0002308
0x60dad643cf5737e75505a9be8d770d2102d860def7ca501f011823c47f4d3539Approve144834972022-01-18 21:37:103 days 57 mins ago0x8f8171fb4d3ff46f40c95fe89d82a3ccb5c81165 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.00032312
0x23252193cb0dfc2bc86139565a6e65d1ca96b4356dadc8103bf2bc9c4ea48651Reinvest144833172022-01-18 21:28:103 days 1 hr ago0x54cdb9a632f12fd587cd39779a31e99fc78d8d34 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.001472035
0xa8f75e62d8d3bf7bdce1943953e5f36409d0ac048f12f0a2341674e58df5dddaReinvest144767392022-01-18 15:56:413 days 6 hrs ago0x22a0a0a04cfe9833e7ab82fa0269c0ae1d66d4f1 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.000177515
0x1fe146493fdda0239cb8f1d9c342cc06754704d56284a9ac7509b28fdb41d203Approve144543982022-01-17 21:00:414 days 1 hr ago0xdfe8cc8b514d34883e196803da9d562f1c48b96f IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.0002308
0x1fdfcad785bee87170a5efc269bba014a90b44118079ec23f886ac4980414267Approve144506352022-01-17 17:50:564 days 4 hrs ago0xaf28446eadeb18235d6bddeb37c04252bb7bb5fc IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.0002308
0xa47241bc83ad511f8b5c26c008c656a80ebfc1dc085d72607e2b4f70fc47691eDonate144400992022-01-17 8:56:054 days 13 hrs ago0x1b6a214ca06cb92e7dfecb9171d30b3bc9dfa154 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.00082525
0x3b2b0bc51fce6a560d22a25fe8cc7bb460547888fb622905946cc3a01bd519ceReinvest144298502022-01-17 0:18:404 days 22 hrs ago0x6aa72ca7dc1c279370673a312a71d2c51e499fa9 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.001472035
0x3c2e3f9b6a518b265935fd438bf400ac52e4513272f42e9c0352bd366e3fafc7Transfer144205062022-01-16 16:30:265 days 6 hrs ago0x2f5247dc0df80bf379835671f43b56bd5c96436b IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.00097758
0x510f520bc13ee58f8e6d20cddbd25e29bf56d6bae70d75958ac2249531ddebedWithdrawal144088562022-01-16 6:45:085 days 15 hrs ago0x9983a7ec07df40db2117f2077ffbba7a21fb576f IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.00072869
0xaa284a4065bea491c649924102b040e8fe006b9c96e8449a4920667dc9bd02c4Approve144025092022-01-16 1:27:465 days 21 hrs ago0x40bd05b31bbca5790d626a4afcc1b0dd3b7671dc IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.0002308
0x0839afdacf1e7d663f0012eda3565dd60614a38e84f59f416cc6d918d88d653cApprove144012862022-01-16 0:26:375 days 22 hrs ago0x72e1b5371ecef72fcc4d0f97428db85371a1ab0b IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.0002308
0x6967a2e1095cb3b17232bbb152dc27111ec4d8966569f5f0bc24c0cc8c5875bfReinvest143966692022-01-15 20:33:416 days 2 hrs ago0x1cea8ea88f65125f03a81038d3b48d7dc4978e02 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.001472035
0x3520512106388a11089b93d13090681c99dfbcb22be3029142897702d795e9bdReinvest143896692022-01-15 14:41:476 days 7 hrs ago0x689f201ca4c770a62d1eca6dae630ebf69459ac5 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.001226035
0x1c95a2310978ab0e1513a4f2881e67dc98b6c3257c3d99d1fc0fc65f14490b9bApprove143546962022-01-14 9:30:347 days 13 hrs ago0xc7453690dfc5e0e2e341894cd540ab72744d6933 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.0002308
0x121f660c5323d29ab5c35fa24fbfef912c6743cc3bc94e406e4dde4a83dc0da4Approve143532822022-01-14 8:19:157 days 14 hrs ago0xcf90a01359eedf4257f81f826a9c71e9d9e657fb IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.0002308
0x309541ffae49f710fe4c2d924cd02b8bb7c5b32f7868144b8499c67953f63dd3Approve143420002022-01-13 22:52:407 days 23 hrs ago0x068f58b0140084f4aa734b37333d06d1567d7f44 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.0002308
0xcdda1d91053ff1a5fd1e35f58f0bf09d0ee584a39a46e4b0c3e858675cd2e006Reinvest143107992022-01-12 20:51:359 days 1 hr ago0xbba95ff4b70b777cab20097ef32b541726ed2c63 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.001472035
0x8f3984465d58c4ba1eac37f366d0f247d5ef0919be39ba417627187bed8c0adcApprove143020732022-01-12 13:34:069 days 9 hrs ago0x5e7a1573620e0df38e41dd302f68d7d8e5b99bba IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.0002308
0x68bab72ff45b0b4efab9eb25c37912d40b36567b1d1c14ffcc636a6c33b7d110Withdrawal142800642022-01-11 19:11:0210 days 3 hrs ago0x9833a6232ef3f679ff7cffd345fa4c47dda11fc2 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.00072869
0x5eba9683cb67d7252414f3adbc3f254722003fb4f22e163158c85f1fb6274ab6Approve142799972022-01-11 19:07:4110 days 3 hrs ago0x9833a6232ef3f679ff7cffd345fa4c47dda11fc2 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.0002308
0x6cf61a71a607030ada954d8e211fc51dcc732c74233e996057216e13ba2e7a39Approve142793772022-01-11 18:36:4110 days 3 hrs ago0x16c2dcade091f7594d8b5a84ea5b64322cee3c79 IN  0x7eb567f5c781ee8e47c7100dc5046955503fc26a0 BNB0.0002308
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x20d3ab41178b25483b171e758abd933c5acaecaea5c764ffb6ee0cf2fb20e994145690742022-01-21 21:06:441 hr 28 mins ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a Binance: WBNB Token0.034375038029096642 BNB
0x20d3ab41178b25483b171e758abd933c5acaecaea5c764ffb6ee0cf2fb20e994145690742022-01-21 21:06:441 hr 28 mins ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0xc475d33a760c3e0325a33c3aba706c135c456c290.034375038029096642 BNB
0x20d3ab41178b25483b171e758abd933c5acaecaea5c764ffb6ee0cf2fb20e994145690742022-01-21 21:06:441 hr 28 mins ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0xdcd236b4c77711be7e90bc2b57dea812330165b30.034375038029096642 BNB
0x20d3ab41178b25483b171e758abd933c5acaecaea5c764ffb6ee0cf2fb20e994145690742022-01-21 21:06:441 hr 28 mins ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a 0x2af8721e1dd5ce74d39006b57d406a3d83daee5a0.068750076058193285 BNB
0x20d3ab41178b25483b171e758abd933c5acaecaea5c764ffb6ee0cf2fb20e994145690742022-01-21 21:06:441 hr 28 mins ago PancakeSwap: Router v2 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0.171875190145483211 BNB
0xbbcc12fded14ee378e6689cd82aa1c04f3a366416628a75cd14b91842f36f38c145024202022-01-19 13:25:182 days 9 hrs ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a Binance: WBNB Token0.00229405694095053 BNB
0xbbcc12fded14ee378e6689cd82aa1c04f3a366416628a75cd14b91842f36f38c145024202022-01-19 13:25:182 days 9 hrs ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0xc475d33a760c3e0325a33c3aba706c135c456c290.00229405694095053 BNB
0xbbcc12fded14ee378e6689cd82aa1c04f3a366416628a75cd14b91842f36f38c145024202022-01-19 13:25:182 days 9 hrs ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0xdcd236b4c77711be7e90bc2b57dea812330165b30.00229405694095053 BNB
0xbbcc12fded14ee378e6689cd82aa1c04f3a366416628a75cd14b91842f36f38c145024202022-01-19 13:25:182 days 9 hrs ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a 0x2af8721e1dd5ce74d39006b57d406a3d83daee5a0.004588113881901061 BNB
0xbbcc12fded14ee378e6689cd82aa1c04f3a366416628a75cd14b91842f36f38c145024202022-01-19 13:25:182 days 9 hrs ago PancakeSwap: Router v2 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0.011470284704752651 BNB
0x379db685d783b5146a4577bfd95a6df129a9bc0aaec8b6a2e7882f164a2fa670144580062022-01-18 0:03:013 days 22 hrs ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a Binance: WBNB Token0.002213997129576829 BNB
0x379db685d783b5146a4577bfd95a6df129a9bc0aaec8b6a2e7882f164a2fa670144580062022-01-18 0:03:013 days 22 hrs ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0xc475d33a760c3e0325a33c3aba706c135c456c290.002213997129576829 BNB
0x379db685d783b5146a4577bfd95a6df129a9bc0aaec8b6a2e7882f164a2fa670144580062022-01-18 0:03:013 days 22 hrs ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0xdcd236b4c77711be7e90bc2b57dea812330165b30.002213997129576829 BNB
0x379db685d783b5146a4577bfd95a6df129a9bc0aaec8b6a2e7882f164a2fa670144580062022-01-18 0:03:013 days 22 hrs ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a 0x2af8721e1dd5ce74d39006b57d406a3d83daee5a0.004427994259153662 BNB
0x379db685d783b5146a4577bfd95a6df129a9bc0aaec8b6a2e7882f164a2fa670144580062022-01-18 0:03:013 days 22 hrs ago PancakeSwap: Router v2 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0.011069985647884149 BNB
0xafba945e622c53d2348481de700839b76e894296702536d2646b5b6866e98e92144544102022-01-17 21:01:174 days 1 hr ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a Binance: WBNB Token0.004936376779891869 BNB
0xafba945e622c53d2348481de700839b76e894296702536d2646b5b6866e98e92144544102022-01-17 21:01:174 days 1 hr ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0xc475d33a760c3e0325a33c3aba706c135c456c290.004936376779891869 BNB
0xafba945e622c53d2348481de700839b76e894296702536d2646b5b6866e98e92144544102022-01-17 21:01:174 days 1 hr ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0xdcd236b4c77711be7e90bc2b57dea812330165b30.004936376779891869 BNB
0xafba945e622c53d2348481de700839b76e894296702536d2646b5b6866e98e92144544102022-01-17 21:01:174 days 1 hr ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a 0x2af8721e1dd5ce74d39006b57d406a3d83daee5a0.009872753559783741 BNB
0xafba945e622c53d2348481de700839b76e894296702536d2646b5b6866e98e92144544102022-01-17 21:01:174 days 1 hr ago PancakeSwap: Router v2 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0.024681883899459348 BNB
0x9166a382bf3965d5917b0d30dc9ecf40063ce200a43604ac698d2d61fc8a7b4d144507462022-01-17 17:56:294 days 4 hrs ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a Binance: WBNB Token0.008307033323001444 BNB
0x9166a382bf3965d5917b0d30dc9ecf40063ce200a43604ac698d2d61fc8a7b4d144507462022-01-17 17:56:294 days 4 hrs ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0xc475d33a760c3e0325a33c3aba706c135c456c290.008307033323001444 BNB
0x9166a382bf3965d5917b0d30dc9ecf40063ce200a43604ac698d2d61fc8a7b4d144507462022-01-17 17:56:294 days 4 hrs ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0xdcd236b4c77711be7e90bc2b57dea812330165b30.008307033323001444 BNB
0x9166a382bf3965d5917b0d30dc9ecf40063ce200a43604ac698d2d61fc8a7b4d144507462022-01-17 17:56:294 days 4 hrs ago 0x7eb567f5c781ee8e47c7100dc5046955503fc26a 0x2af8721e1dd5ce74d39006b57d406a3d83daee5a0.016614066646002889 BNB
0x9166a382bf3965d5917b0d30dc9ecf40063ce200a43604ac698d2d61fc8a7b4d144507462022-01-17 17:56:294 days 4 hrs ago PancakeSwap: Router v2 0x7eb567f5c781ee8e47c7100dc5046955503fc26a0.041535166615007221 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KojiEarth

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
constantinople EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 1 : KojiEarth_v2.sol
// SPDX-License-Identifier: Licensed to Kill Zeroes

/*
koji.earth project
launched on Ethereum 6.2021, high gas fees made trading unreasonable
relaunching on BSC with new, better contract at original public sale price

Website: https://koji.earth
Telegram: https://t.me/kojiearth

25 Million KOJI required to receive divs in BNB
Withdraw/Reinvest dividends : https://app.koji.earth

Staking & Full NFT comic book coming 1.2022 (maybe sooner!)

Tokenomics: 

Supply: 1 Trillion

Phase 1 Taxes - Staking/NFT pools inactive:

                                /   1% KOJI to burn wallet
                                |   6% left converts to BNB
7% tax on buy/sell/transfer -   |   40% of BNB to holders
                                |   20% of BNB to liquidity
                                |   20% of BNB to charity 
                                \   20% of BNB to admin (artwork, marketing, etc..)

Phase 2 Taxes - Staking/NFT pools active:

                                /   1% KOJI to burn wallet
                                |   1% KOJI to stake pool
                                |   6% left converts to BNB
8% tax on buy/sell/transfer -   |   40% of BNB to holders
                                |   15% of BNB to liquidity
                                |   15% of BNB to charity 
                                |   15% of BNB to NFT reward pool
                                \   15% of BNB to admin (artwork, marketing, etc..)       

5% slippage on buys, 10-15% on sells, make sure KOJI amount on sell doesn't end in zero 

No rug, no scam, trusted team; stop by our TG and say hi!
*/

pragma solidity ^0.8.9;

/**
 * Standard SafeMath, stripped down to just add/sub/mul/div
 */
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;

        return c;
    }
}

/**
 * BEP20 standard interface.
 */
interface IBEP20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


/**
 * Allows for contract ownership along with multi-address authorization
 */
abstract contract Auth {
    address internal owner;

    constructor(address _owner) {
        owner = _owner;
    }

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

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

    /**
     * Transfer ownership to new address. Caller must be owner. 
     */
    function transferOwnership(address payable adr) public onlyOwner {
        owner = adr;
        emit OwnershipTransferred(adr);
    }

    event OwnershipTransferred(address owner);
}

abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

interface IOracle {
    function getdiscount(uint256 amount) external returns (uint256 discount);
}

interface IDEXFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function approve(address spender, uint value) external returns (bool);
    function balanceOf(address owner) external view returns (uint);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

interface IDEXRouter {
    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 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;
}

interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function deposit() external payable;
    function addBNB() external payable;
    function addBNBnetDivs() external payable;
    function setDividendToken(address dividendToken) external;
    function distributeDividend(address shareholder, uint256 percent) external;
    function reinvestDividend(address shareholder, uint256 percent, uint256 minOut) external;
    function sweep(uint256 gas) external;
    function changeMinHold(uint256 _amount, uint256 _gas) external;
    function transferBEP20Tokens(address _tokenAddr, address _to, uint _amount) external;
    function changeImpoundTimelimit(uint256 _timelimit) external;
    function changeDistribGas(uint256 _walletGas, uint256 _reinvestGas) external;
    function rescueETHFromContract() external;
    function donate(address shareholder, address charity, uint256 percent) external;
}

contract DividendDistributor is IDividendDistributor {
    using SafeMath for uint256;

    address _token;

    struct Share {
        uint256 amount;
        uint256 unpaidDividends;
        uint256 totalExcluded;
        uint256 totalRealised;
        bool rewardEligible;
    }

    IBEP20 dividendToken;
    IDEXRouter router;
    
    address WETH;

    address[] shareholders;
    address[] donators;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;
    mapping (address => uint256) shareholderDonated;
    mapping (address => uint256) public shareholderExpired;
    mapping (address => Share) public shares;
    mapping (address => bool) shareholderAdded;
    mapping (address => bool) donatorAdded;

    uint256 public totalWithdrawn;
    uint256 public totalReinvested;
    uint256 public totalDonated;
    uint256 public netDividends;
    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    uint256 lastDeposit;
    uint256 distribWalletGas = 40000;
    uint256 distribReinvestGas = 450000;

    uint256 public impoundTimelimit = 2592000; //1 month default
    uint256 public minDistribution = 1000000* (10 ** 9); //0.001
    uint256 public minHoldAmountForRewards = 25000000 * (10**9); // Must hold 25 million tokens to receive rewards

    uint256 currentIndex;

    bool initialized;
    modifier initialization() {
        require(!initialized);
        _;
        initialized = true;
    }

    modifier onlyToken() {
        require(msg.sender == _token); _;
    }
    
    event DividendTokenUpdate(address dividendToken);

    constructor (address _router, address _dividendToken) {
        router = _router != address(0)
            ? IDEXRouter(_router)
            : IDEXRouter(0x10ED43C718714eb63d5aA57B78B54704E256024E);
        _token = msg.sender;
        dividendToken = IBEP20(_dividendToken);
        WETH = router.WETH();
    }

    function setShare(address shareholder, uint256 amount) public override onlyToken {
        if(shares[shareholder].amount > 0){
            shares[shareholder].unpaidDividends = shares[shareholder].unpaidDividends.add(getUnpaidEarnings(shareholder));
        }

        if(amount > 0 && shares[shareholder].amount == 0){
            if (amount >= minHoldAmountForRewards) {
                addShareholder(shareholder);
                shareholderExpired[shareholder] = 9999999999;
            }
        }else if(amount == 0 && shares[shareholder].amount > 0){
            if (shares[shareholder].unpaidDividends == 1 || shares[shareholder].unpaidDividends == 0) {
                removeShareholder(shareholder);
            } else {
                shareholderExpired[shareholder] = block.timestamp;
            }
            
        }

        bool boolGetsRewards = shares[shareholder].rewardEligible;

        if (amount >= minHoldAmountForRewards) {
            if (!boolGetsRewards) {
                shares[shareholder].rewardEligible = true;
                totalShares = totalShares.add(amount);
                shares[shareholder].amount = amount;
            } else {
                totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
                shares[shareholder].amount = amount;
            }
        } else {
            if (boolGetsRewards) {
                shares[shareholder].rewardEligible = false;
                totalShares = totalShares.sub(shares[shareholder].amount);
                shares[shareholder].amount = 0;
            } else {
                shares[shareholder].amount = 0;
            }
        }

        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit() external payable override onlyToken {
        uint256 amount = msg.value;

        lastDeposit = amount;
        netDividends = netDividends.add(amount);
        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }


    function addBNB() external payable override onlyToken {
        uint256 amount = msg.value;
    }

    function addBNBnetDivs() external payable override onlyToken {
        uint256 amount = msg.value;
        netDividends = netDividends.add(amount);
        totalDividends = totalDividends.add(amount);
    }

     //withdraw dividends
     function distributeDividend(address shareholder, uint256 percent) external override onlyToken {

         require(percent >= 25 && percent <= 100, "Percent of withdrawal is outside of parameters");
        
         uint256 fullamount = shares[shareholder].unpaidDividends.add(getUnpaidEarnings(shareholder));
        
         uint256 netamount = fullamount.mul(percent).div(100);
        
        if(netamount > 0){
            
            netamount = netamount.sub(1); //this is so we aren't short on dust in the holding wallet

            totalDistributed = totalDistributed.add(netamount);

            (bool successShareholder, /* bytes memory data */) = payable(shareholder).call{value: netamount, gas: distribWalletGas}("");
            require(successShareholder, "Shareholder rejected BNB transfer");
            shareholderClaims[shareholder] = block.timestamp;
            
            shares[shareholder].unpaidDividends = fullamount.sub(netamount); 
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(netamount);

            totalWithdrawn = totalWithdrawn.add(netamount);
            netDividends = netDividends.sub(netamount);          


        } else {
            return; 
        }
    }

    //Reinvest dividends
    function reinvestDividend(address shareholder, uint256 percent, uint256 minOut) external override onlyToken {

        require(percent >= 25 && percent <= 100, "Percent of reinvestment is outside of parameters");

        uint256 fullamount = shares[shareholder].unpaidDividends.add(getUnpaidEarnings(shareholder));
        
        uint256 netamount = fullamount.mul(percent).div(100);

        if(netamount >= minDistribution){

           netamount = netamount.sub(1); //this is so we aren't short on dust in the holding wallet

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

            router.swapExactETHForTokensSupportingFeeOnTransferTokens{value:netamount, gas:distribReinvestGas}(
                minOut,
                path,
                address(shareholder),
                block.timestamp
            );

            totalDistributed = totalDistributed.add(netamount);
            
            shares[shareholder].unpaidDividends = fullamount.sub(netamount); 

            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(netamount);
            
            totalReinvested = totalReinvested.add(netamount);
            shareholderClaims[shareholder] = block.timestamp;
            netDividends = netDividends.sub(netamount);
            
        } else {
            return; 
        }
    }

     //withdraw dividends
     function donate(address shareholder, address charityAddress, uint256 percent) external override onlyToken {

         require(percent >= 25 && percent <= 100, "Percent of donation is outside of parameters");
        
         uint256 fullamount = shares[shareholder].unpaidDividends.add(getUnpaidEarnings(shareholder));
        
         uint256 netamount = fullamount.mul(percent).div(100);
        
        if(netamount > 0){
            
            netamount = netamount.sub(1); //this is so we aren't short on dust in the holding wallet

            totalDistributed = totalDistributed.add(netamount);

            (bool successShareholder, /* bytes memory data */) = payable(charityAddress).call{value: netamount, gas: distribWalletGas}("");
            require(successShareholder, "Shareholder rejected BNB transfer");
            shareholderClaims[shareholder] = block.timestamp;
            
            shares[shareholder].unpaidDividends = fullamount.sub(netamount); 
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);

            addDonator(shareholder);
            shareholderDonated[shareholder] = shareholderDonated[shareholder].add(netamount);

            totalDonated = totalDonated.add(netamount);
            netDividends = netDividends.sub(netamount);          


        } else {
            return; 
        }
    }
    
    function getUnpaidDividends(address shareholder) public view returns (uint256 unpaidDividends) {
        return shares[shareholder].unpaidDividends;
    }

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

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[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);
    }

    //Impounds all divs from non-KOJI holders that sold all, yet didn't claim rewards within time limit
    function sweep(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

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

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

                if (shares[shareholders[currentIndex]].unpaidDividends > 0 
                && shares[shareholders[currentIndex]].amount == 0 
                && block.timestamp.add(impoundTimelimit) > shareholderExpired[shareholders[currentIndex]]) {
                    impoundDividend(shareholders[currentIndex]);
                } 

            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();

            currentIndex++;
            iterations++;
        }

        cleanup();
        
    }

    //Removes non-KOJI holders from array after sweep()
    function cleanup() internal {

        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 iterations = 0;
        currentIndex = 0;
    
        while(iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){
                currentIndex = 0;
            }

            if (shares[shareholders[currentIndex]].unpaidDividends == 0
            && shares[shareholders[currentIndex]].amount == 0 
            && block.timestamp.add(impoundTimelimit) > shareholderExpired[shareholders[currentIndex]]) {
                  removeShareholder(shareholders[currentIndex]); 
            } 

            currentIndex++;
            iterations++;
        }

    }


    //Impounds unclaimed dividends from wallets that sold all their tokens yet didn't claim rewards within the specified timeframe (default 30 days)
    function impoundDividend(address shareholder) internal {

        uint256 amount = shares[shareholder].unpaidDividends.add(getUnpaidEarnings(shareholder));

        uint256 netamount = amount.sub(1); //this is so we aren't short on dust in the holding wallet

        (bool successShareholder, /* bytes memory data */) = payable(_token).call{value: netamount, gas: distribWalletGas}("");
        require(successShareholder, "Shareholder rejected BNB transfer");

        shareholderClaims[shareholder] = block.timestamp;
        shareholderExpired[shareholder] = 9999999999;

        shares[shareholder].unpaidDividends = 0;

        netDividends = netDividends.sub(amount);

    }

    function addShareholder(address shareholder) internal {
        if (shareholderAdded[shareholder]) {
            return;
        } else {
            shareholderIndexes[shareholder] = shareholders.length;
            shareholders.push(shareholder);
            shareholderAdded[shareholder] = true;
        }
        
    }

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

    function addDonator(address shareholder) internal {
        if (donatorAdded[shareholder]) {
            return;
        } else {
            donators.push(shareholder);
            donatorAdded[shareholder] = true;
        }
        
    }
    
    function setDividendToken(address _dividendToken) external override onlyToken {
        dividendToken = IBEP20(_dividendToken);
        emit DividendTokenUpdate(_dividendToken);
    }
    
    function getDividendToken() external view returns (address) {
        return address(dividendToken);
    }

    //Change the min hold requirement for rewards. 
    function changeMinHold(uint256 _amount, uint256 _gas) external override onlyToken {
        require(_amount != minHoldAmountForRewards, "new threshold amount cannot be the same as existing threshold");
        require(_amount >= 1000000000 || _amount <= 100000000000000000, "Min hold amount for divs should between 1 and 100M tokens");
        require(_gas >= 450000, "Please use a gas value equal to or higher than 450,000");
        
        uint256 lastAmount = minHoldAmountForRewards;
        minHoldAmountForRewards = _amount;

        if (lastAmount > minHoldAmountForRewards) { //lowered
            changeMinHoldAmount(_gas, 0);
        } else {                                    //raised
            changeMinHoldAmount(_gas, 1);
        }

    }

    function changeMinHoldAmount(uint256 gas, uint256 flag) internal {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

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

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

                if(flag == 0) {
                    if(shares[shareholders[currentIndex]].amount == 0 && shareholderExpired[shareholders[currentIndex]] == 9999999999) {
                        uint256 balance = IBEP20(_token).balanceOf(shareholders[currentIndex]);
                        setShare(shareholders[currentIndex],balance);
                    }
                } else {
                    if(shares[shareholders[currentIndex]].amount > 0) {
                        
                        setShare(shareholders[currentIndex],shares[shareholders[currentIndex]].amount);
                    }
                }
                
                

            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();

            currentIndex++;
            iterations++;
        }

    }

    // Function to allow admin to claim *other* ERC20 tokens sent to this contract (by mistake)
    function transferBEP20Tokens(address _tokenAddr, address _to, uint _amount) external override onlyToken {
        IBEP20(_tokenAddr).transfer(_to, _amount);
    }

    // This will allow to rescue ETH held in the distributor interface address
    function rescueETHFromContract() external override onlyToken {
        address payable _owner = payable(_token);
        _owner.transfer(address(this).balance);
    }

    function viewMinHold() external view returns (uint256) {
        return minHoldAmountForRewards;
    }

    function holderInfo(address _holder) external view returns (uint256, uint256, uint256, uint256, bool) {
        return (shares[_holder].amount, shares[_holder].unpaidDividends, shares[_holder].totalRealised, shares[_holder].totalExcluded, shares[_holder].rewardEligible);
    }

    function mathInfo() external view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) {
        return (totalShares, netDividends, totalDistributed, totalReinvested, totalWithdrawn, totalDonated, totalDividends);
    }

    function getShareholderExpired(address _holder) external view returns (uint256) {
        return shareholderExpired[_holder];
    }

    function changeImpoundTimelimit(uint256 _timelimit) external override onlyToken {
        impoundTimelimit = _timelimit;
    }

    function changeDistribGas(uint256 _walletGas, uint256 _reinvestGas) external override onlyToken {
        distribWalletGas = _walletGas;
        distribReinvestGas = _reinvestGas;
    }

    function setDistributionCriteria(uint256 _minDistribution) external override onlyToken {
        minDistribution = _minDistribution;
    }

    function getDistributionCriteria() external view returns (uint256) {
        return minDistribution;
    }

    function getDonationLeaders() external view returns (address[] memory, uint256[] memory) {
        uint limit = donators.length;
        address[] memory list = new address[](limit);
        uint256[] memory sent = new uint256[](limit);
        for (uint start = 0; start < limit; ++start) {
            list[start] = donators[start];
            sent[start] = shareholderDonated[donators[start]];
        }

        return (list, sent);
    }
}

contract KojiEarth is IBEP20, Auth, ReentrancyGuard {
    using SafeMath for uint256;

    address WETH;
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;

    IWETH WETHrouter;
    
    string constant _name = "koji.earth";
    string constant _symbol = "KOJI v2";
    uint8 constant _decimals = 9;

    uint256 _totalSupply = 1000000000000 * (10 ** _decimals);
    uint256 public _maxTxAmountBuy = _totalSupply;
    uint256 public _maxTxAmountSell = _totalSupply; 
    uint256 public _maxWalletToken = _totalSupply; 

    struct Partners {
        address token_addr;
        uint256 minHoldAmount;
        uint256 discount;
        bool enabled;
    }

    mapping (uint256 => Partners) private partners;
    address[] partneraddr;
    mapping (address => bool) partnerAdded;

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

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

    uint256 initialBlockLimit = 1;
    
    uint256 public burnRatio = 142;
    uint256 public stakepoolRatio = 142;
    uint256 public taxRatio = 200;

    uint256 public totalFee = 70; //(7%)
    uint256 discountOffset = 1;
    uint256 public partnerFeeLimiter = 50;
    uint256 public feeDenominator = 1000;
    uint256 public WETHaddedToPool;

    address public charityWallet;
    address public adminWallet;
    address public nftRewardWallet;
    address public stakePoolWallet;

    uint256 public totalCharity;
    uint256 public totalAdmin;
    uint256 public totalNFTrewards;
    uint256 public totalStakepool;

    IDEXRouter public router;
    IOracle public oracle;
    
    address public pair;

    uint256 public launchedAt;

    bool public swapEnabled = false;
    bool public stakePoolActive = false;
    bool public nftPoolActive = false;
    bool public distributorDeposit = true;
    bool public teamWalletDeposit = true;
    bool public addToLiquid = true;
    bool public enablePartners = false;
    bool public enableOracle = false;
    bool public airdropEnabled = false;
    bool public launchEnabled = false;

    bool inSwap;
    
    DividendDistributor distributor;
    uint256 distributorGas = 750000;
    uint256 walletGas = 40000;
    uint256 depositGas = 350000;

    uint256 private swapThreshold = 100000000000000; //100k tokens
    
    modifier swapping() { inSwap = true; _; inSwap = false; }

    constructor () Auth(msg.sender) {
        
        router = IDEXRouter(0x10ED43C718714eb63d5aA57B78B54704E256024E); 

        oracle = IOracle(0x2E7bC3122009E9d6487a9b62465C5Ecc5466E81e);
        
        address _presaler = msg.sender;
            
        WETH = router.WETH();
        
        pair = IDEXFactory(router.factory()).createPair(WETH, address(this));
        
        _allowances[address(this)][address(router)] = type(uint256).max;

        distributor = new DividendDistributor(address(router), WETH);

        isFeeExempt[_presaler] = true;
        isDividendExempt[_presaler] = true;
        isTxLimitExempt[_presaler] = true;
        isTxLimitExempt[DEAD] = true;
        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;

        charityWallet = 0xDcd236b4C77711BE7e90bC2b57Dea812330165B3;
        adminWallet = 0xC475d33a760c3e0325A33C3abA706c135c456C29;
        nftRewardWallet = 0x70117981e4C9fA0309a9BC83412305281dB5Af8B;
        stakePoolWallet = 0x70117981e4C9fA0309a9BC83412305281dB5Af8B;

        isFeeExempt[stakePoolWallet] = true;
        isDividendExempt[stakePoolWallet] = true;

        _balances[_presaler] = _totalSupply;
        emit Transfer(address(0), _presaler, _totalSupply);

    }

    receive() external payable { }

    function totalSupply() external view override returns (uint256) { return _totalSupply; }
    function decimals() external pure override returns (uint8) { return _decimals; }
    function symbol() external pure override returns (string memory) { return _symbol; }
    function name() external pure override returns (string memory) { return _name; }
    function getOwner() external view override 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) {
        if(!isOwner(msg.sender)){require(launchEnabled, "Liquid has not been added yet!");}
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function approveMax(address spender) external returns (bool) {
        return approve(spender, type(uint256).max);
    }

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

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if(_allowances[sender][msg.sender] != type(uint256).max){
            _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        }

        return _tF(sender, recipient, amount);
    }

    function _tF(address s, address r, uint256 amount) internal returns (bool) {
        require(amount > 0, "Insufficient Amount: cannot send 0 KOJI");
        
        if(airdropEnabled){ return _basicTransfer(s, r, amount); }
        if(inSwap){ return _basicTransfer(s, r, amount); }

        checkTxLimit(s, r, amount);

        if (r == pair) {
            
            if(shouldSwapBack()){ swapBack(); }
        }

        if(!launched() && r == pair){ require(_balances[s] > 0); launch(); }

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

        uint256 amountReceived = shouldTakeFee(s) && shouldTakeFee(r) ? takeFee(s, r, amount) : amount;

        
        if(r != pair && !isTxLimitExempt[r]){
            uint256 contractBalanceRecepient = balanceOf(r);
            require(contractBalanceRecepient + amountReceived <= _maxWalletToken, "Exceeds maximum wallet token amount"); 
        }
        
        _balances[r] = _balances[r].add(amountReceived);

        if(!isDividendExempt[s]){ try distributor.setShare(s, _balances[s]) {} catch {}}
        if(!isDividendExempt[r]){ try distributor.setShare(r, _balances[r]) {} catch {}}
        
        emit Transfer(s, r, amountReceived);
        return true;
    }
    
    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);
        emit Transfer(sender, recipient, amount);
        return true;
    }
    
    function manualBurn(uint256 amount) external onlyOwner returns (bool) {
        return _basicTransfer(address(this), DEAD, amount);
    }

    function checkTxLimit(address sender, address receiver, uint256 amount) internal view {
        if(sender == pair) {require(amount <= _maxTxAmountBuy || isTxLimitExempt[receiver], "Buy TX Limit Exceeded");}
        if(receiver == pair) {require(amount <= _maxTxAmountSell || isTxLimitExempt[sender], "Sell TX Limit Exceeded");}
    }

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

    function getTotalFee(bool bot) public view returns (uint256) {
        // Anti-bot, fees as 99% for the first block
        if(launchedAt + initialBlockLimit >= block.number || bot){ return feeDenominator.sub(1); }
        return totalFee;
    }

    function takeFee(address sender, address recipient, uint256 amount) internal returns (uint256) {
        uint256 feeAmount; 
        uint256 regularFee = getTotalFee(isBot[sender]);
        uint256 discountFee = 0;

        if (enablePartners && recipient != pair && sender == pair) {
            //scan wallet for BEP20 tokens matching those in struct 

            uint256 partnerCount = partneraddr.length;
            
            for (uint256 x = 0; x <= partnerCount; ++x) {

                Partners storage tokenpartners = partners[x];

                if (tokenpartners.enabled) {

                   if(IBEP20(address(tokenpartners.token_addr)).balanceOf(address(recipient)) >= tokenpartners.minHoldAmount) {

                       discountFee = discountFee.add(tokenpartners.discount);

                   } 

                } 
            }           

        }
        
        if (enableOracle && recipient != pair && sender == pair) {

            uint256 discountAmount = oracle.getdiscount(amount);
            discountAmount = discountAmount.div(100000000);
            discountAmount = discountAmount.add(discountOffset);
            discountFee = discountFee.add(discountAmount);
        
        } 

        if (discountFee == 0) {

            feeAmount = amount.mul(regularFee).div(feeDenominator);

        } else {

            if (discountFee > regularFee.mul(partnerFeeLimiter).div(100)) {
                discountFee = regularFee.mul(partnerFeeLimiter).div(100);
            } else {
                discountFee = regularFee.sub(discountFee);
            }
            
            feeAmount = amount.mul(discountFee).div(feeDenominator);
        }

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

    function shouldSwapBack() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && swapEnabled
        && _balances[address(this)] >= swapThreshold;
    }

    function swapBack() internal swapping {

        uint256 amountToSwap = IBEP20(address(this)).balanceOf(address(this));
        uint256 burnAmount = amountToSwap.mul(burnRatio).div(feeDenominator);

        IBEP20(address(this)).transfer(address(DEAD), burnAmount);

        if (stakePoolActive) {  
             
            uint256 stakePoolAmount = amountToSwap.mul(stakepoolRatio).div(feeDenominator);

            amountToSwap = amountToSwap.sub(stakePoolAmount);

            IBEP20(address(this)).transfer(address(stakePoolWallet), stakePoolAmount);

            totalStakepool = totalStakepool.add(stakePoolAmount);

            amountToSwap = amountToSwap.sub(burnAmount);

        } else {
            amountToSwap = amountToSwap.sub(burnAmount);
        }

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

        uint256 balanceBefore = address(this).balance;

        //We want to put any built up WBNB back into the pool 
        if (addToLiquid) {
            uint256 balance = IWETH(WETH).balanceOf(address(this));
            if (balance > 0) {
                IWETH(WETH).transfer(pair, balance);
                WETHaddedToPool = WETHaddedToPool.add(balance);
            }
        }

        //Exchange the built up tokens
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp           
        );

        //Calculate the distribution
        uint256 amountBNB = address(this).balance.sub(balanceBefore);

        uint256 taxSplit = amountBNB.mul(taxRatio).div(feeDenominator);
        uint256 amountBNBcharity = taxSplit;
        uint256 amountBNBadmin = taxSplit;
        uint256 amountBNBbuyback = taxSplit;
        uint256 amountBNBReflection;
        uint256 amountBNBnft;

        if (nftPoolActive) {
            amountBNBnft = taxSplit;
            amountBNBReflection = amountBNB.sub(amountBNBcharity).sub(amountBNBbuyback).sub(amountBNBadmin).sub(amountBNBnft);

            (bool successTeam3, /* bytes memory data */) = payable(nftRewardWallet).call{value: amountBNBnft, gas: walletGas}("");
            require(successTeam3, "NFT reward wallet rejected BNB transfer");

            totalNFTrewards = totalNFTrewards.add(amountBNBnft);

        } else {

            amountBNBReflection = amountBNB.sub(amountBNBcharity).sub(amountBNBbuyback).sub(amountBNBadmin);
        }
        
        //Deposit into the distributor
        if (distributorDeposit) {

            try distributor.deposit{value: amountBNBReflection}() {} catch {}
        }
        
        //Deposit to the team wallets
        if (teamWalletDeposit) {
        (bool successTeam1, /* bytes memory data */) = payable(charityWallet).call{value: amountBNBcharity, gas: walletGas}("");
        require(successTeam1, "Charity wallet rejected BNB transfer");

        totalCharity = totalCharity.add(amountBNBcharity);

        (bool successTeam2, /* bytes memory data */) = payable(adminWallet).call{value: amountBNBadmin, gas: walletGas}("");
        require(successTeam2, "Admin wallet rejected BNB transfer");

        totalAdmin = totalAdmin.add(amountBNBadmin);
        
        }
        
        //Convert the buyback amount to WBNB and hold until the next qualifying sell
        IWETH(WETH).deposit{value : amountBNBbuyback}();

    }

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

    function launch() internal {
        launchedAt = block.number;
    }
    
    function setInitialBlockLimit(uint256 blocks) external onlyOwner {
        require(blocks > 0, "Blocks should be greater than 0");
        initialBlockLimit = blocks;
    }

    function setBuyTxLimit(uint256 amount) external onlyOwner {
        _maxTxAmountBuy = amount;
    }
    
    function setSellTxLimit(uint256 amount) external onlyOwner {
        require(amount >= 250000000000000000, "Sell limit must not be less than 250M tokens");
        _maxTxAmountSell = amount;
    }
    
    function setMaxWalletToken(uint256 amount) external onlyOwner {
        require(amount >= 250000000000000000, "Wallet limit must not be less than 250M tokens");
        _maxWalletToken = amount;
    }
    
    function setBot(address _address, bool toggle) external onlyOwner {
        isBot[_address] = toggle;
        _setIsDividendExempt(_address, toggle);
    }

    function _setIsDividendExempt(address holder, bool exempt) internal {
        require(holder != address(this) && holder != pair);
        isDividendExempt[holder] = exempt;
        if(exempt){
            distributor.setShare(holder, 0);
        }else{
            distributor.setShare(holder, _balances[holder]);
        }
    }
    
    function setIsDividendExempt(address holder, bool exempt) external onlyOwner {
        _setIsDividendExempt(holder, exempt);
    }

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

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

    function setFee(uint256 _totalFee) external onlyOwner {
        //Total fees has to be between 0 and 10 percent
        require(_totalFee >= 0 && _totalFee <= 100, "Total Fee must be between 0 and 100 (100 = ten percent)");
        totalFee = _totalFee;
        
    }
    
    function setFeeReceivers(address _charityWallet, address _adminWallet, address _nftRewardWallet, address _stakePoolWallet) external onlyOwner {
        require(_charityWallet != ZERO, "Charity wallet must not be zero address");
        require(_adminWallet != ZERO, "Admin wallet must not be zero address");
        require(_nftRewardWallet != ZERO, "NFT reward wallet must not be zero address");
        require(_stakePoolWallet != ZERO, "Stakepool wallet must not be zero address");
         require(_charityWallet != DEAD, "Charity wallet must not be dead address");
        require(_adminWallet != DEAD, "Admin wallet must not be dead address");
        require(_nftRewardWallet != DEAD, "NFT reward wallet must not be dead address");
        require(_stakePoolWallet != DEAD, "Stakepool wallet must not be dead address");
        charityWallet = _charityWallet;
        nftRewardWallet = _nftRewardWallet;
        adminWallet = _adminWallet;
        stakePoolWallet = _stakePoolWallet;

    }
    
    function setSwapBackSettings(bool _enabled, uint256 _amount) external onlyOwner {
        swapEnabled = _enabled;
        swapThreshold = _amount;
    }
    
    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO));
    }

    function setDistributorDeposit(bool _status) external onlyOwner {
        distributorDeposit = _status;
    }

    function setTeamWalletDeposit(bool _status) external onlyOwner {
        teamWalletDeposit = _status;
    }

    function setAddToLiquid(bool _status) external onlyOwner {
        addToLiquid = _status;
    }

    function viewTeamWalletInfo() public view returns (uint256 charityDivs, uint256 adminDivs, uint256 nftDivs, uint256 stakeDivs) {
        return (totalCharity, totalAdmin, totalNFTrewards, totalStakepool);
    }

    // This will allow owner to rescue BNB sent by mistake directly to the contract
    function rescueBNB() external onlyOwner {
        address payable _owner = payable(msg.sender);
        _owner.transfer(address(this).balance);
    }

    // Converts to WBNB any BNB held in the contract (from sweep() function, for example)
    function convertBNBtoWBNB() external onlyOwner {
         IWETH(WETH).deposit{value : address(this).balance}();
    }

    // Function to allow admin to claim *other* ERC20 tokens sent to this contract (by mistake)
    function transferBEP20Tokens(address _tokenAddr, address _to, uint _amount) public onlyOwner {
        IBEP20(_tokenAddr).transfer(_to, _amount);
    }

    // This allows us to get any BNB out of the distributor address 
    function RescueBNBfromDistributor() external onlyOwner {
        distributor.rescueETHFromContract();
    }

    // Function to allow admin to claim *other* ERC20 tokens sent to the distributor  (by mistake)
    function TransferBEP20fromDistributor(address _tokenAddr, address _to, uint _amount) external onlyOwner {
        distributor.transferBEP20Tokens(_tokenAddr, _to, _amount);
    }

    //Depost BNB into the contract, then call this to increase holders dividends
    function AddToDistributorDeposit() external onlyOwner { 
       distributor.deposit{value: address(this).balance}();
    }

    //Deposit BNB into the contract, then call this to add BNB to the distributor in case it doesn't have enough to cover withdrawals (shouldn't happen, but just in case)
    function AddToDistributorBalance() external onlyOwner { 
       distributor.addBNB{value: address(this).balance}();
    }

    function AddToDistributorNetDivs() external onlyOwner { 
       distributor.addBNBnetDivs{value: address(this).balance}();
    }

    function changeOracle(address _oracle) external onlyOwner {
        oracle = IOracle(_oracle);
    }

    function GetClaimed(address _holder) external view returns (uint256 pending) {
        return distributor.getUnpaidDividends(_holder);
    }

    function GetPending(address _holder) external view returns (uint256 pending) {
        return distributor.getUnpaidEarnings(_holder);
    }

    function Withdrawal(uint256 _percent) external nonReentrant {
        distributor.distributeDividend(msg.sender, _percent);
    }

    function Reinvest(uint256 _percent, uint256 _amountOutMin) external nonReentrant {
        distributor.reinvestDividend(msg.sender, _percent, _amountOutMin);
    }

    function Donate(uint256 _percent) external nonReentrant {
        distributor.donate(msg.sender, charityWallet, _percent);
    }

    function setburnRatio(uint256 _amount) external onlyOwner {
        require(_amount <= taxRatio.div(2), "burn ratio cannot be more than 50 percent of total tax");
        burnRatio = _amount;
    } 

    function setstakepoolRatio(uint256 _amount) external onlyOwner {
        require(_amount <= taxRatio.div(2), "stakepool ratio cannot be more than 50 percent of total tax");
        stakepoolRatio = _amount;
    } 

    function settaxRatio(uint256 _amount) external onlyOwner {
        require(_amount <= feeDenominator.div(4), "tax ratio cannot be more than 250 (25%)");
        taxRatio = _amount;
    }

    function ChangeMinHold(uint256 _amount, uint256 _gas) external onlyOwner swapping {
        distributor.changeMinHold(_amount, _gas);
    }

    function ViewMinHold() external view returns (uint256 amount) {
        return distributor.viewMinHold();
    }
 
    function ViewHolderInfo(address _address) external view returns (uint256 amount, uint256 unpaid, uint256 realised, uint256 excluded, bool rewardeligible) {
        return distributor.holderInfo(_address);
    }
    
    function ViewMathInfo() external view returns (uint256 totalshares, uint256 netdividends, uint256 totaldistributed, uint256 totalreinvested, uint256 totalwithdrawn, uint256 totalDonated, uint256 totaldividends) {
        return distributor.mathInfo();
    }

    function GetMinDistribution() external view returns (uint256) {
        return distributor.getDistributionCriteria();
    }

     function GetRewardsToken() external view returns (address) {
        return distributor.getDividendToken();
    }

    function SetDistributionCriteria(uint256 _amount) external onlyOwner {
        require(_amount > 0, "minimum distribution level must be greater than zero");
        distributor.setDistributionCriteria(_amount);
    }

    function GetShareholderExpired(address _holder) external view returns (uint256) {
        return distributor.getShareholderExpired(_holder);
    }

    function ChangeImpoundTimelimit(uint256 _timelimit) external onlyOwner {
        require(_timelimit >= 2592000, "Holder should have minimum 30 days (2592000) to withdraw unclaimed divs");
        distributor.changeImpoundTimelimit(_timelimit);
    }

    //reclaim divs from anyone who dumped KOJI over 30 days (default) ago but never withdrew their dividends
    function SweepDivs() external onlyOwner {
      try distributor.sweep(distributorGas) {} catch {}
    }

    function setStakePoolActive(bool _status) external onlyOwner {
        stakePoolActive = _status; 
    }

    function setNFTPoolActive(bool _status) external onlyOwner {
        nftPoolActive = _status; 
    }

    function changeContractGas(uint256 _distributorgas, uint256 _walletgas) external onlyOwner {
        require(_distributorgas > 0, "distributor cannot be equal to zero");
        require(_walletgas > 0, "distributor cannot be equal to zero");
        
        distributorGas = _distributorgas;
        walletGas = _walletgas;
    
    }

    function ChangeDistribGas(uint256 _walletGas, uint256 _reinvestGas) external onlyOwner {
         require(_walletGas > 0, "distributor cannot be equal to zero");
         require(_reinvestGas > 0, "distributor cannot be equal to zero");
         distributor.changeDistribGas(_walletGas, _reinvestGas);
    }

    function isContract(address addr) internal view returns (bool) {
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;

        bytes32 codehash;
        assembly {
            codehash := extcodehash(addr)
        }
            return (codehash != 0x0 && codehash != accountHash);
    }

    function addPartnership(address _tokencontract, uint256 _minHoldAmount, uint256 _percent) external onlyOwner {

        require(_tokencontract != DEAD && _tokencontract != ZERO && _tokencontract != pair, "Please input a valid token contract address");
        require(isContract(_tokencontract), "Please input an actual token contract");
        require(!partnerAdded[_tokencontract], "Contract already added. To change parameters please remove first.");
        require(_minHoldAmount > 0, "Min hold must be greater than zero");
        require(_percent <= totalFee, "Discount cannot be greater than total tax");

        uint256 partnerCount = partneraddr.length;
        
        Partners storage tokenpartners = partners[partnerCount];

            tokenpartners.token_addr = _tokencontract;
            tokenpartners.minHoldAmount = _minHoldAmount;
            tokenpartners.discount =_percent;
            tokenpartners.enabled = true;

            partnerAdded[_tokencontract] = true;
            partneraddr.push(_tokencontract);
        
    }

    function removePartnership(address _tokencontract) external onlyOwner {

        uint256 partnerCount = partneraddr.length;

        if (partnerCount > 0) {
            for (uint256 x = 0; x < partnerCount; ++x) {

                Partners storage tokenpartners = partners[x];

                if (address(tokenpartners.token_addr) == address(_tokencontract)) {

                    if (x == partnerCount) {
                        tokenpartners.token_addr = ZERO;
                        tokenpartners.minHoldAmount = 0;
                        tokenpartners.discount = 0;
                        tokenpartners.enabled = false;

                        partnerAdded[_tokencontract] = false;

                        partneraddr.pop();
                        
                    } else {

                        Partners storage tokenpartnerscopy = partners[partneraddr.length-1];

                        tokenpartners.token_addr = tokenpartnerscopy.token_addr;
                        tokenpartners.minHoldAmount = tokenpartnerscopy.minHoldAmount;
                        tokenpartners.discount = tokenpartnerscopy.discount;
                        tokenpartners.enabled = true;

                        partnerAdded[_tokencontract] = false;

                        tokenpartnerscopy.token_addr = ZERO;
                        tokenpartnerscopy.minHoldAmount = 0;
                        tokenpartnerscopy.discount = 0;
                        tokenpartnerscopy.enabled = false;

                        partneraddr[x] = partneraddr[partneraddr.length-1];
                        partneraddr.pop();

                    }
                    
                }
            }

        } else {
            return;
        }
    }

    function getPartnershipIndex() external view returns (uint256) {
        return partneraddr.length;
    }

    function viewPartnership(uint256 _index) external view returns (string memory name, string memory symbol, uint8 decimals, address tokencontract, uint256 minHoldAmount, uint256 discount, bool enabled) {
        Partners storage tokenpartners = partners[_index];
        string memory token_name = IBEP20(tokenpartners.token_addr).name();
        string memory token_symbol = IBEP20(tokenpartners.token_addr).symbol();
        uint8 token_decimals = IBEP20(tokenpartners.token_addr).decimals();
        return (token_name, token_symbol, token_decimals, tokenpartners.token_addr,tokenpartners.minHoldAmount,tokenpartners.discount,tokenpartners.enabled);
    }

    function setEnablePartners(bool _status) external onlyOwner {
        enablePartners = _status;
    }

    function setEnableOracle(bool _status) external onlyOwner {
        enableOracle = _status;
    }

    //value of 100 allows partner taxes to reduce 0% of totalFee tax, 50 = 50% of total tax (default), 1 allows 99% tax reduction of total tax for partners
    function setPartnerFeeLimiter(uint256 _limiter) external onlyOwner {
        require(_limiter <= 100 && _limiter >= 1, "fee limiter must be between 1 and 100");
        partnerFeeLimiter = _limiter;
    }

    //once the airdrop is complete, this function turns off _basicTransfer permanently for airdropEnabled
    function setAirdropDisabled() external onlyOwner {
        airdropEnabled = false;
    }

    //once the liquid is added, this function turns on launchEnabled permanently
    function setLaunchEnabled() external onlyOwner {
        require(!airdropEnabled, "Please disable airdrop mode first");
        launchEnabled = true;
    }

    function registerShares() external nonReentrant {
        uint256 balance = IBEP20(address(this)).balanceOf(msg.sender);
        distributor.setShare(msg.sender,balance);
    }

    function getDonationLeaders() external view returns (address[] memory, uint256[] memory) {
       return distributor.getDonationLeaders();
    }

    function setDiscountOffset(uint256 _offset) external onlyOwner {
        discountOffset = _offset;
    }

}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "constantinople",
  "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":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","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":"AddToDistributorBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"AddToDistributorDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"AddToDistributorNetDivs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_walletGas","type":"uint256"},{"internalType":"uint256","name":"_reinvestGas","type":"uint256"}],"name":"ChangeDistribGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timelimit","type":"uint256"}],"name":"ChangeImpoundTimelimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_gas","type":"uint256"}],"name":"ChangeMinHold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"Donate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"GetClaimed","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetMinDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"GetPending","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GetRewardsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"GetShareholderExpired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"}],"name":"Reinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RescueBNBfromDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SetDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SweepDivs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TransferBEP20fromDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"ViewHolderInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"unpaid","type":"uint256"},{"internalType":"uint256","name":"realised","type":"uint256"},{"internalType":"uint256","name":"excluded","type":"uint256"},{"internalType":"bool","name":"rewardeligible","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ViewMathInfo","outputs":[{"internalType":"uint256","name":"totalshares","type":"uint256"},{"internalType":"uint256","name":"netdividends","type":"uint256"},{"internalType":"uint256","name":"totaldistributed","type":"uint256"},{"internalType":"uint256","name":"totalreinvested","type":"uint256"},{"internalType":"uint256","name":"totalwithdrawn","type":"uint256"},{"internalType":"uint256","name":"totalDonated","type":"uint256"},{"internalType":"uint256","name":"totaldividends","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ViewMinHold","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETHaddedToPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"Withdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_maxTxAmountBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmountSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokencontract","type":"address"},{"internalType":"uint256","name":"_minHoldAmount","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"addPartnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addToLiquid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_distributorgas","type":"uint256"},{"internalType":"uint256","name":"_walletgas","type":"uint256"}],"name":"changeContractGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"changeOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"charityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convertBNBtoWBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"distributorDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableOracle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enablePartners","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDonationLeaders","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPartnershipIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"bot","type":"bool"}],"name":"getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","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":[{"internalType":"address","name":"","type":"address"}],"name":"isTxLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"manualBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"nftPoolActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftRewardWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partnerFeeLimiter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registerShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokencontract","type":"address"}],"name":"removePartnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IDEXRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAddToLiquid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAirdropDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"toggle","type":"bool"}],"name":"setBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setBuyTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"}],"name":"setDiscountOffset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setDistributorDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setEnableOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setEnablePartners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_charityWallet","type":"address"},{"internalType":"address","name":"_adminWallet","type":"address"},{"internalType":"address","name":"_nftRewardWallet","type":"address"},{"internalType":"address","name":"_stakePoolWallet","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"setInitialBlockLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","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":[],"name":"setLaunchEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setNFTPoolActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limiter","type":"uint256"}],"name":"setPartnerFeeLimiter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSellTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setStakePoolActive","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":"bool","name":"_status","type":"bool"}],"name":"setTeamWalletDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setburnRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setstakepoolRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"settaxRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakePoolActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakePoolWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakepoolRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"taxRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamWalletDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCharity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNFTrewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakepool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"_tokenAddr","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferBEP20Tokens","outputs":[],"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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"viewPartnership","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"tokencontract","type":"address"},{"internalType":"uint256","name":"minHoldAmount","type":"uint256"},{"internalType":"uint256","name":"discount","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewTeamWalletInfo","outputs":[{"internalType":"uint256","name":"charityDivs","type":"uint256"},{"internalType":"uint256","name":"adminDivs","type":"uint256"},{"internalType":"uint256","name":"nftDivs","type":"uint256"},{"internalType":"uint256","name":"stakeDivs","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600380546001600160a01b031990811661dead17909155600480549091169055620000326009600a6200068c565b620000439064e8d4a51000620006a4565b60068190556007819055600881905560095560016013819055608e601481905560155560c8601655604660175560185560326019556103e8601a55602880546001600160501b03191665010101000000179055620b71b0602955619c40602a5562055730602b55655af3107a4000602c55348015620000c157600080fd5b50600080546001600160a01b031990811633908117909255600180556024805482167310ed43c718714eb63d5aa57b78b54704e256024e90811790915560258054909216732e7bc3122009e9d6487a9b62465c5ecc5466e81e17909155604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905163ad5c464891600480820192602092909190829003018186803b1580156200016e57600080fd5b505afa15801562000183573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001a99190620006c6565b600280546001600160a01b0319166001600160a01b03928316179055602454604080517fc45a01550000000000000000000000000000000000000000000000000000000081529051919092169163c45a0155916004808301926020929190829003018186803b1580156200021c57600080fd5b505afa15801562000231573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002579190620006c6565b6002546040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015230602482015291169063c9c6539690604401602060405180830381600087803b158015620002bd57600080fd5b505af1158015620002d2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f89190620006c6565b602680546001600160a01b0319166001600160a01b03928316179055306000908152600e6020908152604080832060248054861685529252918290206000199055546002549151908316929190911690620003539062000550565b6001600160a01b03928316815291166020820152604001604051809103906000f08015801562000387573d6000803e3d6000fd5b5060288054600160581b600160f81b0319166b0100000000000000000000006001600160a01b03938416021790558181166000818152600f60209081526040808320805460ff199081166001908117909255601180855283862080548316841790556010855283862080548316841790556003805489168752848720805484168517905560265489168752908552838620805483168417905530865283862080548316841790555490961684528184208054871682179055601c805473dcd236b4c77711be7e90bc2b57dea812330165b36001600160a01b031991821617909155601d805473c475d33a760c3e0325a33c3aba706c135c456c29908316179055601e80547370117981e4c9fa0309a9bc83412305281db5af8b9083168117909155601f80549092161790557f240c61d8c007a2530a063e3b0321c8922b6968a6cc0d5e816e2344f887441ebd80548716821790557f593c9f2fe20d73d68078ad926fc4bcb20b3b0cc69d71769263bb806bc511d900805490961617909455600654838352600d82528483208190559351938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350620006f1565b612804806200612283390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115620005ce578160001904821115620005b257620005b26200055e565b80851615620005c057918102915b93841c939080029062000592565b509250929050565b600082620005e75750600162000686565b81620005f65750600062000686565b81600181146200060f57600281146200061a576200063a565b600191505062000686565b60ff8411156200062e576200062e6200055e565b50506001821b62000686565b5060208310610133831016604e8410600b84101617156200065f575081810a62000686565b6200066b83836200058d565b80600019048211156200068257620006826200055e565b0290505b92915050565b60006200069d60ff841683620005d6565b9392505050565b6000816000190483118215151615620006c157620006c16200055e565b500290565b600060208284031215620006d957600080fd5b81516001600160a01b03811681146200069d57600080fd5b615a2180620007016000396000f3fe6080604052600436106106a05760003560e01c806377d4e37a1161035f578063b786a796116101d1578063dd62ed3e11610102578063f3107ee7116100a0578063f708a64f1161007a578063f708a64f14611429578063f84ba65d14611449578063f887ea4014611469578063f89893461461148957600080fd5b8063f3107ee7146113de578063f4c85091146113fe578063f59d047c1461141357600080fd5b8063e2b88782116100dc578063e2b8878214611369578063f1f3bca314611389578063f25f136c146113a9578063f2fde38b146113be57600080fd5b8063dd62ed3e146112b9578063df20fd49146112ff578063e27b95a71461131f57600080fd5b8063c7606d211161016f578063cc4b12e511610149578063cc4b12e514611219578063cf2157ea14611263578063d129c17714611283578063d608b3b2146112a357600080fd5b8063c7606d21146111c3578063c7e42c2f146111e3578063ca6eddeb146111f957600080fd5b8063bea23c6b116101ab578063bea23c6b1461114a578063bee3eae41461116d578063bf56b3711461118d578063c3647c8c146111a357600080fd5b8063b786a796146110f5578063b99fe6471461110a578063bac283fe1461112a57600080fd5b806390e23014116102ab5780639cc0e35711610249578063a9059cbb11610223578063a9059cbb1461107d578063ac5433f21461109d578063b16a3bb1146110b2578063b340348d146110d357600080fd5b80639cc0e3571461101c578063a7d742ba1461103d578063a8aa1b311461105d57600080fd5b8063943ff60711610285578063943ff60714610fa157806395d89b4114610fb757806398a17ed214610fe75780639c95df3414610ffc57600080fd5b806390e2301414610f4b57806391d55f4114610f6157806393d8e30214610f8157600080fd5b80637dc0d1d0116103185780638877bf2e116102f25780638877bf2e14610ebd578063893d20e814610edd5780638b3e65d214610efb5780638b42507f14610f1b57600080fd5b80637dc0d1d014610e5d57806382122d9814610e7d57806383b09dcf14610e9d57600080fd5b806377d4e37a14610da457806378109e5414610dc35780637b20876914610dd95780637bc000ca14610df95780637c542bf814610e0e5780637d9b451414610e4757600080fd5b806333ac2627116105135780635192c82c1161044457806369fe0e2d116103e2578063719f04b4116103bc578063719f04b414610d2e578063736ad05014610d4e57806376c7a80714610d6e5780637791563914610d8e57600080fd5b806369fe0e2d14610cbe5780636ddd171314610cde57806370a0823114610cf857600080fd5b8063634341fc1161041e578063634341fc14610c5357806364319e3314610c68578063658d4b7f14610c7e57806368d86de614610c9e57600080fd5b80635192c82c14610c07578063571ac8b014610c1d57806359bb84cd14610c3d57600080fd5b80633f4218e0116104b157806346100e4a1161048b57806346100e4a14610b8e57806346469ae714610bb157806347c421b514610bc75780634e70a60414610be757600080fd5b80633f4218e014610b0e578063433c994c14610b3e5780634355855a14610b5e57600080fd5b806336b19cd7116104ed57806336b19cd714610a715780633bbac57914610aa95780633c8e556d14610ad95780633dc4734514610af957600080fd5b806333ac262714610a11578063342aa8b514610a315780633615e7d514610a5157600080fd5b80631df4ccfc116105ed5780632807293a1161058b5780632b112e49116105655780632b112e491461099c5780632d686ebb146109b15780632f54bf6e146109c6578063313ce567146109f557600080fd5b80632807293a14610933578063292c914a14610948578063297bc9471461096957600080fd5b8063236a4afb116105c7578063236a4afb146108b257806323b63585146108d357806323b872dd146108f357806327c89d301461091357600080fd5b80631df4ccfc1461085b57806320104289146108715780632362dd391461089257600080fd5b80630c3f9cbd1161065a578063168f857a11610634578063168f857a14610806578063180b0d7e1461081b57806318160ddd146108315780631b3efe301461084657600080fd5b80630c3f9cbd146107a3578063149537f2146107b8578063151396ff146107e657600080fd5b8062b75d1c146106ac5780630197aeac146106ce57806306fdde03146106ee57806308cad4e514610733578063095ea7b31461075357806309ec68301461078357600080fd5b366106a757005b600080fd5b3480156106b857600080fd5b506106cc6106c7366004615178565b61149e565b005b3480156106da57600080fd5b506106cc6106e9366004615195565b6114ef565b3480156106fa57600080fd5b5060408051808201909152600a8152690d6ded4d25ccac2e4e8d60b31b60208201525b60405161072a919061520f565b60405180910390f35b34801561073f57600080fd5b506106cc61074e366004615222565b6115a9565b34801561075f57600080fd5b5061077361076e366004615250565b611645565b604051901515815260200161072a565b34801561078f57600080fd5b506106cc61079e366004615178565b611716565b3480156107af57600080fd5b506106cc61175c565b3480156107c457600080fd5b506107d86107d336600461527c565b611868565b60405190815260200161072a565b3480156107f257600080fd5b506106cc610801366004615299565b6118ee565b34801561081257600080fd5b506107d861199e565b34801561082757600080fd5b506107d8601a5481565b34801561083d57600080fd5b506006546107d8565b34801561085257600080fd5b506106cc611a2b565b34801561086757600080fd5b506107d860175481565b34801561087d57600080fd5b5060285461077390600160401b900460ff1681565b34801561089e57600080fd5b506106cc6108ad3660046152da565b611aca565b3480156108be57600080fd5b5060285461077390600160481b900460ff1681565b3480156108df57600080fd5b506107736108ee366004615222565b611df1565b3480156108ff57600080fd5b5061077361090e366004615299565b611e34565b34801561091f57600080fd5b506106cc61092e366004615222565b611ef6565b34801561093f57600080fd5b506106cc611ff6565b34801561095457600080fd5b5060285461077390600160381b900460ff1681565b34801561097557600080fd5b50610989610984366004615222565b612084565b60405161072a979695949392919061530f565b3480156109a857600080fd5b506107d8612274565b3480156109bd57600080fd5b506106cc6122c1565b3480156109d257600080fd5b506107736109e136600461527c565b6000546001600160a01b0391821691161490565b348015610a0157600080fd5b506040516009815260200161072a565b348015610a1d57600080fd5b506106cc610a2c366004615222565b6122ff565b348015610a3d57600080fd5b506106cc610a4c36600461536d565b61236f565b348015610a5d57600080fd5b506106cc610a6c366004615222565b6123cb565b348015610a7d57600080fd5b50601d54610a91906001600160a01b031681565b6040516001600160a01b03909116815260200161072a565b348015610ab557600080fd5b50610773610ac436600461527c565b60126020526000908152604090205460ff1681565b348015610ae557600080fd5b506106cc610af43660046153a6565b612499565b348015610b0557600080fd5b506106cc612888565b348015610b1a57600080fd5b50610773610b2936600461527c565b600f6020526000908152604090205460ff1681565b348015610b4a57600080fd5b506106cc610b59366004615178565b612931565b348015610b6a57600080fd5b50610773610b7936600461527c565b60116020526000908152604090205460ff1681565b348015610b9a57600080fd5b50610ba361297d565b60405161072a929190615446565b348015610bbd57600080fd5b506107d860075481565b348015610bd357600080fd5b506106cc610be236600461527c565b612a12565b348015610bf357600080fd5b506106cc610c02366004615222565b612a5e565b348015610c1357600080fd5b506107d860145481565b348015610c2957600080fd5b50610773610c3836600461527c565b612abe565b348015610c4957600080fd5b506107d860195481565b348015610c5f57600080fd5b506106cc612acc565b348015610c7457600080fd5b506107d860215481565b348015610c8a57600080fd5b506106cc610c9936600461536d565b612b3e565b348015610caa57600080fd5b506028546107739062010000900460ff1681565b348015610cca57600080fd5b506106cc610cd9366004615222565b612b93565b348015610cea57600080fd5b506028546107739060ff1681565b348015610d0457600080fd5b506107d8610d1336600461527c565b6001600160a01b03166000908152600d602052604090205490565b348015610d3a57600080fd5b506106cc610d49366004615222565b612c39565b348015610d5a57600080fd5b506106cc610d69366004615222565b612cd5565b348015610d7a57600080fd5b506106cc610d89366004615178565b612d04565b348015610d9a57600080fd5b506107d860165481565b348015610db057600080fd5b5060285461077390610100900460ff1681565b348015610dcf57600080fd5b506107d860095481565b348015610de557600080fd5b50601c54610a91906001600160a01b031681565b348015610e0557600080fd5b50600b546107d8565b348015610e1a57600080fd5b5060205460215460225460235460408051948552602085019390935291830152606082015260800161072a565b348015610e5357600080fd5b506107d860235481565b348015610e6957600080fd5b50602554610a91906001600160a01b031681565b348015610e8957600080fd5b506106cc610e98366004615222565b612d4f565b348015610ea957600080fd5b506107d8610eb836600461527c565b612dfa565b348015610ec957600080fd5b506106cc610ed8366004615178565b612e34565b348015610ee957600080fd5b506000546001600160a01b0316610a91565b348015610f0757600080fd5b506106cc610f16366004615222565b612e78565b348015610f2757600080fd5b50610773610f3636600461527c565b60106020526000908152604090205460ff1681565b348015610f5757600080fd5b506107d860155481565b348015610f6d57600080fd5b506106cc610f7c366004615222565b612f13565b348015610f8d57600080fd5b50601f54610a91906001600160a01b031681565b348015610fad57600080fd5b506107d860225481565b348015610fc357600080fd5b5060408051808201909152600781526625a7a524903b1960c91b602082015261071d565b348015610ff357600080fd5b506106cc612fb1565b34801561100857600080fd5b506106cc611017366004615195565b61303f565b34801561102857600080fd5b5060285461077390600160301b900460ff1681565b34801561104957600080fd5b506106cc61105836600461527c565b613119565b34801561106957600080fd5b50602654610a91906001600160a01b031681565b34801561108957600080fd5b50610773611098366004615250565b61337e565b3480156110a957600080fd5b50610a9161338b565b3480156110be57600080fd5b50602854610773906301000000900460ff1681565b3480156110df57600080fd5b5060285461077390640100000000900460ff1681565b34801561110157600080fd5b506107d8613413565b34801561111657600080fd5b506106cc611125366004615178565b613463565b34801561113657600080fd5b506106cc611145366004615299565b6134ad565b34801561115657600080fd5b506028546107739065010000000000900460ff1681565b34801561117957600080fd5b506106cc611188366004615195565b613552565b34801561119957600080fd5b506107d860275481565b3480156111af57600080fd5b506106cc6111be366004615222565b6135c7565b3480156111cf57600080fd5b506106cc6111de366004615195565b613646565b3480156111ef57600080fd5b506107d8601b5481565b34801561120557600080fd5b506106cc611214366004615222565b6136e7565b34801561122557600080fd5b5061123961123436600461527c565b613716565b6040805195865260208601949094529284019190915260608301521515608082015260a00161072a565b34801561126f57600080fd5b506107d861127e36600461527c565b6137b8565b34801561128f57600080fd5b506106cc61129e366004615178565b6137f2565b3480156112af57600080fd5b506107d860205481565b3480156112c557600080fd5b506107d86112d436600461549d565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205490565b34801561130b57600080fd5b506106cc61131a3660046154cb565b61383e565b34801561132b57600080fd5b5061133461387f565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e00161072a565b34801561137557600080fd5b506106cc611384366004615222565b613926565b34801561139557600080fd5b506107d86113a4366004615178565b6139d8565b3480156113b557600080fd5b506106cc613a10565b3480156113ca57600080fd5b506106cc6113d936600461527c565b613a69565b3480156113ea57600080fd5b50601e54610a91906001600160a01b031681565b34801561140a57600080fd5b506106cc613ae7565b34801561141f57600080fd5b506107d860085481565b34801561143557600080fd5b506106cc61144436600461536d565b613b6b565b34801561145557600080fd5b506106cc61146436600461536d565b613b9f565b34801561147557600080fd5b50602454610a91906001600160a01b031681565b34801561149557600080fd5b506106cc613bf4565b6000546001600160a01b031633146114d15760405162461bcd60e51b81526004016114c8906154e9565b60405180910390fd5b6028805491151563010000000263ff00000019909216919091179055565b6000546001600160a01b031633146115195760405162461bcd60e51b81526004016114c8906154e9565b60288054600160501b60ff60501b19909116179081905560405163e2b2782d60e01b81526004810184905260248101839052600160581b9091046001600160a01b03169063e2b2782d90604401600060405180830381600087803b15801561158057600080fd5b505af1158015611594573d6000803e3d6000fd5b50506028805460ff60501b1916905550505050565b6000546001600160a01b031633146115d35760405162461bcd60e51b81526004016114c8906154e9565b6703782dace9d900008110156116405760405162461bcd60e51b815260206004820152602c60248201527f53656c6c206c696d6974206d757374206e6f74206265206c657373207468616e60448201526b203235304d20746f6b656e7360a01b60648201526084016114c8565b600855565b600080546001600160a01b031633146116b157602854600160481b900460ff166116b15760405162461bcd60e51b815260206004820152601e60248201527f4c697175696420686173206e6f74206265656e2061646465642079657421000060448201526064016114c8565b336000818152600e602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060015b92915050565b6000546001600160a01b031633146117405760405162461bcd60e51b81526004016114c8906154e9565b60288054911515620100000262ff000019909216919091179055565b6002600154141561177f5760405162461bcd60e51b81526004016114c890615509565b60026001556040516370a0823160e01b815233600482015260009030906370a082319060240160206040518083038186803b1580156117bd57600080fd5b505afa1580156117d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f59190615540565b602854604051630a5b654b60e11b8152919250600160581b90046001600160a01b0316906314b6ca969061182f9033908590600401615559565b600060405180830381600087803b15801561184957600080fd5b505af115801561185d573d6000803e3d6000fd5b505060018055505050565b602854604051630958a1f960e01b81526001600160a01b038381166004830152600092600160581b90041690630958a1f9906024015b60206040518083038186803b1580156118b657600080fd5b505afa1580156118ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190615540565b6000546001600160a01b031633146119185760405162461bcd60e51b81526004016114c8906154e9565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb906119469085908590600401615559565b602060405180830381600087803b15801561196057600080fd5b505af1158015611974573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119989190615572565b50505050565b60006028600b9054906101000a90046001600160a01b03166001600160a01b0316634ff3dff56040518163ffffffff1660e01b815260040160206040518083038186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a269190615540565b905090565b6000546001600160a01b03163314611a555760405162461bcd60e51b81526004016114c8906154e9565b6028600b9054906101000a90046001600160a01b03166001600160a01b03166320c9f5fc306001600160a01b0316316040518263ffffffff1660e01b81526004016000604051808303818588803b158015611aaf57600080fd5b505af1158015611ac3573d6000803e3d6000fd5b5050505050565b6000546001600160a01b03163314611af45760405162461bcd60e51b81526004016114c8906154e9565b6003546001600160a01b03848116911614801590611b2057506004546001600160a01b03848116911614155b8015611b3a57506026546001600160a01b03848116911614155b611b9a5760405162461bcd60e51b815260206004820152602b60248201527f506c6561736520696e70757420612076616c696420746f6b656e20636f6e747260448201526a616374206164647265737360a81b60648201526084016114c8565b611ba383613c78565b611bfd5760405162461bcd60e51b815260206004820152602560248201527f506c6561736520696e70757420616e2061637475616c20746f6b656e20636f6e6044820152641d1c9858dd60da1b60648201526084016114c8565b6001600160a01b0383166000908152600c602052604090205460ff1615611c965760405162461bcd60e51b815260206004820152604160248201527f436f6e747261637420616c72656164792061646465642e20546f206368616e6760448201527f6520706172616d657465727320706c656173652072656d6f76652066697273746064820152601760f91b608482015260a4016114c8565b60008211611cf15760405162461bcd60e51b815260206004820152602260248201527f4d696e20686f6c64206d7573742062652067726561746572207468616e207a65604482015261726f60f01b60648201526084016114c8565b601754811115611d555760405162461bcd60e51b815260206004820152602960248201527f446973636f756e742063616e6e6f742062652067726561746572207468616e206044820152680e8dee8c2d840e8c2f60bb1b60648201526084016114c8565b600b80546000908152600a6020908152604080832080546001600160a01b039098166001600160a01b0319988916811782556001808301989098556002820196909655600301805460ff199081168817909155858452600c909252822080549091168517905581549384018255527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99091018054909216179055565b600080546001600160a01b03163314611e1c5760405162461bcd60e51b81526004016114c8906154e9565b6003546117109030906001600160a01b031684613cb4565b6001600160a01b0383166000908152600e6020908152604080832033845290915281205460001914611ee1576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600e82528381203382529091529190912054611ebc918490613d9a565b6001600160a01b0385166000908152600e602090815260408083203384529091529020555b611eec848484613dd4565b90505b9392505050565b6000546001600160a01b03163314611f205760405162461bcd60e51b81526004016114c8906154e9565b62278d00811015611fa95760405162461bcd60e51b815260206004820152604760248201527f486f6c6465722073686f756c642068617665206d696e696d756d20333020646160448201527f79732028323539323030302920746f20776974686472617720756e636c61696d6064820152666564206469767360c81b608482015260a4016114c8565b60285460405163352e051560e11b815260048101839052600160581b9091046001600160a01b031690636a5c0a2a906024015b600060405180830381600087803b158015611aaf57600080fd5b6000546001600160a01b031633146120205760405162461bcd60e51b81526004016114c8906154e9565b6028600b9054906101000a90046001600160a01b03166001600160a01b0316631b51972c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561207057600080fd5b505af1158015611998573d6000803e3d6000fd5b6000818152600a6020526040808220805482516306fdde0360e01b815292516060948594909384938493849384939284926001600160a01b03909116916306fdde039160048083019286929190829003018186803b1580156120e557600080fd5b505afa1580156120f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261212191908101906155d6565b905060008260000160009054906101000a90046001600160a01b03166001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561217557600080fd5b505afa158015612189573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121b191908101906155d6565b905060008360000160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561220557600080fd5b505afa158015612219573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223d919061566a565b845460018601546002870154600390970154959f949e50919c506001600160a01b03169a50985092965060ff909116945092505050565b6004546001600160a01b03166000908152600d6020526040812054611a26906003546001600160a01b03166000908152600d60205260409020546122bb9060065490614231565b90614231565b6000546001600160a01b031633146122eb5760405162461bcd60e51b81526004016114c8906154e9565b6028805468ff000000000000000019169055565b600260015414156123225760405162461bcd60e51b81526004016114c890615509565b6002600155602854601c54604051631c35e02d60e11b81523360048201526001600160a01b03918216602482015260448101849052600160581b909204169063386bc05a9060640161182f565b6000546001600160a01b031633146123995760405162461bcd60e51b81526004016114c8906154e9565b6001600160a01b0382166000908152601260205260409020805460ff19168215151790556123c78282614273565b5050565b6000546001600160a01b031633146123f55760405162461bcd60e51b81526004016114c8906154e9565b600081116124625760405162461bcd60e51b815260206004820152603460248201527f6d696e696d756d20646973747269627574696f6e206c6576656c206d7573742060448201527362652067726561746572207468616e207a65726f60601b60648201526084016114c8565b602854604051634c72dff760e11b815260048101839052600160581b9091046001600160a01b0316906398e5bfee90602401611fdc565b6000546001600160a01b031633146124c35760405162461bcd60e51b81526004016114c8906154e9565b6004546001600160a01b03858116911614156125315760405162461bcd60e51b815260206004820152602760248201527f436861726974792077616c6c6574206d757374206e6f74206265207a65726f206044820152666164647265737360c81b60648201526084016114c8565b6004546001600160a01b038481169116141561259d5760405162461bcd60e51b815260206004820152602560248201527f41646d696e2077616c6c6574206d757374206e6f74206265207a65726f206164604482015264647265737360d81b60648201526084016114c8565b6004546001600160a01b038381169116141561260e5760405162461bcd60e51b815260206004820152602a60248201527f4e4654207265776172642077616c6c6574206d757374206e6f74206265207a65604482015269726f206164647265737360b01b60648201526084016114c8565b6004546001600160a01b038281169116141561267e5760405162461bcd60e51b815260206004820152602960248201527f5374616b65706f6f6c2077616c6c6574206d757374206e6f74206265207a65726044820152686f206164647265737360b81b60648201526084016114c8565b6003546001600160a01b03858116911614156126ec5760405162461bcd60e51b815260206004820152602760248201527f436861726974792077616c6c6574206d757374206e6f742062652064656164206044820152666164647265737360c81b60648201526084016114c8565b6003546001600160a01b03848116911614156127585760405162461bcd60e51b815260206004820152602560248201527f41646d696e2077616c6c6574206d757374206e6f742062652064656164206164604482015264647265737360d81b60648201526084016114c8565b6003546001600160a01b03838116911614156127c95760405162461bcd60e51b815260206004820152602a60248201527f4e4654207265776172642077616c6c6574206d757374206e6f742062652064656044820152696164206164647265737360b01b60648201526084016114c8565b6003546001600160a01b03828116911614156128395760405162461bcd60e51b815260206004820152602960248201527f5374616b65706f6f6c2077616c6c6574206d757374206e6f742062652064656160448201526864206164647265737360b81b60648201526084016114c8565b601c80546001600160a01b03199081166001600160a01b0396871617909155601e8054821693861693909317909255601d8054831693851693909317909255601f805490911691909216179055565b6000546001600160a01b031633146128b25760405162461bcd60e51b81526004016114c8906154e9565b602854600160401b900460ff16156129165760405162461bcd60e51b815260206004820152602160248201527f506c656173652064697361626c652061697264726f70206d6f646520666972736044820152601d60fa1b60648201526084016114c8565b6028805469ff0000000000000000001916600160481b179055565b6000546001600160a01b0316331461295b5760405162461bcd60e51b81526004016114c8906154e9565b60288054911515650100000000000265ff000000000019909216919091179055565b6060806028600b9054906101000a90046001600160a01b03166001600160a01b03166346100e4a6040518163ffffffff1660e01b815260040160006040518083038186803b1580156129ce57600080fd5b505afa1580156129e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a0a919081019061571c565b915091509091565b6000546001600160a01b03163314612a3c5760405162461bcd60e51b81526004016114c8906154e9565b602580546001600160a01b0319166001600160a01b0392909216919091179055565b60026001541415612a815760405162461bcd60e51b81526004016114c890615509565b60026001556028546040516335027f1960e01b8152600160581b9091046001600160a01b0316906335027f199061182f9033908590600401615559565b600061171082600019611645565b6000546001600160a01b03163314612af65760405162461bcd60e51b81526004016114c8906154e9565b60025460408051630d0e30db60e41b815290516001600160a01b039092169163d0e30db091303191600480830192600092919082900301818588803b158015611aaf57600080fd5b6000546001600160a01b03163314612b685760405162461bcd60e51b81526004016114c8906154e9565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314612bbd5760405162461bcd60e51b81526004016114c8906154e9565b6064811115612c345760405162461bcd60e51b815260206004820152603760248201527f546f74616c20466565206d757374206265206265747765656e203020616e642060448201527f3130302028313030203d2074656e2070657263656e742900000000000000000060648201526084016114c8565b601755565b6000546001600160a01b03163314612c635760405162461bcd60e51b81526004016114c8906154e9565b601a54612c71906004614355565b811115612cd05760405162461bcd60e51b815260206004820152602760248201527f74617820726174696f2063616e6e6f74206265206d6f7265207468616e2032356044820152663020283235252960c81b60648201526084016114c8565b601655565b6000546001600160a01b03163314612cff5760405162461bcd60e51b81526004016114c8906154e9565b600755565b6000546001600160a01b03163314612d2e5760405162461bcd60e51b81526004016114c8906154e9565b60288054911515600160301b0266ff00000000000019909216919091179055565b6000546001600160a01b03163314612d795760405162461bcd60e51b81526004016114c8906154e9565b601654612d87906002614355565b811115612df55760405162461bcd60e51b815260206004820152603660248201527f6275726e20726174696f2063616e6e6f74206265206d6f7265207468616e203560448201527506040e0cae4c6cadce840decc40e8dee8c2d840e8c2f60531b60648201526084016114c8565b601455565b60285460405163051fa63360e31b81526001600160a01b038381166004830152600092600160581b900416906328fd31989060240161189e565b6000546001600160a01b03163314612e5e5760405162461bcd60e51b81526004016114c8906154e9565b602880549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314612ea25760405162461bcd60e51b81526004016114c8906154e9565b60648111158015612eb4575060018110155b612f0e5760405162461bcd60e51b815260206004820152602560248201527f666565206c696d69746572206d757374206265206265747765656e203120616e604482015264064203130360dc1b60648201526084016114c8565b601955565b6000546001600160a01b03163314612f3d5760405162461bcd60e51b81526004016114c8906154e9565b6703782dace9d90000811015612fac5760405162461bcd60e51b815260206004820152602e60248201527f57616c6c6574206c696d6974206d757374206e6f74206265206c65737320746860448201526d616e203235304d20746f6b656e7360901b60648201526084016114c8565b600955565b6000546001600160a01b03163314612fdb5760405162461bcd60e51b81526004016114c8906154e9565b60285460295460405163aa60e73360e01b81526004810191909152600160581b9091046001600160a01b03169063aa60e73390602401600060405180830381600087803b15801561302b57600080fd5b505af192505050801561303c575060015b50565b6000546001600160a01b031633146130695760405162461bcd60e51b81526004016114c8906154e9565b600082116130895760405162461bcd60e51b81526004016114c8906157e1565b600081116130a95760405162461bcd60e51b81526004016114c8906157e1565b6028546040516349465b8360e11b81526004810184905260248101839052600160581b9091046001600160a01b03169063928cb706906044015b600060405180830381600087803b1580156130fd57600080fd5b505af1158015613111573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146131435760405162461bcd60e51b81526004016114c8906154e9565b600b5480156123c75760005b81811015613379576000818152600a6020526040902080546001600160a01b0385811691161415613368578282141561320b5760045481546001600160a01b0319166001600160a01b039182161782556000600183018190556002830181905560038301805460ff199081169091559186168152600c6020526040902080549091169055600b8054806131e4576131e4615824565b600082815260209020810160001990810180546001600160a01b0319169055019055613368565b6000600a60006001600b805490506132239190615850565b815260208082019290925260409081016000908120805486546001600160a01b03199081166001600160a01b03928316178855600180840180548a83015560028086018054918c01919091556003808c01805460ff1990811686179091558f87168952600c909a5297872080548a169055600454865490941693909416929092178455908490559290559182018054909316909255600b8054919350916132c991615850565b815481106132d9576132d9615867565b600091825260209091200154600b80546001600160a01b03909216918590811061330557613305615867565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600b80548061334457613344615824565b600082815260209020810160001990810180546001600160a01b0319169055019055505b506133728161587d565b905061314f565b505050565b6000611eef338484613dd4565b60006028600b9054906101000a90046001600160a01b03166001600160a01b031663162db73f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133db57600080fd5b505afa1580156133ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a269190615898565b60006028600b9054906101000a90046001600160a01b03166001600160a01b0316631b57ef7d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119ee57600080fd5b6000546001600160a01b0316331461348d5760405162461bcd60e51b81526004016114c8906154e9565b602880549115156401000000000264ff0000000019909216919091179055565b6000546001600160a01b031633146134d75760405162461bcd60e51b81526004016114c8906154e9565b60285460405163151396ff60e01b81526001600160a01b038581166004830152848116602483015260448201849052600160581b9092049091169063151396ff90606401600060405180830381600087803b15801561353557600080fd5b505af1158015613549573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b0316331461357c5760405162461bcd60e51b81526004016114c8906154e9565b6000821161359c5760405162461bcd60e51b81526004016114c8906157e1565b600081116135bc5760405162461bcd60e51b81526004016114c8906157e1565b602991909155602a55565b6000546001600160a01b031633146135f15760405162461bcd60e51b81526004016114c8906154e9565b600081116136415760405162461bcd60e51b815260206004820152601f60248201527f426c6f636b732073686f756c642062652067726561746572207468616e20300060448201526064016114c8565b601355565b600260015414156136695760405162461bcd60e51b81526004016114c890615509565b6002600155602854604051633900720360e21b81523360048201526024810184905260448101839052600160581b9091046001600160a01b03169063e401c80c90606401600060405180830381600087803b1580156136c757600080fd5b505af11580156136db573d6000803e3d6000fd5b50506001805550505050565b6000546001600160a01b031633146137115760405162461bcd60e51b81526004016114c8906154e9565b601855565b602854604051630da3ab3560e31b81526001600160a01b0383811660048301526000928392839283928392600160581b90910490911690636d1d59a89060240160a06040518083038186803b15801561376e57600080fd5b505afa158015613782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a691906158b5565b939a9299509097509550909350915050565b602854604051633b1eaf3160e01b81526001600160a01b038381166004830152600092600160581b90041690633b1eaf319060240161189e565b6000546001600160a01b0316331461381c5760405162461bcd60e51b81526004016114c8906154e9565b60288054911515600160381b0267ff0000000000000019909216919091179055565b6000546001600160a01b031633146138685760405162461bcd60e51b81526004016114c8906154e9565b6028805460ff191692151592909217909155602c55565b60008060008060008060006028600b9054906101000a90046001600160a01b03166001600160a01b031663c11df1d76040518163ffffffff1660e01b815260040160e06040518083038186803b1580156138d857600080fd5b505afa1580156138ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139109190615902565b959d949c50929a50909850965094509092509050565b6000546001600160a01b031633146139505760405162461bcd60e51b81526004016114c8906154e9565b60165461395e906002614355565b8111156139d35760405162461bcd60e51b815260206004820152603b60248201527f7374616b65706f6f6c20726174696f2063616e6e6f74206265206d6f7265207460448201527f68616e2035302070657263656e74206f6620746f74616c20746178000000000060648201526084016114c8565b601555565b6000436013546027546139eb9190615956565b1015806139f55750815b15613a0857601a54611710906001614231565b505060175490565b6000546001600160a01b03163314613a3a5760405162461bcd60e51b81526004016114c8906154e9565b60405133908190303180156108fc02916000818181858888f193505050501580156123c7573d6000803e3d6000fd5b6000546001600160a01b03163314613a935760405162461bcd60e51b81526004016114c8906154e9565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b6000546001600160a01b03163314613b115760405162461bcd60e51b81526004016114c8906154e9565b6028600b9054906101000a90046001600160a01b03166001600160a01b03166324cc72a2306001600160a01b0316316040518263ffffffff1660e01b81526004016000604051808303818588803b158015611aaf57600080fd5b6000546001600160a01b03163314613b955760405162461bcd60e51b81526004016114c8906154e9565b6123c78282614273565b6000546001600160a01b03163314613bc95760405162461bcd60e51b81526004016114c8906154e9565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314613c1e5760405162461bcd60e51b81526004016114c8906154e9565b6028600b9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0306001600160a01b0316316040518263ffffffff1660e01b81526004016000604051808303818588803b158015611aaf57600080fd5b60007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470823f8015801590613cac5750818114155b949350505050565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600d90915291822054613d05918490613d9a565b6001600160a01b038086166000908152600d60205260408082209390935590851681522054613d349083614397565b6001600160a01b038085166000818152600d602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613d889086815260200190565b60405180910390a35060019392505050565b60008184841115613dbe5760405162461bcd60e51b81526004016114c8919061520f565b506000613dcb8486615850565b95945050505050565b6000808211613e355760405162461bcd60e51b815260206004820152602760248201527f496e73756666696369656e7420416d6f756e743a2063616e6e6f742073656e646044820152662030204b4f4a4960c81b60648201526084016114c8565b602854600160401b900460ff1615613e5957613e52848484613cb4565b9050611eef565b602854600160501b900460ff1615613e7657613e52848484613cb4565b613e818484846143f6565b6026546001600160a01b0384811691161415613eac57613e9f6144fd565b15613eac57613eac614553565b602754158015613ec957506026546001600160a01b038481169116145b15613ef9576001600160a01b0384166000908152600d6020526040902054613ef057600080fd5b613ef943602755565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0387166000908152600d9091529190912054613f4b918490613d9a565b6001600160a01b0385166000908152600d6020908152604080832093909355600f90529081205460ff16158015613f9b57506001600160a01b0384166000908152600f602052604090205460ff16155b613fa55782613fb0565b613fb0858585614d71565b6026549091506001600160a01b03858116911614801590613fea57506001600160a01b03841660009081526010602052604090205460ff16155b15614071576001600160a01b0384166000908152600d60205260409020546009546140158383615956565b111561406f5760405162461bcd60e51b815260206004820152602360248201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152621d5b9d60ea1b60648201526084016114c8565b505b6001600160a01b0384166000908152600d60205260409020546140949082614397565b6001600160a01b038086166000908152600d602090815260408083209490945591881681526011909152205460ff16614140576028546001600160a01b038681166000908152600d602052604090819020549051630a5b654b60e11b8152600160581b909304909116916314b6ca969161411391899190600401615559565b600060405180830381600087803b15801561412d57600080fd5b505af192505050801561413e575060015b505b6001600160a01b03841660009081526011602052604090205460ff166141d9576028546001600160a01b038581166000908152600d602052604090819020549051630a5b654b60e11b8152600160581b909304909116916314b6ca96916141ac91889190600401615559565b600060405180830381600087803b1580156141c657600080fd5b505af19250505080156141d7575060015b505b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161421e91815260200190565b60405180910390a3506001949350505050565b6000611eef83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613d9a565b6001600160a01b038216301480159061429a57506026546001600160a01b03838116911614155b6142a357600080fd5b6001600160a01b0382166000908152601160205260409020805460ff1916821580159190911790915561430957602854604051630a5b654b60e11b8152600160581b9091046001600160a01b0316906314b6ca96906130e3908590600090600401615559565b6028546001600160a01b038381166000908152600d602052604090819020549051630a5b654b60e11b8152600160581b909304909116916314b6ca96916130e391869190600401615559565b6000611eef83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506150bd565b6000806143a48385615956565b905083811015611eef5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016114c8565b6026546001600160a01b0384811691161415614479576007548111158061443557506001600160a01b03821660009081526010602052604090205460ff165b6144795760405162461bcd60e51b8152602060048201526015602482015274109d5e48151608131a5b5a5d08115e18d959591959605a1b60448201526064016114c8565b6026546001600160a01b038381169116141561337957600854811115806144b857506001600160a01b03831660009081526010602052604090205460ff165b6133795760405162461bcd60e51b815260206004820152601660248201527514d95b1b08151608131a5b5a5d08115e18d95959195960521b60448201526064016114c8565b6026546000906001600160a01b031633148015906145255750602854600160501b900460ff16155b8015614533575060285460ff165b8015611a26575050602c54306000908152600d6020526040902054101590565b6028805460ff60501b1916600160501b1790556040516370a0823160e01b815230600482018190526000916370a082319060240160206040518083038186803b15801561459f57600080fd5b505afa1580156145b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145d79190615540565b905060006145fc601a546145f6601454856150eb90919063ffffffff16565b90614355565b60035460405163a9059cbb60e01b8152919250309163a9059cbb91614631916001600160a01b03909116908590600401615559565b602060405180830381600087803b15801561464b57600080fd5b505af115801561465f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146839190615572565b50602854610100900460ff16156147675760006146b1601a546145f6601554866150eb90919063ffffffff16565b90506146bd8382614231565b601f5460405163a9059cbb60e01b8152919450309163a9059cbb916146f2916001600160a01b03909116908590600401615559565b602060405180830381600087803b15801561470c57600080fd5b505af1158015614720573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147449190615572565b506023546147529082614397565b60235561475f8383614231565b925050614774565b6147718282614231565b91505b60408051600280825260608201835260009260208301908036833701905050905030816000815181106147a9576147a9615867565b6001600160a01b0392831660209182029290920101526002548251911690829060019081106147da576147da615867565b6001600160a01b039092166020928302919091019091015260285430319060ff65010000000000909104161561492a576002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561484e57600080fd5b505afa158015614862573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148869190615540565b905080156149285760025460265460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb926148c4929116908590600401615559565b602060405180830381600087803b1580156148de57600080fd5b505af11580156148f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149169190615572565b50601b546149249082614397565b601b555b505b60245460405163791ac94760e01b81526001600160a01b039091169063791ac9479061496390879060009087903090429060040161596e565b600060405180830381600087803b15801561497d57600080fd5b505af1158015614991573d6000803e3d6000fd5b50600092506149a4915050303183614231565b905060006149c3601a546145f6601654856150eb90919063ffffffff16565b602854909150819081908190600090819062010000900460ff1615614ac85750846149f6816122bb868187818d8c614231565b601e54602a546040519294506000926001600160a01b0390921691849084818181858888f193505050503d8060008114614a4c576040519150601f19603f3d011682016040523d82523d6000602084013e614a51565b606091505b5050905080614ab25760405162461bcd60e51b815260206004820152602760248201527f4e4654207265776172642077616c6c65742072656a656374656420424e4220746044820152663930b739b332b960c91b60648201526084016114c8565b602254614abf9083614397565b60225550614adb565b614ad8846122bb85818b8a614231565b91505b6028546301000000900460ff1615614b51576028600b9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015614b3d57600080fd5b505af193505050508015614b4f575060015b505b602854640100000000900460ff1615614cee57601c54602a546040516000926001600160a01b03169190889084818181858888f193505050503d8060008114614bb6576040519150601f19603f3d011682016040523d82523d6000602084013e614bbb565b606091505b5050905080614c185760405162461bcd60e51b8152602060048201526024808201527f436861726974792077616c6c65742072656a656374656420424e42207472616e60448201526339b332b960e11b60648201526084016114c8565b602054614c259087614397565b602055601d54602a546040516000926001600160a01b03169190889084818181858888f193505050503d8060008114614c7a576040519150601f19603f3d011682016040523d82523d6000602084013e614c7f565b606091505b5050905080614cdb5760405162461bcd60e51b815260206004820152602260248201527f41646d696e2077616c6c65742072656a656374656420424e42207472616e736660448201526132b960f11b60648201526084016114c8565b602154614ce89087614397565b60215550505b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015614d3e57600080fd5b505af1158015614d52573d6000803e3d6000fd5b50506028805460ff60501b191690555050505050505050505050505050565b6001600160a01b03831660009081526012602052604081205481908190614d9a9060ff166139d8565b602854909150600090600160301b900460ff168015614dc757506026546001600160a01b03878116911614155b8015614de057506026546001600160a01b038881169116145b15614eba57600b5460005b818111614eb7576000818152600a60205260409020600381015460ff1615614ea657600181015481546040516370a0823160e01b81526001600160a01b038c81166004830152909116906370a082319060240160206040518083038186803b158015614e5657600080fd5b505afa158015614e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e8e9190615540565b10614ea6576002810154614ea3908590614397565b93505b50614eb08161587d565b9050614deb565b50505b602854600160381b900460ff168015614ee157506026546001600160a01b03878116911614155b8015614efa57506026546001600160a01b038881169116145b15614fb557602554604051630f39254f60e41b8152600481018790526000916001600160a01b03169063f39254f090602401602060405180830381600087803b158015614f4657600080fd5b505af1158015614f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f7e9190615540565b9050614f8e816305f5e100614355565b9050614fa56018548261439790919063ffffffff16565b9050614fb18282614397565b9150505b80614fd257601a54614fcb906145f687856150eb565b9250615035565b614fec60646145f6601954856150eb90919063ffffffff16565b8111156150145761500d60646145f6601954856150eb90919063ffffffff16565b9050615021565b61501e8282614231565b90505b601a54615032906145f687846150eb565b92505b306000908152600d602052604090205461504f9084614397565b306000818152600d6020526040908190209290925590516001600160a01b038916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906150a09087815260200190565b60405180910390a36150b28584614231565b979650505050505050565b600081836150de5760405162461bcd60e51b81526004016114c8919061520f565b506000613dcb84866159aa565b6000826150fa57506000611710565b600061510683856159cc565b90508261511385836159aa565b14611eef5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016114c8565b801515811461303c57600080fd5b60006020828403121561518a57600080fd5b8135611eef8161516a565b600080604083850312156151a857600080fd5b50508035926020909101359150565b60005b838110156151d25781810151838201526020016151ba565b838111156119985750506000910152565b600081518084526151fb8160208601602086016151b7565b601f01601f19169290920160200192915050565b602081526000611eef60208301846151e3565b60006020828403121561523457600080fd5b5035919050565b6001600160a01b038116811461303c57600080fd5b6000806040838503121561526357600080fd5b823561526e8161523b565b946020939093013593505050565b60006020828403121561528e57600080fd5b8135611eef8161523b565b6000806000606084860312156152ae57600080fd5b83356152b98161523b565b925060208401356152c98161523b565b929592945050506040919091013590565b6000806000606084860312156152ef57600080fd5b83356152fa8161523b565b95602085013595506040909401359392505050565b60e08152600061532260e083018a6151e3565b8281036020840152615334818a6151e3565b60ff98909816604084015250506001600160a01b03949094166060850152608084019290925260a0830152151560c09091015292915050565b6000806040838503121561538057600080fd5b823561538b8161523b565b9150602083013561539b8161516a565b809150509250929050565b600080600080608085870312156153bc57600080fd5b84356153c78161523b565b935060208501356153d78161523b565b925060408501356153e78161523b565b915060608501356153f78161523b565b939692955090935050565b600081518084526020808501945080840160005b8381101561543b5781516001600160a01b031687529582019590820190600101615416565b509495945050505050565b6040815260006154596040830185615402565b82810360208481019190915284518083528582019282019060005b8181101561549057845183529383019391830191600101615474565b5090979650505050505050565b600080604083850312156154b057600080fd5b82356154bb8161523b565b9150602083013561539b8161523b565b600080604083850312156154de57600080fd5b823561526e8161516a565b60208082526006908201526510a7bbb732b960d11b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006020828403121561555257600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561558457600080fd5b8151611eef8161516a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156155ce576155ce61558f565b604052919050565b6000602082840312156155e857600080fd5b815167ffffffffffffffff8082111561560057600080fd5b818401915084601f83011261561457600080fd5b8151818111156156265761562661558f565b615639601f8201601f19166020016155a5565b915080825285602082850101111561565057600080fd5b6156618160208401602086016151b7565b50949350505050565b60006020828403121561567c57600080fd5b815160ff81168114611eef57600080fd5b600067ffffffffffffffff8211156156a7576156a761558f565b5060051b60200190565b600082601f8301126156c257600080fd5b815160206156d76156d28361568d565b6155a5565b82815260059290921b840181019181810190868411156156f657600080fd5b8286015b8481101561571157805183529183019183016156fa565b509695505050505050565b6000806040838503121561572f57600080fd5b825167ffffffffffffffff8082111561574757600080fd5b818501915085601f83011261575b57600080fd5b8151602061576b6156d28361568d565b82815260059290921b8401810191818101908984111561578a57600080fd5b948201945b838610156157b15785516157a28161523b565b8252948201949082019061578f565b918801519196509093505050808211156157ca57600080fd5b506157d7858286016156b1565b9150509250929050565b60208082526023908201527f6469737472696275746f722063616e6e6f7420626520657175616c20746f207a60408201526265726f60e81b606082015260800190565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156158625761586261583a565b500390565b634e487b7160e01b600052603260045260246000fd5b60006000198214156158915761589161583a565b5060010190565b6000602082840312156158aa57600080fd5b8151611eef8161523b565b600080600080600060a086880312156158cd57600080fd5b8551945060208601519350604086015192506060860151915060808601516158f48161516a565b809150509295509295909350565b600080600080600080600060e0888a03121561591d57600080fd5b5050855160208701516040880151606089015160808a015160a08b015160c0909b0151949c939b50919990985090965094509092509050565b600082198211156159695761596961583a565b500190565b85815284602082015260a06040820152600061598d60a0830186615402565b6001600160a01b0394909416606083015250608001529392505050565b6000826159c757634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156159e6576159e661583a565b50029056fea2646970667358221220f765f0b9da2da770d6257de600d125a2a72610af9421d4529ed376c59cebe26464736f6c6343000809003360806040526ec097ce7bc90715b34b9f1000000000601555619c406017556206ddd060185562278d0060195566038d7ea4c68000601a556658d15e17628000601b553480156200004e57600080fd5b5060405162002804380380620028048339810160408190526200007191620001aa565b6001600160a01b0382166200009b577310ed43c718714eb63d5aa57b78b54704e256024e6200009d565b815b600280546001600160a01b039283166001600160a01b0319918216811790925560008054821633179055600180549385169390911692909217909155604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905163ad5c464891600480820192602092909190829003018186803b1580156200012957600080fd5b505afa1580156200013e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001649190620001e2565b600380546001600160a01b0319166001600160a01b039290921691909117905550620002079050565b80516001600160a01b0381168114620001a557600080fd5b919050565b60008060408385031215620001be57600080fd5b620001c9836200018d565b9150620001d9602084016200018d565b90509250929050565b600060208284031215620001f557600080fd5b62000200826200018d565b9392505050565b6125ed80620002176000396000f3fe6080604052600436106102245760003560e01c80634fab0ae811610123578063aa60e733116100ab578063d87db7521161006f578063d87db75214610692578063e2b2782d146106bf578063e2d2e219146106df578063e401c80c146106f5578063efca2eed1461071557600080fd5b8063aa60e733146105b0578063c11df1d7146105d0578063ce7c2ac214610627578063d0e30db014610674578063d627ab791461067c57600080fd5b8063928cb706116100f2578063928cb7061461052e57806398e5bfee1461054e578063997664d71461056e578063a7c3799214610584578063aa37d6101461059a57600080fd5b80634fab0ae8146104605780634ff3dff5146104765780636a5c0a2a1461048b5780636d1d59a8146104ab57600080fd5b806320ffe2fd116101b1578063386bc05a11610175578063386bc05a146103b85780633a98ef39146103d85780633b1eaf31146103ee57806346100e4a146104275780634b3197131461044a57600080fd5b806320ffe2fd1461033a57806324cc72a21461035a57806327c95e201461036257806328fd31981461037857806335027f191461039857600080fd5b8063151396ff116101f8578063151396ff146102c0578063162db73f146102e05780631b51972c146103085780631b57ef7d1461031d57806320c9f5fc1461033257600080fd5b8062b37044146102295780630958a1f91461025257806311ce023d1461028857806314b6ca961461029e575b600080fd5b34801561023557600080fd5b5061023f600f5481565b6040519081526020015b60405180910390f35b34801561025e57600080fd5b5061023f61026d366004612244565b6001600160a01b031660009081526009602052604090205490565b34801561029457600080fd5b5061023f60155481565b3480156102aa57600080fd5b506102be6102b936600461225f565b61072b565b005b3480156102cc57600080fd5b506102be6102db366004612289565b610a14565b3480156102ec57600080fd5b506001546040516001600160a01b039091168152602001610249565b34801561031457600080fd5b506102be610ab3565b34801561032957600080fd5b50601b5461023f565b6102be610b0c565b34801561034657600080fd5b506102be610355366004612244565b610b25565b6102be610b90565b34801561036e57600080fd5b5061023f60105481565b34801561038457600080fd5b5061023f610393366004612244565b610bcc565b3480156103a457600080fd5b506102be6103b336600461225f565b610c55565b3480156103c457600080fd5b506102be6103d3366004612289565b610e89565b3480156103e457600080fd5b5061023f60115481565b3480156103fa57600080fd5b5061023f610409366004612244565b6001600160a01b03166000908152600a602052604090206001015490565b34801561043357600080fd5b5061043c6110cf565b604051610249929190612309565b34801561045657600080fd5b5061023f600d5481565b34801561046c57600080fd5b5061023f601a5481565b34801561048257600080fd5b50601a5461023f565b34801561049757600080fd5b506102be6104a6366004612360565b611249565b3480156104b757600080fd5b506105046104c6366004612244565b6001600160a01b03166000908152600a602052604090208054600182015460038301546002840154600490940154929491939092909160ff90911690565b6040805195865260208601949094529284019190915260608301521515608082015260a001610249565b34801561053a57600080fd5b506102be610549366004612379565b611265565b34801561055a57600080fd5b506102be610569366004612360565b611287565b34801561057a57600080fd5b5061023f60125481565b34801561059057600080fd5b5061023f60195481565b3480156105a657600080fd5b5061023f600e5481565b3480156105bc57600080fd5b506102be6105cb366004612360565b6112a3565b3480156105dc57600080fd5b50601154601054601354600e54600d54600f54601254604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610249565b34801561063357600080fd5b50610504610642366004612244565b600a60205260009081526040902080546001820154600283015460038401546004909401549293919290919060ff1685565b6102be611458565b34801561068857600080fd5b5061023f601b5481565b34801561069e57600080fd5b5061023f6106ad366004612244565b60096020526000908152604090205481565b3480156106cb57600080fd5b506102be6106da366004612379565b6114bc565b3480156106eb57600080fd5b5061023f60145481565b34801561070157600080fd5b506102be61071036600461239b565b611670565b34801561072157600080fd5b5061023f60135481565b6000546001600160a01b0316331461074257600080fd5b6001600160a01b0382166000908152600a6020526040902054156107ab5761078e61076c83610bcc565b6001600160a01b0384166000908152600a6020526040902060010154906118cd565b6001600160a01b0383166000908152600a60205260409020600101555b6000811180156107d157506001600160a01b0382166000908152600a6020526040902054155b1561080e57601b548110610809576107e882611935565b6001600160a01b03821660009081526009602052604090206402540be3ff90555b6108a5565b8015801561083357506001600160a01b0382166000908152600a602052604090205415155b156108a5576001600160a01b0382166000908152600a60205260409020600190810154148061087b57506001600160a01b0382166000908152600a6020526040902060010154155b1561088957610809826119ce565b6001600160a01b03821660009081526009602052604090204290555b6001600160a01b0382166000908152600a6020526040902060040154601b5460ff90911690821061095c578061092b576001600160a01b0383166000908152600a60205260409020600401805460ff1916600117905560115461090890836118cd565b6011556001600160a01b0383166000908152600a602052604090208290556109ce565b6001600160a01b0383166000908152600a602052604090205460115461090891849161095691611b05565b906118cd565b80156109b4576001600160a01b0383166000908152600a6020526040902060048101805460ff191690555460115461099391611b05565b6011556001600160a01b0383166000908152600a60205260408120556109ce565b6001600160a01b0383166000908152600a60205260408120555b6001600160a01b0383166000908152600a60205260409020546109f090611b47565b6001600160a01b039093166000908152600a60205260409020600201929092555050565b6000546001600160a01b03163314610a2b57600080fd5b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b158015610a7557600080fd5b505af1158015610a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aad91906123ce565b50505050565b6000546001600160a01b03163314610aca57600080fd5b600080546040516001600160a01b03909116918291303180156108fc0292909190818181858888f19350505050158015610b08573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610b2357600080fd5b565b6000546001600160a01b03163314610b3c57600080fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f8f14af6e51856288e65b250dbddfce7be3cf8785fae01f7498d98a6765a02c849060200160405180910390a150565b6000546001600160a01b03163314610ba757600080fd5b6010543490610bb690826118cd565b601055601254610bc690826118cd565b60125550565b6001600160a01b0381166000908152600a6020526040812054610bf157506000919050565b6001600160a01b0382166000908152600a6020526040812054610c1390611b47565b6001600160a01b0384166000908152600a6020526040902060020154909150808211610c43575060009392505050565b610c4d8282611b05565b949350505050565b6000546001600160a01b03163314610c6c57600080fd5b60198110158015610c7e575060648111155b610ce65760405162461bcd60e51b815260206004820152602e60248201527f50657263656e74206f66207769746864726177616c206973206f75747369646560448201526d206f6620706172616d657465727360901b60648201526084015b60405180910390fd5b6000610d16610cf484610bcc565b6001600160a01b0385166000908152600a6020526040902060010154906118cd565b90506000610d2f6064610d298486611b64565b90611be3565b90508015610aad57610d42816001611b05565b601354909150610d5290826118cd565b6013556017546040516000916001600160a01b03871691849084818181858888f193505050503d8060008114610da4576040519150601f19603f3d011682016040523d82523d6000602084013e610da9565b606091505b5050905080610dca5760405162461bcd60e51b8152600401610cdd906123f0565b6001600160a01b0385166000908152600760205260409020429055610def8383611b05565b6001600160a01b0386166000908152600a60205260409020600181019190915554610e1990611b47565b6001600160a01b0386166000908152600a60205260409020600281019190915560030154610e4790836118cd565b6001600160a01b0386166000908152600a6020526040902060030155600d54610e7090836118cd565b600d55601054610e809083611b05565b60105550610aad565b6000546001600160a01b03163314610ea057600080fd5b60198110158015610eb2575060648111155b610f135760405162461bcd60e51b815260206004820152602c60248201527f50657263656e74206f6620646f6e6174696f6e206973206f757473696465206f60448201526b6620706172616d657465727360a01b6064820152608401610cdd565b6000610f43610f2185610bcc565b6001600160a01b0386166000908152600a6020526040902060010154906118cd565b90506000610f566064610d298486611b64565b905080156110c357610f69816001611b05565b601354909150610f7990826118cd565b6013556017546040516000916001600160a01b03871691849084818181858888f193505050503d8060008114610fcb576040519150601f19603f3d011682016040523d82523d6000602084013e610fd0565b606091505b5050905080610ff15760405162461bcd60e51b8152600401610cdd906123f0565b6001600160a01b03861660009081526007602052604090204290556110168383611b05565b6001600160a01b0387166000908152600a6020526040902060018101919091555461104090611b47565b6001600160a01b0387166000908152600a602052604090206002015561106586611c25565b6001600160a01b03861660009081526008602052604090205461108890836118cd565b6001600160a01b038716600090815260086020526040902055600f546110ae90836118cd565b600f556010546110be9083611b05565b601055505b5050505050565b505050565b600554606090819060008167ffffffffffffffff8111156110f2576110f2612431565b60405190808252806020026020018201604052801561111b578160200160208202803683370190505b50905060008267ffffffffffffffff81111561113957611139612431565b604051908082528060200260200182016040528015611162578160200160208202803683370190505b50905060005b8381101561123e576005818154811061118357611183612447565b9060005260206000200160009054906101000a90046001600160a01b03168382815181106111b3576111b3612447565b60200260200101906001600160a01b031690816001600160a01b03168152505060086000600583815481106111ea576111ea612447565b60009182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061122357611223612447565b602090810291909101015261123781612473565b9050611168565b509094909350915050565b6000546001600160a01b0316331461126057600080fd5b601955565b6000546001600160a01b0316331461127c57600080fd5b601791909155601855565b6000546001600160a01b0316331461129e57600080fd5b601a55565b6000546001600160a01b031633146112ba57600080fd5b600454806112c6575050565b6000805a6000601c8190559091505b84831080156112e357508381105b156114505783601c54106112f7576000601c555b6000600a60006004601c548154811061131257611312612447565b60009182526020808320909101546001600160a01b031683528201929092526040019020600101541180156113825750600a60006004601c548154811061135b5761135b612447565b60009182526020808320909101546001600160a01b03168352820192909252604001902054155b80156113d75750600960006004601c54815481106113a2576113a2612447565b60009182526020808320909101546001600160a01b031683528201929092526040019020546019546113d59042906118cd565b115b1561140e5761140e6004601c54815481106113f4576113f4612447565b6000918252602090912001546001600160a01b0316611cb0565b61142361141c5a8490611b05565b84906118cd565b92505a601c8054919350600061143883612473565b9190505550808061144890612473565b9150506112d5565b6110c3611d98565b6000546001600160a01b0316331461146f57600080fd5b34601681905560105461148290826118cd565b60105560125461149290826118cd565b6012556011546015546114b6916114ad91610d299085611b64565b601454906118cd565b60145550565b6000546001600160a01b031633146114d357600080fd5b601b5482141561154b5760405162461bcd60e51b815260206004820152603d60248201527f6e6577207468726573686f6c6420616d6f756e742063616e6e6f74206265207460448201527f68652073616d65206173206578697374696e67207468726573686f6c640000006064820152608401610cdd565b633b9aca0082101580611566575067016345785d8a00008211155b6115d85760405162461bcd60e51b815260206004820152603960248201527f4d696e20686f6c6420616d6f756e7420666f7220646976732073686f756c642060448201527f6265747765656e203120616e64203130304d20746f6b656e73000000000000006064820152608401610cdd565b6206ddd081101561164a5760405162461bcd60e51b815260206004820152603660248201527f506c65617365207573652061206761732076616c756520657175616c20746f2060448201527506f7220686967686572207468616e203435302c3030360541b6064820152608401610cdd565b601b80549083905582811115611665576110ca826000611eff565b6110ca826001611eff565b6000546001600160a01b0316331461168757600080fd5b60198210158015611699575060648211155b6116fe5760405162461bcd60e51b815260206004820152603060248201527f50657263656e74206f66207265696e766573746d656e74206973206f7574736960448201526f6465206f6620706172616d657465727360801b6064820152608401610cdd565b600061170c610f2185610bcc565b9050600061171f6064610d298487611b64565b9050601a5481106110c357611735816001611b05565b6040805160028082526060820183529293506000929091602083019080368337505060035482519293506001600160a01b03169183915060009061177b5761177b612447565b6001600160a01b0392831660209182029290920101526000548251911690829060019081106117ac576117ac612447565b6001600160a01b03928316602091820292909201015260025460185460405163b6f9de9560e01b8152919092169163b6f9de959185906117f690899087908d90429060040161248e565b6000604051808303818589803b15801561180f57600080fd5b5088f1158015611823573d6000803e3d6000fd5b50505050505061183e826013546118cd90919063ffffffff16565b60135561184b8383611b05565b6001600160a01b0387166000908152600a6020526040902060018101919091556003015461187990836118cd565b6001600160a01b0387166000908152600a6020526040902060030155600e546118a290836118cd565b600e556001600160a01b03861660009081526007602052604090204290556010546110be9083611b05565b6000806118da83856124c3565b90508381101561192c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cdd565b90505b92915050565b6001600160a01b0381166000908152600b602052604090205460ff16156119595750565b600480546001600160a01b038316600081815260066020908152604080832085905560018086019096557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b90940180546001600160a01b03191684179055918152600b90915220805460ff1916909117905550565b600480546119de906001906124db565b815481106119ee576119ee612447565b60009182526020808320909101546001600160a01b0384811684526006909252604090922054600480549290931692918110611a2c57611a2c612447565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260069182905260408120546004805491939291611a78906001906124db565b81548110611a8857611a88612447565b60009182526020808320909101546001600160a01b031683528201929092526040019020556004805480611abe57611abe6124f2565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03929092168152600b90915260409020805460ff19169055565b600061192c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121c0565b600061192f601554610d2960145485611b6490919063ffffffff16565b600082611b735750600061192f565b6000611b7f8385612508565b905082611b8c8583612527565b1461192c5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cdd565b600061192c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121fa565b6001600160a01b0381166000908152600c602052604090205460ff1615611c495750565b6005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0384166001600160a01b031990911681179091556000908152600c60205260409020805460ff1916909117905550565b6000611cbe61076c83610bcc565b90506000611ccd826001611b05565b6000805460175460405193945091926001600160a01b039091169190849084818181858888f193505050503d8060008114611d24576040519150601f19603f3d011682016040523d82523d6000602084013e611d29565b606091505b5050905080611d4a5760405162461bcd60e51b8152600401610cdd906123f0565b6001600160a01b0384166000908152600760209081526040808320429055600982528083206402540be3ff9055600a909152812060010155601054611d8f9084611b05565b60105550505050565b60045480611da35750565b6000601c8190555b81811015610b085781601c5410611dc2576000601c555b600a60006004601c5481548110611ddb57611ddb612447565b60009182526020808320909101546001600160a01b03168352820192909252604001902060010154158015611e4b5750600a60006004601c5481548110611e2457611e24612447565b60009182526020808320909101546001600160a01b03168352820192909252604001902054155b8015611ea05750600960006004601c5481548110611e6b57611e6b612447565b60009182526020808320909101546001600160a01b03168352820192909252604001902054601954611e9e9042906118cd565b115b15611ed757611ed76004601c5481548110611ebd57611ebd612447565b6000918252602090912001546001600160a01b03166119ce565b601c8054906000611ee783612473565b91905055508080611ef790612473565b915050611dab565b60045480611f0c57505050565b6000805a6000601c8190559091505b8583108015611f2957508381105b156121b85783601c5410611f3d576000601c555b846120be57600a60006004601c5481548110611f5b57611f5b612447565b60009182526020808320909101546001600160a01b03168352820192909252604001902054158015611fce5750600960006004601c5481548110611fa157611fa1612447565b60009182526020808320909101546001600160a01b031683528201929092526040019020546402540be3ff145b156120b95760008054601c54600480546001600160a01b03909316926370a0823192908110611fff57611fff612447565b60009182526020909120015460405160e083901b6001600160e01b03191681526001600160a01b03909116600482015260240160206040518083038186803b15801561204a57600080fd5b505afa15801561205e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120829190612549565b90506120b76004601c548154811061209c5761209c612447565b6000918252602090912001546001600160a01b03168261072b565b505b61217d565b6000600a60006004601c54815481106120d9576120d9612447565b60009182526020808320909101546001600160a01b03168352820192909252604001902054111561217d5761217d6004601c548154811061211c5761211c612447565b9060005260206000200160009054906101000a90046001600160a01b0316600a60006004601c548154811061215357612153612447565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461072b565b61218b61141c5a8490611b05565b92505a601c805491935060006121a083612473565b919050555080806121b090612473565b915050611f1b565b505050505050565b600081848411156121e45760405162461bcd60e51b8152600401610cdd9190612562565b5060006121f184866124db565b95945050505050565b6000818361221b5760405162461bcd60e51b8152600401610cdd9190612562565b5060006121f18486612527565b80356001600160a01b038116811461223f57600080fd5b919050565b60006020828403121561225657600080fd5b61192c82612228565b6000806040838503121561227257600080fd5b61227b83612228565b946020939093013593505050565b60008060006060848603121561229e57600080fd5b6122a784612228565b92506122b560208501612228565b9150604084013590509250925092565b600081518084526020808501945080840160005b838110156122fe5781516001600160a01b0316875295820195908201906001016122d9565b509495945050505050565b60408152600061231c60408301856122c5565b82810360208481019190915284518083528582019282019060005b8181101561235357845183529383019391830191600101612337565b5090979650505050505050565b60006020828403121561237257600080fd5b5035919050565b6000806040838503121561238c57600080fd5b50508035926020909101359150565b6000806000606084860312156123b057600080fd5b6123b984612228565b95602085013595506040909401359392505050565b6000602082840312156123e057600080fd5b8151801515811461192c57600080fd5b60208082526021908201527f5368617265686f6c6465722072656a656374656420424e42207472616e7366656040820152603960f91b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156124875761248761245d565b5060010190565b8481526080602082015260006124a760808301866122c5565b6001600160a01b03949094166040830152506060015292915050565b600082198211156124d6576124d661245d565b500190565b6000828210156124ed576124ed61245d565b500390565b634e487b7160e01b600052603160045260246000fd5b60008160001904831182151516156125225761252261245d565b500290565b60008261254457634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561255b57600080fd5b5051919050565b600060208083528351808285015260005b8181101561258f57858101830151858201604001528201612573565b818111156125a1576000604083870101525b50601f01601f191692909201604001939250505056fea26469706673582212204fadfc7a161409ad5b4a3f8bd8f846c700174f03dd1b261fb6375bd77907532d64736f6c63430008090033

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.