Contract 0x3f374ed3c8e61a0d250f275609be2219005c021e 4

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xbbc0019b2e29e59e70b50b9443e14338f6b19cfc3124c9947b74bf2efba0411cApprove434015862023-06-01 9:01:096 days 13 hrs ago0xb43edf919ea51ae7eae0ab7c7a28e530aabb6d65 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.004279801842 171.349715426
0xafc75ee039aadaf675517ce773276b153c7716ec363a40915e9d8e991fbc11beApprove429044402023-05-19 18:23:1219 days 3 hrs ago0x5e41f603f24ead60b4d04c29d3c7eca8ae9bdaae IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.003601424225 144.18962347
0x5d11a54e0a72be5e5e50bdc572ef0c5fbd87c2d030b70393a357e6754e180e71Approve429044392023-05-19 18:23:1019 days 3 hrs ago0x5e41f603f24ead60b4d04c29d3c7eca8ae9bdaae IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.003696053743 147.978289768
0x13bc339df7c5c1329eb565bd867804307992193e0f1e1d1d85b32187a9abe349Approve429044372023-05-19 18:23:0619 days 3 hrs ago0x5e41f603f24ead60b4d04c29d3c7eca8ae9bdaae IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.003543769368 141.881305541
0x0d9957083468f1ac0af10897533886586c05d0151900ab50bc667b4489b27a73Approve426687192023-05-13 21:19:3525 days 43 mins ago0x7f86710856f2971804629667b8c47a3ec11d3951 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.003476551921 139.190131781
0xe30cf0a7bf33061ebccff6e99c5fc3f4e7cc6c67dd5dfa5dd1806c0b84fc5e37Approve426685892023-05-13 21:14:5525 days 48 mins ago0x7f86710856f2971804629667b8c47a3ec11d3951 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.003881295855 155.394797453
0x11063dbecba02feade34dd2ea6c5c84fe5921ac4c02c23851b58ca3eea1aa199Approve426685832023-05-13 21:14:4325 days 48 mins ago0x7f86710856f2971804629667b8c47a3ec11d3951 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.004022415279 161.044772361
0x03f74aff7a1fecd46f88b1ab575b1c9f6388616c82ad9dccedb0bf70a0acba67Approve426684272023-05-13 21:09:1125 days 53 mins ago0x7f86710856f2971804629667b8c47a3ec11d3951 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.003881252816 155.393074302
0xd4a49daa4a67ccb32952bb717bc7b9704fd949be7fcc328ae383129e617d5657Approve426196492023-05-12 15:57:4426 days 6 hrs ago0xe975ea179199189af740631fb41521cf6f7d3f8c IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.00462411768 185.135031433
0x2c7f00e337053f3d7c6c62d28e4ac0a46953179a0f8234ac17cc83caf5a9f70bApprove426119002023-05-12 11:07:5326 days 10 hrs ago0x00eb1860a20bebea22e0df078d07fa0bab6036dd IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.004032415302 161.445141615
0x54a90cad35f7af746c7c44e7b2c5d675326bb0a6b82ee42dc8f3391b5f35318aApprove426118942023-05-12 11:07:4126 days 10 hrs ago0x00eb1860a20bebea22e0df078d07fa0bab6036dd IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.004230686946 169.38331049
0xd878d97ea469b1dd261802cb9b250fbb17265b92b5b221c4ec0d5393e997a31fApprove424594632023-05-08 16:10:1430 days 5 hrs ago0xecf4d06fcbfe8f63ffea9ece30cf988cd60847b1 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.004359113207 174.52509137
0xe51474b97d1c0ce0bc2e099c2981d0ae60844ca92fc22427f29ee6b629f2b941Approve424584462023-05-08 15:34:1230 days 6 hrs ago0x237c1041bdbccc2e34743153ffabd1759043d7b1 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.004929553886197.363730085
0xce9cfd981ddd269d8c3d5189c0de56c133c37e0ba319eddcfff35dfbb3be6f9eApprove422912002023-05-04 10:02:1234 days 12 hrs ago0x268b819eb1a64796c670bdb90752f55ca9eef21f IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.006315722387 252.861528105
0xc96920762bd9a1d469716c60c0f52ed079199752fab115ae7f690897eaa2cae3Approve422911972023-05-04 10:02:0034 days 12 hrs ago0x268b819eb1a64796c670bdb90752f55ca9eef21f IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.006517257615 260.930360571
0xe0c0121c9f17500cab6c0b39fcbf192933e4153f421c89f6178fe3a4b8e37a80Approve422911962023-05-04 10:01:5634 days 12 hrs ago0x268b819eb1a64796c670bdb90752f55ca9eef21f IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.006448202064 258.165594939
0x5c8c6840ee41fe060fe26eb5ec107f94e789dc7653b1b49a6d64d7b82cfb5cf3Approve422371792023-05-03 1:24:1135 days 20 hrs ago0xe853ee163b6226bb3b9fd63fe19d5b74e34e19e5 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.007276260833 291.318446307
0x8d771f2c67b95a537e175492fb4fead6c76939974647c7cd92d21177a104fb23Approve422371762023-05-03 1:24:0535 days 20 hrs ago0xe853ee163b6226bb3b9fd63fe19d5b74e34e19e5 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.007278488161 291.407621467
0xf0b154b77a6708940685729839500244b8f741b264de9b9d66ebf30639a4929eApprove422371742023-05-03 1:24:0135 days 20 hrs ago0xe853ee163b6226bb3b9fd63fe19d5b74e34e19e5 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.007505383301 300.491784498
0x5172814c5d3e2d9b13bb08aceb6b143dc6cc9e81dc417c51742cc8cfae72e915Approve419692202023-04-26 5:51:4742 days 16 hrs ago0x3c7349f05f2439b348bec45513f15e04f78e812d IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.015998289218 338.509325201
0x2584b94c9cde84aaeeca2a55ed315333eb09c9b49065d60037f879369fbe2e16Approve417516982023-04-20 15:23:5448 days 6 hrs ago0xcce79a4436c6a015ed7a821f57e0911890fbcf51 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.006668859267
0x2356787e9d085b57017d6ea75936ae90d0680c26849cb885333e7c89497401c0Approve417516772023-04-20 15:23:0848 days 6 hrs ago0xcce79a4436c6a015ed7a821f57e0911890fbcf51 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.00724333290
0x4466eda0826c7bed2c251836ae1b1d5ea661c1e96450ebed3f509743c78ab77aApprove416972042023-04-19 4:24:2049 days 17 hrs ago0x45f51421d13987d8859d0aa2fd68642b19694a70 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.007701028611 308.324803278
0xa6877e73ceaea24b797ae11e34ea36452492bbe2ca9b3c7c7434cb75662664f7Approve416800312023-04-18 17:47:0550 days 4 hrs ago0xba373232dae4a6a1d4a7bbb250ae3bbc9eb34aa6 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.006176913938 247.304077273
0x7a5d9453fe507fb2c84cdc1759332357a5ccb9807ae2ca06a7ade5a382e57421Approve416800202023-04-18 17:46:3350 days 4 hrs ago0xba373232dae4a6a1d4a7bbb250ae3bbc9eb34aa6 IN  0x3f374ed3c8e61a0d250f275609be2219005c021e0 MATIC0.006208555621 248.570910108
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc4b447e5953c54c1e77e71379f5955f247d21ff0d108cf3f0bd9c0be20c96e6f186381562021-09-01 21:17:02644 days 46 mins ago 0x3f374ed3c8e61a0d250f275609be2219005c021e 0x75ef87c8994c6c7bc07c80fef255afb32dce77c20.029020550141033873 MATIC
0xc316fa9855f99054e9f3af19758a092aff26c42dac70ff7e31410fdbf61016c7186381552021-09-01 21:17:00644 days 46 mins ago 0x3f374ed3c8e61a0d250f275609be2219005c021e 0x75ef87c8994c6c7bc07c80fef255afb32dce77c20.029020550141033873 MATIC
0x150c2edecd8371c1ea69f8be7993955c698bdb762415a589b6124c0f7d5b1bf2186381492021-09-01 21:16:48644 days 46 mins ago 0x3f374ed3c8e61a0d250f275609be2219005c021e 0x75ef87c8994c6c7bc07c80fef255afb32dce77c20.029020550141033873 MATIC
0x755dc64dd76e672f2854e100d90d776643bcb72abda6669bacb191e9f825fe63186376532021-09-01 20:55:28644 days 1 hr ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.003430532097521715 MATIC
0xbbd8105ff6f4cbb7f52f350799c221024f81721a50b8a76aae3f90aa2bee798c186373342021-09-01 20:40:14644 days 1 hr ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.013840617543404058 MATIC
0xcd9a7899e0376e7b7132704b051088cf455f9db02ef990ea0d70bed6c8148bff186368982021-09-01 20:25:14644 days 1 hr ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.004461059592176256 MATIC
0x64ac080a19cd03d472c380d20d11756f498930babe2c7c8d18a0249866ea283e186367562021-09-01 20:20:22644 days 1 hr ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.007288340907931844 MATIC
0x3ec38171286969d5de20ba31d110730f9ac2c54eeed6b7df9506ed6f99e1c934186367342021-09-01 20:19:34644 days 1 hr ago 0x3f374ed3c8e61a0d250f275609be2219005c021e 0x75ef87c8994c6c7bc07c80fef255afb32dce77c20.013752752444636323 MATIC
0x7d85eb7ed24f0eee8dc2f1e1ff53f47407c8bd509e87ddd2f14faccc12730ecc186367332021-09-01 20:19:32644 days 1 hr ago 0x3f374ed3c8e61a0d250f275609be2219005c021e 0x75ef87c8994c6c7bc07c80fef255afb32dce77c20.013752752444636323 MATIC
0x0a4ef418a1e8b143cd62084446fccc94c513e1010e25889c30a38da6381f1bd3186367332021-09-01 20:19:32644 days 1 hr ago 0x3f374ed3c8e61a0d250f275609be2219005c021e 0x75ef87c8994c6c7bc07c80fef255afb32dce77c20.013752752444636323 MATIC
0x5b1c6193bab12d567ec5fcda9feda093b9a57f479f6f056623bcd1605ba2d88b186365242021-09-01 20:10:14644 days 1 hr ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.004662508032867585 MATIC
0x69ef190d9e921fbfe5e3ac15c5ce6afac87ca1778ef2e5ef614a4f4c1250300e186363772021-09-01 20:05:12644 days 1 hr ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.009090244411768738 MATIC
0xca72a02ce7b631531ba9680372fc457e79f036e88269262dfe00cba2585b28f4186362942021-09-01 20:02:22644 days 2 hrs ago 0x3f374ed3c8e61a0d250f275609be2219005c021e 0x75ef87c8994c6c7bc07c80fef255afb32dce77c20.044903486475947291 MATIC
0x98022b9f22af1f5edd760fa330ea63775e71ca057d0438d7f33087c95b95a3f3186360902021-09-01 19:55:18644 days 2 hrs ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.012794285748347996 MATIC
0xfe0decb8620404d32bb1ce3b599b97d9f752709ad5601b6b7ff6bd3e3721e5a7186356832021-09-01 19:41:20644 days 2 hrs ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.0139796688055249 MATIC
0xeb7d6b3463a66097efe452bf9691616ad2dd910232a32a78b5855502fc042fc7186352262021-09-01 19:25:38644 days 2 hrs ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.004747482674957665 MATIC
0x43d373e67f764f49f513ef442abb8706f39fe5aa18de11181f237a607442bc8e186350702021-09-01 19:20:14644 days 2 hrs ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.00440999244385977 MATIC
0x4aa47112d50d5c4ef2bf16ef7722003a5d1f66452efddf0e77193fd57bedc7d2186349252021-09-01 19:15:16644 days 2 hrs ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.004482069456635374 MATIC
0x096e878f625f3c157f3fc4d37fae7a5d290e65ebeb466a9dbbb7faa1f57e8de7186347782021-09-01 19:10:14644 days 2 hrs ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.004489987346621586 MATIC
0xb426f7bb277b73f6dd1e8bc8de40be70c791a62fdacb2b58877e7a7a585fb1fb186347432021-09-01 19:09:00644 days 2 hrs ago 0x3f374ed3c8e61a0d250f275609be2219005c021e 0x75ef87c8994c6c7bc07c80fef255afb32dce77c20.003963657199919555 MATIC
0x3bd5f82ea88e04eef178de61f7e0cd4d36e277b93dfb29b969405e486de81fc6186347432021-09-01 19:09:00644 days 2 hrs ago 0x3f374ed3c8e61a0d250f275609be2219005c021e 0x75ef87c8994c6c7bc07c80fef255afb32dce77c20.003963657199919555 MATIC
0x2da041a34831588ad6197d67f1e106fa0dcab64673db2853df32b5f44967e1a1186346312021-09-01 19:05:12644 days 2 hrs ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.003963657199919555 MATIC
0xa1ea9cd30b271d894944d71273d4a0e6a6119ac8f1ed2301e9a1da966eff282c186345772021-09-01 19:02:44644 days 3 hrs ago 0x3f374ed3c8e61a0d250f275609be2219005c021e 0x75ef87c8994c6c7bc07c80fef255afb32dce77c20.011296437403160631 MATIC
0xc653085eb8436464d6ffd5b84cb30b40cf1eb37a2d6c427309281f76fe206e17186345672021-09-01 19:02:24644 days 3 hrs ago 0x3f374ed3c8e61a0d250f275609be2219005c021e 0x75ef87c8994c6c7bc07c80fef255afb32dce77c20.011296437403160631 MATIC
0xe9155f2d2ff7cb6e701c7966a9f0332097a5e0721c10b6af659e925036a53b20186345022021-09-01 19:00:10644 days 3 hrs ago Polygon: WMATIC Token 0x3f374ed3c8e61a0d250f275609be2219005c021e0.011296437403160631 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ArcadiumToken

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 16 : ArcadiumToken.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./libs/ERC20.sol";
import "./libs/IERC20.sol";
import "./libs/SafeERC20.sol";
import "./libs/IWETH.sol";

import "./libs/AddLiquidityHelper.sol";
import "./libs/RHCPToolBox.sol";

import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";

// ArcadiumToken.
contract ArcadiumToken is ERC20("ARCADIUM", "ARCADIUM")  {
    using SafeERC20 for IERC20;

    // Transfer tax rate in basis points. (default 6.66%)
    uint16 public transferTaxRate = 666;
    // Extra transfer tax rate in basis points. (default 2.00%)
    uint16 public extraTransferTaxRate = 200;
    // Burn rate % of transfer tax. (default 54.95% x 6.66% = 3.660336% of total amount).
    uint32 public constant burnRate = 549549549;
    // Max transfer tax rate: 10.01%.
    uint16 public constant MAXIMUM_TRANSFER_TAX_RATE = 1001;
    // Burn address
    address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;

    address public constant usdcCurrencyAddress = 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174;

    uint256 public constant usdcSwapThreshold = 20 * (10 ** 6);

    // Automatic swap and liquify enabled
    bool public swapAndLiquifyEnabled = true;
    // Min amount to liquify. (default 40 ARCADIUMs)
    uint256 public constant minArcadiumAmountToLiquify = 40 * (10 ** 18);
    // Min amount to liquify. (default 100 MATIC)
    uint256 public constant minMaticAmountToLiquify = 100 *  (10 ** 18);

    IUniswapV2Router02 public arcadiumSwapRouter;
    // The trading pair
    address public arcadiumSwapPair;
    // In swap and liquify
    bool private _inSwapAndLiquify;

    AddLiquidityHelper public immutable addLiquidityHelper;
    RHCPToolBox public immutable arcadiumToolBox;
    IERC20 public immutable usdcRewardCurrency;
    address public immutable myFriends;

    bool public ownershipIsTransferred = false;

    mapping(address => bool) public excludeFromMap;
    mapping(address => bool) public excludeToMap;

    mapping(address => bool) public extraFromMap;
    mapping(address => bool) public extraToMap;

    event SetSwapAndLiquifyEnabled(bool swapAndLiquifyEnabled);
    event TransferFeeChanged(uint256 txnFee, uint256 extraTxnFee);
    event UpdateFeeMaps(address _contract, bool fromExcluded, bool toExcluded, bool fromHasExtra, bool toHasExtra);
    event SetArcadiumRouter(address arcadiumSwapRouter, address arcadiumSwapPair);
    event SetOperator(address operator);

    // The operator can only update the transfer tax rate
    address private _operator;

    modifier onlyOperator() {
        require(_operator == msg.sender, "!operator");
        _;
    }

    modifier lockTheSwap {
        _inSwapAndLiquify = true;
        _;
        _inSwapAndLiquify = false;
    }

    modifier transferTaxFree {
        uint16 _transferTaxRate = transferTaxRate;
        uint16 _extraTransferTaxRate = extraTransferTaxRate;
        transferTaxRate = 0;
        extraTransferTaxRate = 0;
        _;
        transferTaxRate = _transferTaxRate;
        extraTransferTaxRate = _extraTransferTaxRate;
    }

    /**
     * @notice Constructs the ArcadiumToken contract.
     */
    constructor(address _myFriends, AddLiquidityHelper _addLiquidityHelper, RHCPToolBox _arcadiumToolBox) public {
        addLiquidityHelper = _addLiquidityHelper;
        arcadiumToolBox = _arcadiumToolBox;
        myFriends = _myFriends;
        usdcRewardCurrency = IERC20(usdcCurrencyAddress);
        _operator = _msgSender();

        // pre-mint
        _mint(address(0x3a1D1114269d7a786C154FE5278bF5b1e3e20d31), uint256(325000 * (10 ** 18)));
    }

    function transferOwnership(address newOwner) public override onlyOwner  {
        require(!ownershipIsTransferred, "!unset");
        super.transferOwnership(newOwner);
        ownershipIsTransferred = true;
    }

    /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterChef).
    function mint(address _to, uint256 _amount) public onlyOwner {
        require(ownershipIsTransferred, "too early!");
        _mint(_to, _amount);
    }

    /// @dev overrides transfer function to meet tokenomics of ARCADIUM
    function _transfer(address sender, address recipient, uint256 amount) internal virtual override {
        bool toFromAddLiquidityHelper = (sender == address(addLiquidityHelper) || recipient == address(addLiquidityHelper));
        // swap and liquify
        if (
            swapAndLiquifyEnabled == true
            && _inSwapAndLiquify == false
            && address(arcadiumSwapRouter) != address(0)
            && !toFromAddLiquidityHelper
            && sender != arcadiumSwapPair
            && sender != owner()
        ) {
            swapAndLiquify();
        }

        if (toFromAddLiquidityHelper ||
            recipient == BURN_ADDRESS || (transferTaxRate == 0 && extraTransferTaxRate == 0) ||
            excludeFromMap[sender] || excludeToMap[recipient]) {
            super._transfer(sender, recipient, amount);
        } else {
            // default tax is 6.66% of every transfer, but extra 2% for dumping tax
            uint256 taxAmount = (amount * (transferTaxRate +
                ((extraFromMap[sender] || extraToMap[recipient]) ? extraTransferTaxRate : 0))) / 10000;

            uint256 burnAmount = (taxAmount * burnRate) / 1000000000;
            uint256 liquidityAmount = taxAmount - burnAmount;

            // default 93.34% of transfer sent to recipient
            uint256 sendAmount = amount - taxAmount;

            require(amount == sendAmount + taxAmount &&
                        taxAmount == burnAmount + liquidityAmount, "sum error");

            super._transfer(sender, BURN_ADDRESS, burnAmount);
            super._transfer(sender, address(this), liquidityAmount);
            super._transfer(sender, recipient, sendAmount);
            amount = sendAmount;
        }
    }

    /// @dev Swap and liquify
    function swapAndLiquify() private lockTheSwap transferTaxFree {
        uint256 contractTokenBalance = ERC20(address(this)).balanceOf(address(this));

        uint256 WETHbalance = IERC20(arcadiumSwapRouter.WETH()).balanceOf(address(this));

        IWETH(arcadiumSwapRouter.WETH()).withdraw(WETHbalance);

        if (address(this).balance >= minMaticAmountToLiquify || contractTokenBalance >= minArcadiumAmountToLiquify) {

            ERC20(address(this)).transfer(address(addLiquidityHelper), ERC20(address(this)).balanceOf(address(this)));
            // send all tokens to add liquidity with, we are refunded any that aren't used.
            addLiquidityHelper.arcadiumETHLiquidityWithBuyBack{value: address(this).balance}(BURN_ADDRESS);
        }
    }

    /**
     * @dev unenchant the lp token into its original components.
     * Can only be called by the current operator.
     */
    function swapLpTokensForFee(address token, uint256 amount) internal {
        require(IERC20(token).approve(address(arcadiumSwapRouter), amount), '!approved');

        IUniswapV2Pair lpToken = IUniswapV2Pair(token);

        uint256 token0BeforeLiquidation = IERC20(lpToken.token0()).balanceOf(address(this));
        uint256 token1BeforeLiquidation = IERC20(lpToken.token1()).balanceOf(address(this));

        // make the swap
        arcadiumSwapRouter.removeLiquidity(
            lpToken.token0(),
            lpToken.token1(),
            amount,
            0,
            0,
            address(this),
            block.timestamp
        );

        uint256 token0FromLiquidation = IERC20(lpToken.token0()).balanceOf(address(this)) - token0BeforeLiquidation;
        uint256 token1FromLiquidation = IERC20(lpToken.token1()).balanceOf(address(this)) - token1BeforeLiquidation;

        address tokenForMyFriendsUSDCReward = lpToken.token0();
        address tokenForArcadiumAMMReward = lpToken.token1();

        // If we already have, usdc, save a swap.
       if (lpToken.token1() == address(usdcRewardCurrency)){

            (tokenForArcadiumAMMReward, tokenForMyFriendsUSDCReward) = (tokenForMyFriendsUSDCReward, tokenForArcadiumAMMReward);
        } else if (lpToken.token0() == arcadiumSwapRouter.WETH()){
            // if one is weth already use the other one for myfriends and
            // the weth for arcadium AMM to save a swap.

            (tokenForArcadiumAMMReward, tokenForMyFriendsUSDCReward) = (tokenForMyFriendsUSDCReward, tokenForArcadiumAMMReward);
        }

        // send myfriends all of 1 half of the LP to be convereted to USDC later.
        IERC20(tokenForMyFriendsUSDCReward).safeTransfer(address(myFriends),
            tokenForMyFriendsUSDCReward == lpToken.token0() ? token0FromLiquidation : token1FromLiquidation);

        // send myfriends 50% share of the other 50% to give myfriends 75% in total.
        IERC20(tokenForArcadiumAMMReward).safeTransfer(address(myFriends),
            (tokenForArcadiumAMMReward == lpToken.token0() ? token0FromLiquidation : token1FromLiquidation)/2);

        swapDepositFeeForTokensInternal(tokenForArcadiumAMMReward, 0, arcadiumSwapRouter.WETH());
    }

    /**
     * @dev sell all of a current type of token for weth, to be used in arcadium liquidity later.
     * Can only be called by the current operator.
     */
    function swapDepositFeeForETH(address token, uint8 tokenType) external onlyOwner {
        uint256 usdcValue = arcadiumToolBox.getTokenUSDCValue(IERC20(token).balanceOf(address(this)), token, tokenType, false, address(usdcRewardCurrency));

        // If arcadium or weth already no need to do anything.
        if (token == address(this) || token == arcadiumSwapRouter.WETH())
            return;

        // only swap if a certain usdc value
        if (usdcValue < usdcSwapThreshold)
            return;

        swapDepositFeeForTokensInternal(token, tokenType, arcadiumSwapRouter.WETH());
    }

    function swapDepositFeeForTokensInternal(address token, uint8 tokenType, address toToken) internal {
        uint256 totalTokenBalance = IERC20(token).balanceOf(address(this));

        // can't trade to arcadium inside of arcadium anyway
        if (token == toToken || totalTokenBalance == 0 || toToken == address(this))
            return;

        if (tokenType == 1) {
            swapLpTokensForFee(token, totalTokenBalance);
            return;
        }

        require(IERC20(token).approve(address(arcadiumSwapRouter), totalTokenBalance), "!approved");

        // generate the arcadiumSwap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = token;
        path[1] = toToken;

        try
            // make the swap
            arcadiumSwapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                totalTokenBalance,
                0, // accept any amount of tokens
                path,
                address(this),
                block.timestamp
            )
        { /* suceeded */ } catch { /* failed, but we avoided reverting */ }

        // Unfortunately can't swap directly to arcadium inside of arcadium (Uniswap INVALID_TO Assert, boo).
        // Also dont want to add an extra swap here.
        // Will leave as WETH and make the arcadium Txn AMM utilise available WETH first.
    }

    // To receive ETH from arcadiumSwapRouter when swapping
    receive() external payable {}

    /**
     * @dev Update the swapAndLiquifyEnabled.
     * Can only be called by the current operator.
     */
    function updateSwapAndLiquifyEnabled(bool _enabled) external onlyOperator {
        swapAndLiquifyEnabled = _enabled;

        emit SetSwapAndLiquifyEnabled(swapAndLiquifyEnabled);
    }

    /**
     * @dev Update the transfer tax rate.
     * Can only be called by the current operator.
     */
    function updateTransferTaxRate(uint16 _transferTaxRate, uint16 _extraTransferTaxRate) external onlyOperator {
        require(_transferTaxRate + _extraTransferTaxRate  <= MAXIMUM_TRANSFER_TAX_RATE,
            "!valid");
        transferTaxRate = _transferTaxRate;
        extraTransferTaxRate = _extraTransferTaxRate;

        emit TransferFeeChanged(transferTaxRate, extraTransferTaxRate);
    }

    /**
     * @dev Update the excludeFromMap
     * Can only be called by the current operator.
     */
    function updateFeeMaps(address _contract, bool fromExcluded, bool toExcluded, bool fromHasExtra, bool toHasExtra) external onlyOperator {
        excludeFromMap[_contract] = fromExcluded;
        excludeToMap[_contract] = toExcluded;
        extraFromMap[_contract] = fromHasExtra;
        extraToMap[_contract] = toHasExtra;

        emit UpdateFeeMaps(_contract, fromExcluded, toExcluded, fromHasExtra, toHasExtra);
    }

    /**
     * @dev Update the swap router.
     * Can only be called by the current operator.
     */
    function updateArcadiumSwapRouter(address _router) external onlyOperator {
        require(_router != address(0), "!!0");
        require(address(arcadiumSwapRouter) == address(0), "!unset");

        arcadiumSwapRouter = IUniswapV2Router02(_router);
        arcadiumSwapPair = IUniswapV2Factory(arcadiumSwapRouter.factory()).getPair(address(this), arcadiumSwapRouter.WETH());

        require(address(arcadiumSwapPair) != address(0), "matic pair !exist");

        emit SetArcadiumRouter(address(arcadiumSwapRouter), arcadiumSwapPair);
    }

    /**
     * @dev Returns the address of the current operator.
     */
    function operator() public view returns (address) {
        return _operator;
    }

    /**
     * @dev Transfers operator of the contract to a new account (`newOperator`).
     * Can only be called by the current operator.
     */
    function transferOperator(address newOperator) external onlyOperator {
        require(newOperator != address(0), "!!0");
        _operator = newOperator;

        emit SetOperator(_operator);
    }
}

File 2 of 16 : ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata, Ownable {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 3 of 16 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

File 4 of 16 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "@openzeppelin/contracts/utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 5 of 16 : IWETH.sol
pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

File 6 of 16 : AddLiquidityHelper.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./SafeERC20.sol";

import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";


// AddLiquidityHelper, allows anyone to add or remove Arcadium liquidity tax free
// Also allows the Arcadium Token to do buy backs tax free via an external contract.
contract AddLiquidityHelper is ReentrancyGuard, Ownable {
    using SafeERC20 for ERC20;

    address public arcadiumAddress;

    IUniswapV2Router02 public immutable arcadiumSwapRouter;
    // The trading pair
    address public arcadiumSwapPair;

    // To receive ETH when swapping
    receive() external payable {}

    event SetArcadiumAddresses(address arcadiumAddress, address arcadiumSwapPair);

    /**
     * @notice Constructs the AddLiquidityHelper contract.
     */
    constructor(address _router) public  {
        require(_router != address(0), "_router is the zero address");
        arcadiumSwapRouter = IUniswapV2Router02(_router);
    }

    function arcadiumETHLiquidityWithBuyBack(address lpHolder) external payable nonReentrant {
        require(msg.sender == arcadiumAddress, "can only be used by the arcadium token!");

        (uint256 res0, uint256 res1, ) = IUniswapV2Pair(arcadiumSwapPair).getReserves();

        if (res0 != 0 && res1 != 0) {
            // making weth res0
            if (IUniswapV2Pair(arcadiumSwapPair).token0() == arcadiumAddress)
                (res1, res0) = (res0, res1);

            uint256 contractTokenBalance = ERC20(arcadiumAddress).balanceOf(address(this));

            // calculate how much eth is needed to use all of contractTokenBalance
            // also boost precision a tad.
            uint256 totalETHNeeded = (res0 * contractTokenBalance) / res1;

            uint256 existingETH = address(this).balance;

            uint256 unmatchedArcadium = 0;

            if (existingETH < totalETHNeeded) {
                // calculate how much arcadium will match up with our existing eth.
                uint256 matchedArcadium = (res1 * existingETH) / res0;
                if (contractTokenBalance >= matchedArcadium)
                    unmatchedArcadium = contractTokenBalance - matchedArcadium;
            } else if (existingETH > totalETHNeeded) {
                // use excess eth for arcadium buy back
                uint256 excessETH = existingETH - totalETHNeeded;

                if (excessETH / 2 > 0) {
                    // swap half of the excess eth for lp to be balanced
                    swapETHForTokens(excessETH / 2, arcadiumAddress);
                }
            }

            uint256 unmatchedArcadiumToSwap = unmatchedArcadium / 2;

            // swap tokens for ETH
            if (unmatchedArcadiumToSwap > 0)
                swapTokensForEth(arcadiumAddress, unmatchedArcadiumToSwap);

            uint256 arcadiumBalance = ERC20(arcadiumAddress).balanceOf(address(this));

            // approve token transfer to cover all possible scenarios
            ERC20(arcadiumAddress).approve(address(arcadiumSwapRouter), arcadiumBalance);

            // add the liquidity
            arcadiumSwapRouter.addLiquidityETH{value: address(this).balance}(
                arcadiumAddress,
                arcadiumBalance,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                lpHolder,
                block.timestamp
            );

        }

        if (address(this).balance > 0) {
            // not going to require/check return value of this transfer as reverting behaviour is undesirable.
            payable(address(msg.sender)).call{value: address(this).balance}("");
        }

        if (ERC20(arcadiumAddress).balanceOf(address(this)) > 0)
            ERC20(arcadiumAddress).transfer(msg.sender, ERC20(arcadiumAddress).balanceOf(address(this)));
    }

    function addArcadiumETHLiquidity(uint256 nativeAmount) external payable nonReentrant {
        require(msg.value > 0, "!sufficient funds");

        ERC20(arcadiumAddress).safeTransferFrom(msg.sender, address(this), nativeAmount);

        // approve token transfer to cover all possible scenarios
        ERC20(arcadiumAddress).approve(address(arcadiumSwapRouter), nativeAmount);

        // add the liquidity
        arcadiumSwapRouter.addLiquidityETH{value: msg.value}(
            arcadiumAddress,
            nativeAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );

        if (address(this).balance > 0) {
            // not going to require/check return value of this transfer as reverting behaviour is undesirable.
            payable(address(msg.sender)).call{value: address(this).balance}("");
        }

        if (ERC20(arcadiumAddress).balanceOf(address(this)) > 0)
            ERC20(arcadiumAddress).transfer(msg.sender, ERC20(arcadiumAddress).balanceOf(address(this)));
    }

    function addArcadiumLiquidity(address baseTokenAddress, uint256 baseAmount, uint256 nativeAmount) external nonReentrant {
        ERC20(baseTokenAddress).safeTransferFrom(msg.sender, address(this), baseAmount);
        ERC20(arcadiumAddress).safeTransferFrom(msg.sender, address(this), nativeAmount);

        // approve token transfer to cover all possible scenarios
        ERC20(baseTokenAddress).approve(address(arcadiumSwapRouter), baseAmount);
        ERC20(arcadiumAddress).approve(address(arcadiumSwapRouter), nativeAmount);

        // add the liquidity
        arcadiumSwapRouter.addLiquidity(
            baseTokenAddress,
            arcadiumAddress,
            baseAmount,
            nativeAmount ,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            msg.sender,
            block.timestamp
        );

        if (ERC20(baseTokenAddress).balanceOf(address(this)) > 0)
            ERC20(baseTokenAddress).safeTransfer(msg.sender, ERC20(baseTokenAddress).balanceOf(address(this)));

        if (ERC20(arcadiumAddress).balanceOf(address(this)) > 0)
            ERC20(arcadiumAddress).transfer(msg.sender, ERC20(arcadiumAddress).balanceOf(address(this)));
    }

    function removeArcadiumLiquidity(address baseTokenAddress, uint256 liquidity) external nonReentrant {
        address lpTokenAddress = IUniswapV2Factory(arcadiumSwapRouter.factory()).getPair(baseTokenAddress, arcadiumAddress);
        require(lpTokenAddress != address(0), "pair hasn't been created yet, so can't remove liquidity!");

        ERC20(lpTokenAddress).safeTransferFrom(msg.sender, address(this), liquidity);
        // approve token transfer to cover all possible scenarios
        ERC20(lpTokenAddress).approve(address(arcadiumSwapRouter), liquidity);

        // add the liquidity
        arcadiumSwapRouter.removeLiquidity(
            baseTokenAddress,
            arcadiumAddress,
            liquidity,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            msg.sender,
            block.timestamp
        );
    }

    /// @dev Swap tokens for eth
    function swapTokensForEth(address saleTokenAddress, uint256 tokenAmount) internal {
        // generate the arcadiumSwap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = saleTokenAddress;
        path[1] = arcadiumSwapRouter.WETH();

        ERC20(saleTokenAddress).approve(address(arcadiumSwapRouter), tokenAmount);

        // make the swap
        arcadiumSwapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }


    function swapETHForTokens(uint256 ethAmount, address wantedTokenAddress) internal {
        require(address(this).balance >= ethAmount, "insufficient matic provided!");
        require(wantedTokenAddress != address(0), "wanted token address can't be the zero address!");

        // generate the arcadiumSwap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = arcadiumSwapRouter.WETH();
        path[1] = wantedTokenAddress;

        // make the swap
        arcadiumSwapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}(
            0,
            path,
            // cannot send tokens to the token contract of the same type as the output token
            address(this),
            block.timestamp
        );
    }

    /**
     * @dev set the arcadium address.
     * Can only be called by the current owner.
     */
    function setArcadiumAddress(address _arcadiumAddress) external onlyOwner {
        require(_arcadiumAddress != address(0), "_arcadiumAddress is the zero address");
        require(arcadiumAddress == address(0), "arcadiumAddress already set!");

        arcadiumAddress = _arcadiumAddress;

        arcadiumSwapPair = IUniswapV2Factory(arcadiumSwapRouter.factory()).getPair(arcadiumAddress, arcadiumSwapRouter.WETH());

        require(address(arcadiumSwapPair) != address(0), "matic pair !exist");

        emit SetArcadiumAddresses(arcadiumAddress, arcadiumSwapPair);
    }
}

File 7 of 16 : RHCPToolBox.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./IERC20.sol";

import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";

contract RHCPToolBox {

    IUniswapV2Router02 public immutable arcadiumSwapRouter;

    uint256 public immutable startBlock;

    /**
     * @notice Constructs the ArcadiumToken contract.
     */
    constructor(uint256 _startBlock, IUniswapV2Router02 _arcadiumSwapRouter) public {
        startBlock = _startBlock;
        arcadiumSwapRouter = _arcadiumSwapRouter;
    }

    function convertToTargetValueFromPair(IUniswapV2Pair pair, uint256 sourceTokenAmount, address targetAddress) public view returns (uint256) {
        require(pair.token0() == targetAddress || pair.token1() == targetAddress, "one of the pairs must be the targetAddress");
        if (sourceTokenAmount == 0)
            return 0;

        (uint256 res0, uint256 res1, ) = pair.getReserves();
        if (res0 == 0 || res1 == 0)
            return 0;

        if (pair.token0() == targetAddress)
            return (res0 * sourceTokenAmount) / res1;
        else
            return (res1 * sourceTokenAmount) / res0;
    }

    function getTokenUSDCValue(uint256 tokenBalance, address token, uint8 tokenType, bool viaMaticUSDC, address usdcAddress) external view returns (uint256) {
        require(tokenType == 0 || tokenType == 1, "invalid token type provided");
        if (token == address(usdcAddress))
            return tokenBalance;

        // lp type
        if (tokenType == 1) {
            IUniswapV2Pair lpToken = IUniswapV2Pair(token);
            if (lpToken.totalSupply() == 0)
                return 0;
            // If lp contains usdc, we can take a short-cut
            if (lpToken.token0() == address(usdcAddress)) {
                return (IERC20(lpToken.token0()).balanceOf(address(lpToken)) * tokenBalance * 2) / lpToken.totalSupply();
            } else if (lpToken.token1() == address(usdcAddress)){
                return (IERC20(lpToken.token1()).balanceOf(address(lpToken)) * tokenBalance * 2) / lpToken.totalSupply();
            }
        }

        // Only used for lp type tokens.
        address lpTokenAddress = token;
        // If token0 or token1 is bnb, use that, else use token0.
        if (tokenType == 1) {
            token = IUniswapV2Pair(token).token0() == arcadiumSwapRouter.WETH() ? arcadiumSwapRouter.WETH() :
                        (IUniswapV2Pair(token).token1() == arcadiumSwapRouter.WETH() ? arcadiumSwapRouter.WETH() : IUniswapV2Pair(token).token0());
        }

        // if it is an LP token we work with all of the reserve in the LP address to scale down later.
        uint256 tokenAmount = (tokenType == 1) ? IERC20(token).balanceOf(lpTokenAddress) : tokenBalance;

        uint256 usdcEquivalentAmount = 0;

        if (viaMaticUSDC) {
            uint256 maticAmount = 0;

            if (token == arcadiumSwapRouter.WETH()) {
                maticAmount = tokenAmount;
            } else {

                // As we arent working with usdc at this point (early return), this is okay.
                IUniswapV2Pair maticPair = IUniswapV2Pair(IUniswapV2Factory(arcadiumSwapRouter.factory()).getPair(arcadiumSwapRouter.WETH(), token));

                if (address(maticPair) == address(0))
                    return 0;

                maticAmount = convertToTargetValueFromPair(maticPair, tokenAmount, arcadiumSwapRouter.WETH());
            }

            // As we arent working with usdc at this point (early return), this is okay.
            IUniswapV2Pair usdcmaticPair = IUniswapV2Pair(IUniswapV2Factory(arcadiumSwapRouter.factory()).getPair(arcadiumSwapRouter.WETH(), address(usdcAddress)));

            if (address(usdcmaticPair) == address(0))
                return 0;

            usdcEquivalentAmount = convertToTargetValueFromPair(usdcmaticPair, maticAmount, usdcAddress);
        } else {
            // As we arent working with usdc at this point (early return), this is okay.
            IUniswapV2Pair usdcPair = IUniswapV2Pair(IUniswapV2Factory(arcadiumSwapRouter.factory()).getPair(address(usdcAddress), token));

            if (address(usdcPair) == address(0))
                return 0;

            usdcEquivalentAmount = convertToTargetValueFromPair(usdcPair, tokenAmount, usdcAddress);
        }

        // for the tokenType == 1 path usdcEquivalentAmount is the USDC value of all the tokens in the parent LP contract.

        if (tokenType == 1)
            return (usdcEquivalentAmount * tokenBalance * 2) / IUniswapV2Pair(lpTokenAddress).totalSupply();
        else
            return usdcEquivalentAmount;
    }

    function getArcadiumEmissionForBlock(uint256 _block, bool isIncreasingGradient, uint256 releaseGradient, uint256 gradientEndBlock, uint256 endEmission) public pure returns (uint256) {
        if (_block >= gradientEndBlock)
            return endEmission;

        if (releaseGradient == 0)
            return endEmission;
        uint256 currentArcadiumEmission = endEmission;
        uint256 deltaHeight = (releaseGradient * (gradientEndBlock - _block)) / 1e24;

        if (isIncreasingGradient) {
            // if there is a logical error, we return 0
            if (endEmission >= deltaHeight)
                currentArcadiumEmission = endEmission - deltaHeight;
            else
                currentArcadiumEmission = 0;
        } else
            currentArcadiumEmission = endEmission + deltaHeight;

        return currentArcadiumEmission;
    }

    function calcEmissionGradient(uint256 _block, uint256 currentEmission, uint256 gradientEndBlock, uint256 endEmission) external pure returns (uint256) {
        uint256 arcadiumReleaseGradient;

        // if the gradient is 0 we interpret that as an unchanging 0 gradient.
        if (currentEmission != endEmission && _block < gradientEndBlock) {
            bool isIncreasingGradient = endEmission > currentEmission;
            if (isIncreasingGradient)
                arcadiumReleaseGradient = ((endEmission - currentEmission) * 1e24) / (gradientEndBlock - _block);
            else
                arcadiumReleaseGradient = ((currentEmission - endEmission) * 1e24) / (gradientEndBlock - _block);
        } else
            arcadiumReleaseGradient = 0;

        return arcadiumReleaseGradient;
    }

    // Return if we are in the normal operation era, no promo
    function isFlatEmission(uint256 _gradientEndBlock, uint256 _blocknum) internal pure returns (bool) {
        return _blocknum >= _gradientEndBlock;
    }

    // Return ARCADIUM reward release over the given _from to _to block.
    function getArcadiumRelease(bool isIncreasingGradient, uint256 releaseGradient, uint256 gradientEndBlock, uint256 endEmission, uint256 _from, uint256 _to) external view returns (uint256) {
        if (_to <= _from || _to <= startBlock)
            return 0;
        uint256 clippedFrom = _from < startBlock ? startBlock : _from;
        uint256 totalWidth = _to - clippedFrom;

        if (releaseGradient == 0 || isFlatEmission(gradientEndBlock, clippedFrom))
            return totalWidth * endEmission;

        if (!isFlatEmission(gradientEndBlock, _to)) {
            uint256 heightDelta = releaseGradient * totalWidth;

            uint256 baseEmission;
            if (isIncreasingGradient)
                baseEmission = getArcadiumEmissionForBlock(_from, isIncreasingGradient, releaseGradient, gradientEndBlock, endEmission);
            else
                baseEmission = getArcadiumEmissionForBlock(_to, isIncreasingGradient, releaseGradient, gradientEndBlock, endEmission);
            return totalWidth * baseEmission + (((totalWidth * heightDelta) / 2) / 1e24);
        }

        // Special case when we are transitioning between promo and normal era.
        if (!isFlatEmission(gradientEndBlock, clippedFrom) && isFlatEmission(gradientEndBlock, _to)) {
            uint256 blocksUntilGradientEnd = gradientEndBlock - clippedFrom;
            uint256 heightDelta = releaseGradient * blocksUntilGradientEnd;

            uint256 baseEmission;
            if (isIncreasingGradient)
                baseEmission = getArcadiumEmissionForBlock(_to, isIncreasingGradient, releaseGradient, gradientEndBlock, endEmission);
            else
                baseEmission = getArcadiumEmissionForBlock(_from, isIncreasingGradient, releaseGradient, gradientEndBlock, endEmission);

            return totalWidth * baseEmission - (((blocksUntilGradientEnd * heightDelta) / 2) / 1e24);
        }

        // huh?
        // shouldnt happen, but also don't want to assert false here either.
        return 0;
    }
}

File 8 of 16 : IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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

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

File 9 of 16 : IUniswapV2Pair.sol
pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

File 10 of 16 : IUniswapV2Factory.sol
pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

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

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

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

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

File 11 of 16 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 12 of 16 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 13 of 16 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 14 of 16 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 15 of 16 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
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;
    }
}

File 16 of 16 : IUniswapV2Router01.sol
pragma solidity >=0.6.2;

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

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

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_myFriends","type":"address"},{"internalType":"contract AddLiquidityHelper","name":"_addLiquidityHelper","type":"address"},{"internalType":"contract RHCPToolBox","name":"_arcadiumToolBox","type":"address"}],"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"arcadiumSwapRouter","type":"address"},{"indexed":false,"internalType":"address","name":"arcadiumSwapPair","type":"address"}],"name":"SetArcadiumRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"SetOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"swapAndLiquifyEnabled","type":"bool"}],"name":"SetSwapAndLiquifyEnabled","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"txnFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"extraTxnFee","type":"uint256"}],"name":"TransferFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_contract","type":"address"},{"indexed":false,"internalType":"bool","name":"fromExcluded","type":"bool"},{"indexed":false,"internalType":"bool","name":"toExcluded","type":"bool"},{"indexed":false,"internalType":"bool","name":"fromHasExtra","type":"bool"},{"indexed":false,"internalType":"bool","name":"toHasExtra","type":"bool"}],"name":"UpdateFeeMaps","type":"event"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TRANSFER_TAX_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLiquidityHelper","outputs":[{"internalType":"contract AddLiquidityHelper","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","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":[],"name":"arcadiumSwapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"arcadiumSwapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"arcadiumToolBox","outputs":[{"internalType":"contract RHCPToolBox","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRate","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludeFromMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludeToMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"extraFromMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"extraToMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extraTransferTaxRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minArcadiumAmountToLiquify","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minMaticAmountToLiquify","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"myFriends","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownershipIsTransferred","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint8","name":"tokenType","type":"uint8"}],"name":"swapDepositFeeForETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"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","name":"newOperator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferTaxRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"updateArcadiumSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"fromExcluded","type":"bool"},{"internalType":"bool","name":"toExcluded","type":"bool"},{"internalType":"bool","name":"fromHasExtra","type":"bool"},{"internalType":"bool","name":"toHasExtra","type":"bool"}],"name":"updateFeeMaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"updateSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_transferTaxRate","type":"uint16"},{"internalType":"uint16","name":"_extraTransferTaxRate","type":"uint16"}],"name":"updateTransferTaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdcCurrencyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdcRewardCurrency","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdcSwapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

61010060405261029a600660006101000a81548161ffff021916908361ffff16021790555060c8600660026101000a81548161ffff021916908361ffff1602179055506001600660046101000a81548160ff0219169083151502179055506000600760156101000a81548160ff0219169083151502179055503480156200008557600080fd5b506040516200690b3803806200690b8339818101604052810190620000ab919062000629565b6040518060400160405280600881526020017f415243414449554d0000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f415243414449554d000000000000000000000000000000000000000000000000815250620001376200012b620002e460201b60201c565b620002ec60201b60201c565b81600490805190602001906200014f92919062000534565b5080600590805190602001906200016892919062000534565b5050508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508273ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050732791bca1f2de4661ed88a30c99a7a9449aa8417473ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250506200026b620002e460201b60201c565b600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002db733a1d1114269d7a786c154fe5278bf5b1e3e20d316944d249099c33a1200000620003b060201b60201c565b505050620008e9565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000423576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041a90620006b7565b60405180910390fd5b62000437600083836200052a60201b60201c565b80600360008282546200044b919062000707565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620004a3919062000707565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200050a9190620006d9565b60405180910390a362000526600083836200052f60201b60201c565b5050565b505050565b505050565b8280546200054290620007de565b90600052602060002090601f016020900481019282620005665760008555620005b2565b82601f106200058157805160ff1916838001178555620005b2565b82800160010185558215620005b2579182015b82811115620005b157825182559160200191906001019062000594565b5b509050620005c19190620005c5565b5090565b5b80821115620005e0576000816000905550600101620005c6565b5090565b600081519050620005f5816200089b565b92915050565b6000815190506200060c81620008b5565b92915050565b6000815190506200062381620008cf565b92915050565b6000806000606084860312156200063f57600080fd5b60006200064f86828701620005e4565b93505060206200066286828701620005fb565b9250506040620006758682870162000612565b9150509250925092565b60006200068e601f83620006f6565b91506200069b8262000872565b602082019050919050565b620006b181620007d4565b82525050565b60006020820190508181036000830152620006d2816200067f565b9050919050565b6000602082019050620006f06000830184620006a6565b92915050565b600082825260208201905092915050565b60006200071482620007d4565b91506200072183620007d4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000759576200075862000814565b5b828201905092915050565b60006200077182620007b4565b9050919050565b60006200078582620007b4565b9050919050565b6000620007998262000778565b9050919050565b6000620007ad8262000764565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620007f757607f821691505b602082108114156200080e576200080d62000843565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b620008a68162000764565b8114620008b257600080fd5b50565b620008c0816200078c565b8114620008cc57600080fd5b50565b620008da81620007a0565b8114620008e657600080fd5b50565b60805160601c60a05160601c60c05160601c60e05160601c615f9d6200096e60003960008181611b35015281816142c101526143c30152600081816110e001528181611e9701526140820152600081816110170152611e2301526000818161150e01528181612468015281816124bd01528181613410015261352a0152615f9d6000f3fe6080604052600436106102605760003560e01c80636b68770511610144578063b64030de116100b6578063d84011aa1161007a578063d84011aa14610937578063dd62ed3e14610962578063e1e99d8d1461099f578063f2fde38b146109ca578063f4198508146109f3578063fccc281314610a1c57610267565b8063b64030de1461084e578063b65d08b014610879578063bed99850146108a4578063d40154a8146108cf578063d50ab321146108fa57610267565b80638da5cb5b116101085780638da5cb5b1461072a57806395d89b41146107555780639eda18fd146107805780639f9a4e7f146107ab578063a457c2d7146107d4578063a9059cbb1461081157610267565b80636b687705146106575780636d7d7ee71461068057806370a08231146106ab578063715018a6146106e857806384a8b5db146106ff57610267565b806329605e77116101dd57806340c10f19116101a157806340c10f19146105455780634a74bb021461056e578063570ca735146105995780635bf43a97146105c457806363db1c0b146105ef57806366371cb91461062c57610267565b806329605e7714610460578063313ce5671461048957806331b782f0146104b45780633284c8b4146104dd578063395093511461050857610267565b80631234b31c116102245780631234b31c1461037757806318160ddd146103a25780631ad9339a146103cd57806323b872dd146103f8578063278601c41461043557610267565b806306fdde031461026c57806308cb8eca14610297578063095ea7b3146102d45780630bad5513146103115780630dd290b01461033a57610267565b3661026757005b600080fd5b34801561027857600080fd5b50610281610a47565b60405161028e9190615235565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b99190614927565b610ad9565b6040516102cb91906151ae565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190614a7b565b610af9565b60405161030891906151ae565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190614b45565b610b17565b005b34801561034657600080fd5b50610361600480360381019061035c9190614927565b610c96565b60405161036e91906151ae565b60405180910390f35b34801561038357600080fd5b5061038c610cb6565b60405161039991906151ff565b60405180910390f35b3480156103ae57600080fd5b506103b7610cdc565b6040516103c4919061553b565b60405180910390f35b3480156103d957600080fd5b506103e2610ce6565b6040516103ef91906154f7565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a91906149b5565b610cec565b60405161042c91906151ae565b60405180910390f35b34801561044157600080fd5b5061044a610de4565b604051610457919061553b565b60405180910390f35b34801561046c57600080fd5b5061048760048036038101906104829190614927565b610df1565b005b34801561049557600080fd5b5061049e610f8e565b6040516104ab919061561e565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190614ab7565b610f97565b005b3480156104e957600080fd5b506104f2611342565b6040516104ff919061553b565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a9190614a7b565b61134a565b60405161053c91906151ae565b60405180910390f35b34801561055157600080fd5b5061056c60048036038101906105679190614a7b565b6113f6565b005b34801561057a57600080fd5b506105836114cf565b60405161059091906151ae565b60405180910390f35b3480156105a557600080fd5b506105ae6114e2565b6040516105bb919061507f565b60405180910390f35b3480156105d057600080fd5b506105d961150c565b6040516105e691906151c9565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190614927565b611530565b60405161062391906151ae565b60405180910390f35b34801561063857600080fd5b50610641611550565b60405161064e919061507f565b60405180910390f35b34801561066357600080fd5b5061067e60048036038101906106799190614927565b611568565b005b34801561068c57600080fd5b50610695611a55565b6040516106a2919061553b565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190614927565b611a62565b6040516106df919061553b565b60405180910390f35b3480156106f457600080fd5b506106fd611aab565b005b34801561070b57600080fd5b50610714611b33565b604051610721919061507f565b60405180910390f35b34801561073657600080fd5b5061073f611b57565b60405161074c919061507f565b60405180910390f35b34801561076157600080fd5b5061076a611b80565b6040516107779190615235565b60405180910390f35b34801561078c57600080fd5b50610795611c12565b6040516107a291906151ae565b60405180910390f35b3480156107b757600080fd5b506107d260048036038101906107cd9190614af3565b611c25565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190614a7b565b611d18565b60405161080891906151ae565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190614a7b565b611e03565b60405161084591906151ae565b60405180910390f35b34801561085a57600080fd5b50610863611e21565b604051610870919061521a565b60405180910390f35b34801561088557600080fd5b5061088e611e45565b60405161089b91906154f7565b60405180910390f35b3480156108b057600080fd5b506108b9611e59565b6040516108c69190615603565b60405180910390f35b3480156108db57600080fd5b506108e4611e61565b6040516108f191906154f7565b60405180910390f35b34801561090657600080fd5b50610921600480360381019061091c9190614927565b611e75565b60405161092e91906151ae565b60405180910390f35b34801561094357600080fd5b5061094c611e95565b60405161095991906151e4565b60405180910390f35b34801561096e57600080fd5b5061098960048036038101906109849190614979565b611eb9565b604051610996919061553b565b60405180910390f35b3480156109ab57600080fd5b506109b4611f40565b6040516109c1919061507f565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec9190614927565b611f66565b005b3480156109ff57600080fd5b50610a1a6004803603810190610a159190614a04565b612059565b005b348015610a2857600080fd5b50610a3161228b565b604051610a3e919061507f565b60405180910390f35b606060048054610a569061594b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a829061594b565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b5050505050905090565b60096020528060005260406000206000915054906101000a900460ff1681565b6000610b0d610b06612291565b8484612299565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9e90615297565b60405180910390fd5b6103e961ffff168183610bba91906156a4565b61ffff161115610bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf6906154b7565b60405180910390fd5b81600660006101000a81548161ffff021916908361ffff16021790555080600660026101000a81548161ffff021916908361ffff1602179055507fac8d13f8c445d614898726a3e8c94776304ad684f6024c1c5d361d520c503c44600660009054906101000a900461ffff16600660029054906101000a900461ffff16604051610c8a929190615512565b60405180910390a15050565b600b6020528060005260406000206000915054906101000a900460ff1681565b600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600354905090565b6103e981565b6000610cf9848484612464565b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d44612291565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb906153d7565b60405180910390fd5b610dd885610dd0612291565b858403612299565b60019150509392505050565b68056bc75e2d6310000081565b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7890615297565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee8906152f7565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051610f83919061507f565b60405180910390a150565b60006012905090565b610f9f612291565b73ffffffffffffffffffffffffffffffffffffffff16610fbd611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a906153f7565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fdb6c9d88473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161108a919061507f565b60206040518083038186803b1580156110a257600080fd5b505afa1580156110b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110da9190614b81565b858560007f00000000000000000000000000000000000000000000000000000000000000006040518663ffffffff1660e01b815260040161111f959493929190615556565b60206040518083038186803b15801561113757600080fd5b505afa15801561114b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116f9190614b81565b90503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806112755750600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561120e57600080fd5b505afa158015611222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112469190614950565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15611280575061133e565b6301312d00811015611292575061133e565b61133c8383600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156112ff57600080fd5b505afa158015611313573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113379190614950565b61295a565b505b5050565b6301312d0081565b60006113ec611357612291565b848460026000611365612291565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113e791906156dc565b612299565b6001905092915050565b6113fe612291565b73ffffffffffffffffffffffffffffffffffffffff1661141c611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611472576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611469906153f7565b60405180910390fd5b600760159054906101000a900460ff166114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b8906153b7565b60405180910390fd5b6114cb8282612d6b565b5050565b600660049054906101000a900460ff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60086020528060005260406000206000915054906101000a900460ff1681565b732791bca1f2de4661ed88a30c99a7a9449aa8417481565b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90615297565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f906152f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f090615317565b60405180910390fd5b80600660056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117da9190614950565b73ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561185e57600080fd5b505afa158015611872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118969190614950565b6040518363ffffffff1660e01b81526004016118b392919061509a565b60206040518083038186803b1580156118cb57600080fd5b505afa1580156118df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119039190614950565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cc90615357565b60405180910390fd5b7f5998345ff8c821b7770de134c2d1e7da3480a1e24f6049877d091850f9a5e1f9600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051611a4a92919061509a565b60405180910390a150565b68022b1c8c1227a0000081565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ab3612291565b73ffffffffffffffffffffffffffffffffffffffff16611ad1611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e906153f7565b60405180910390fd5b611b316000612ecc565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054611b8f9061594b565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbb9061594b565b8015611c085780601f10611bdd57610100808354040283529160200191611c08565b820191906000526020600020905b815481529060010190602001808311611beb57829003601f168201915b5050505050905090565b600760159054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cac90615297565b60405180910390fd5b80600660046101000a81548160ff0219169083151502179055507f231b79961627ba3a4195210ceb54477d25023b9333343ce8b33d4ff9561bc472600660049054906101000a900460ff16604051611d0d91906151ae565b60405180910390a150565b60008060026000611d27612291565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddb90615497565b60405180910390fd5b611df8611def612291565b85858403612299565b600191505092915050565b6000611e17611e10612291565b8484612464565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600660009054906101000a900461ffff1681565b6320c175ed81565b600660029054906101000a900461ffff1681565b600a6020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f6e612291565b73ffffffffffffffffffffffffffffffffffffffff16611f8c611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd9906153f7565b60405180910390fd5b600760159054906101000a900460ff1615612032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202990615317565b60405180910390fd5b61203b81612f90565b6001600760156101000a81548160ff02191690831515021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e090615297565b60405180910390fd5b83600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ffa891966a4b8909e23aaab90f93978d373c58650d01896aa59e3779a96ec76eb858585858560405161227c959493929190615132565b60405180910390a15050505050565b61dead81565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230090615437565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612379576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612370906152d7565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612457919061553b565b60405180910390a3505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061250b57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b905060011515600660049054906101000a900460ff161515148015612543575060001515600760149054906101000a900460ff161515145b801561259e5750600073ffffffffffffffffffffffffffffffffffffffff16600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156125a8575080155b80156126025750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156126415750612611611b57565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561264f5761264e613088565b5b8080612688575061dead73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806126c757506000600660009054906101000a900461ffff1661ffff161480156126c657506000600660029054906101000a900461ffff1661ffff16145b5b8061271b5750600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061276f5750600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156127845761277f848484613612565b612954565b6000612710600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061282a5750600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612835576000612847565b600660029054906101000a900461ffff165b600660009054906101000a900461ffff1661286291906156a4565b61ffff16846128719190615763565b61287b9190615732565b90506000633b9aca006320c175ed63ffffffff168361289a9190615763565b6128a49190615732565b9050600081836128b491906157bd565b9050600083866128c491906157bd565b905083816128d291906156dc565b861480156128ea575081836128e791906156dc565b84145b612929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292090615277565b60405180910390fd5b6129368861dead85613612565b612941883084613612565b61294c888883613612565b809550505050505b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612995919061507f565b60206040518083038186803b1580156129ad57600080fd5b505afa1580156129c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129e59190614b81565b90508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a215750600081145b80612a5757503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15612a625750612d66565b60018360ff161415612a7e57612a788482613896565b50612d66565b8373ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612adb929190615185565b602060405180830381600087803b158015612af557600080fd5b505af1158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d9190614b1c565b612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6390615397565b60405180910390fd5b6000600267ffffffffffffffff811115612baf577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612bdd5781602001602082028036833780820191505090505b5090508481600081518110612c1b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281600181518110612c90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958360008430426040518663ffffffff1660e01b8152600401612d2e9594939291906155a9565b600060405180830381600087803b158015612d4857600080fd5b505af1925050508015612d59575060015b612d6257612d63565b5b50505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd2906154d7565b60405180910390fd5b612de760008383614582565b8060036000828254612df991906156dc565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e4f91906156dc565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612eb4919061553b565b60405180910390a3612ec860008383614587565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f98612291565b73ffffffffffffffffffffffffffffffffffffffff16612fb6611b57565b73ffffffffffffffffffffffffffffffffffffffff161461300c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613003906153f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561307c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613073906152b7565b60405180910390fd5b61308581612ecc565b50565b6001600760146101000a81548160ff0219169083151502179055506000600660009054906101000a900461ffff1690506000600660029054906101000a900461ffff1690506000600660006101000a81548161ffff021916908361ffff1602179055506000600660026101000a81548161ffff021916908361ffff16021790555060003073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613144919061507f565b60206040518083038186803b15801561315c57600080fd5b505afa158015613170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131949190614b81565b90506000600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561320057600080fd5b505afa158015613214573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132389190614950565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613270919061507f565b60206040518083038186803b15801561328857600080fd5b505afa15801561329c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c09190614b81565b9050600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561332a57600080fd5b505afa15801561333e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133629190614950565b73ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040161339a919061553b565b600060405180830381600087803b1580156133b457600080fd5b505af11580156133c8573d6000803e3d6000fd5b5050505068056bc75e2d63100000471015806133ed575068022b1c8c1227a000008210155b156135b7573073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f00000000000000000000000000000000000000000000000000000000000000003073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613468919061507f565b60206040518083038186803b15801561348057600080fd5b505afa158015613494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b89190614b81565b6040518363ffffffff1660e01b81526004016134d5929190615185565b602060405180830381600087803b1580156134ef57600080fd5b505af1158015613503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135279190614b1c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d21887d84761dead6040518363ffffffff1660e01b8152600401613584919061507f565b6000604051808303818588803b15801561359d57600080fd5b505af11580156135b1573d6000803e3d6000fd5b50505050505b505081600660006101000a81548161ffff021916908361ffff16021790555080600660026101000a81548161ffff021916908361ffff16021790555050506000600760146101000a81548160ff021916908315150217905550565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367990615417565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e990615257565b60405180910390fd5b6136fd838383614582565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377b90615337565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461381991906156dc565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161387d919061553b565b60405180910390a3613890848484614587565b50505050565b8173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016138f3929190615185565b602060405180830381600087803b15801561390d57600080fd5b505af1158015613921573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139459190614b1c565b613984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397b90615397565b60405180910390fd5b600082905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156139d157600080fd5b505afa1580156139e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a099190614950565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613a41919061507f565b60206040518083038186803b158015613a5957600080fd5b505afa158015613a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a919190614b81565b905060008273ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015613adb57600080fd5b505afa158015613aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b139190614950565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613b4b919061507f565b60206040518083038186803b158015613b6357600080fd5b505afa158015613b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9b9190614b81565b9050600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663baa2abde8473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015613c2157600080fd5b505afa158015613c35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c599190614950565b8573ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015613c9f57600080fd5b505afa158015613cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd79190614950565b8760008030426040518863ffffffff1660e01b8152600401613cff97969594939291906150c3565b6040805180830381600087803b158015613d1857600080fd5b505af1158015613d2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d509190614baa565b50506000828473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015613d9b57600080fd5b505afa158015613daf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dd39190614950565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613e0b919061507f565b60206040518083038186803b158015613e2357600080fd5b505afa158015613e37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e5b9190614b81565b613e6591906157bd565b90506000828573ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015613eb057600080fd5b505afa158015613ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ee89190614950565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613f20919061507f565b60206040518083038186803b158015613f3857600080fd5b505afa158015613f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f709190614b81565b613f7a91906157bd565b905060008573ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015613fc457600080fd5b505afa158015613fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ffc9190614950565b905060008673ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561404657600080fd5b505afa15801561405a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407e9190614950565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156140fd57600080fd5b505afa158015614111573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141359190614950565b73ffffffffffffffffffffffffffffffffffffffff16141561416057818180935081925050506142bc565b600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156141c857600080fd5b505afa1580156141dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142009190614950565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561425c57600080fd5b505afa158015614270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142949190614950565b73ffffffffffffffffffffffffffffffffffffffff1614156142bb57818180935081925050505b5b6143be7f00000000000000000000000000000000000000000000000000000000000000008873ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561432657600080fd5b505afa15801561433a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061435e9190614950565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146143965784614398565b855b8473ffffffffffffffffffffffffffffffffffffffff1661458c9092919063ffffffff16565b6144cc7f000000000000000000000000000000000000000000000000000000000000000060028973ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561442a57600080fd5b505afa15801561443e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144629190614950565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461449a578561449c565b865b6144a69190615732565b8373ffffffffffffffffffffffffffffffffffffffff1661458c9092919063ffffffff16565b614577816000600660059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561453a57600080fd5b505afa15801561454e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145729190614950565b61295a565b505050505050505050565b505050565b505050565b61460d8363a9059cbb60e01b84846040516024016145ab929190615185565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614612565b505050565b6000614674826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166146d99092919063ffffffff16565b90506000815111156146d457808060200190518101906146949190614b1c565b6146d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016146ca90615477565b60405180910390fd5b5b505050565b60606146e884846000856146f1565b90509392505050565b606082471015614736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161472d90615377565b60405180910390fd5b61473f85614805565b61477e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161477590615457565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516147a79190615068565b60006040518083038185875af1925050503d80600081146147e4576040519150601f19603f3d011682016040523d82523d6000602084013e6147e9565b606091505b50915091506147f9828286614818565b92505050949350505050565b600080823b905060008111915050919050565b6060831561482857829050614878565b60008351111561483b5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161486f9190615235565b60405180910390fd5b9392505050565b60008135905061488e81615ef4565b92915050565b6000815190506148a381615ef4565b92915050565b6000813590506148b881615f0b565b92915050565b6000815190506148cd81615f0b565b92915050565b6000813590506148e281615f22565b92915050565b6000813590506148f781615f39565b92915050565b60008151905061490c81615f39565b92915050565b60008135905061492181615f50565b92915050565b60006020828403121561493957600080fd5b60006149478482850161487f565b91505092915050565b60006020828403121561496257600080fd5b600061497084828501614894565b91505092915050565b6000806040838503121561498c57600080fd5b600061499a8582860161487f565b92505060206149ab8582860161487f565b9150509250929050565b6000806000606084860312156149ca57600080fd5b60006149d88682870161487f565b93505060206149e98682870161487f565b92505060406149fa868287016148e8565b9150509250925092565b600080600080600060a08688031215614a1c57600080fd5b6000614a2a8882890161487f565b9550506020614a3b888289016148a9565b9450506040614a4c888289016148a9565b9350506060614a5d888289016148a9565b9250506080614a6e888289016148a9565b9150509295509295909350565b60008060408385031215614a8e57600080fd5b6000614a9c8582860161487f565b9250506020614aad858286016148e8565b9150509250929050565b60008060408385031215614aca57600080fd5b6000614ad88582860161487f565b9250506020614ae985828601614912565b9150509250929050565b600060208284031215614b0557600080fd5b6000614b13848285016148a9565b91505092915050565b600060208284031215614b2e57600080fd5b6000614b3c848285016148be565b91505092915050565b60008060408385031215614b5857600080fd5b6000614b66858286016148d3565b9250506020614b77858286016148d3565b9150509250929050565b600060208284031215614b9357600080fd5b6000614ba1848285016148fd565b91505092915050565b60008060408385031215614bbd57600080fd5b6000614bcb858286016148fd565b9250506020614bdc858286016148fd565b9150509250929050565b6000614bf28383614bfe565b60208301905092915050565b614c07816157f1565b82525050565b614c16816157f1565b82525050565b6000614c2782615649565b614c318185615677565b9350614c3c83615639565b8060005b83811015614c6d578151614c548882614be6565b9750614c5f8361566a565b925050600181019050614c40565b5085935050505092915050565b614c8381615803565b82525050565b6000614c9482615654565b614c9e8185615688565b9350614cae818560208601615918565b80840191505092915050565b614cc381615864565b82525050565b614cd281615888565b82525050565b614ce1816158ac565b82525050565b614cf0816158d0565b82525050565b614cff816158f4565b82525050565b6000614d108261565f565b614d1a8185615693565b9350614d2a818560208601615918565b614d3381615a0a565b840191505092915050565b6000614d4b602383615693565b9150614d5682615a1b565b604082019050919050565b6000614d6e600983615693565b9150614d7982615a6a565b602082019050919050565b6000614d91600983615693565b9150614d9c82615a93565b602082019050919050565b6000614db4602683615693565b9150614dbf82615abc565b604082019050919050565b6000614dd7602283615693565b9150614de282615b0b565b604082019050919050565b6000614dfa600383615693565b9150614e0582615b5a565b602082019050919050565b6000614e1d600683615693565b9150614e2882615b83565b602082019050919050565b6000614e40602683615693565b9150614e4b82615bac565b604082019050919050565b6000614e63601183615693565b9150614e6e82615bfb565b602082019050919050565b6000614e86602683615693565b9150614e9182615c24565b604082019050919050565b6000614ea9600983615693565b9150614eb482615c73565b602082019050919050565b6000614ecc600a83615693565b9150614ed782615c9c565b602082019050919050565b6000614eef602883615693565b9150614efa82615cc5565b604082019050919050565b6000614f12602083615693565b9150614f1d82615d14565b602082019050919050565b6000614f35602583615693565b9150614f4082615d3d565b604082019050919050565b6000614f58602483615693565b9150614f6382615d8c565b604082019050919050565b6000614f7b601d83615693565b9150614f8682615ddb565b602082019050919050565b6000614f9e602a83615693565b9150614fa982615e04565b604082019050919050565b6000614fc1602583615693565b9150614fcc82615e53565b604082019050919050565b6000614fe4600683615693565b9150614fef82615ea2565b602082019050919050565b6000615007601f83615693565b915061501282615ecb565b602082019050919050565b6150268161580f565b82525050565b61503581615906565b82525050565b6150448161583d565b82525050565b61505381615847565b82525050565b61506281615857565b82525050565b60006150748284614c89565b915081905092915050565b60006020820190506150946000830184614c0d565b92915050565b60006040820190506150af6000830185614c0d565b6150bc6020830184614c0d565b9392505050565b600060e0820190506150d8600083018a614c0d565b6150e56020830189614c0d565b6150f2604083018861503b565b6150ff6060830187614cf6565b61510c6080830186614cf6565b61511960a0830185614c0d565b61512660c083018461503b565b98975050505050505050565b600060a0820190506151476000830188614c0d565b6151546020830187614c7a565b6151616040830186614c7a565b61516e6060830185614c7a565b61517b6080830184614c7a565b9695505050505050565b600060408201905061519a6000830185614c0d565b6151a7602083018461503b565b9392505050565b60006020820190506151c36000830184614c7a565b92915050565b60006020820190506151de6000830184614cba565b92915050565b60006020820190506151f96000830184614cc9565b92915050565b60006020820190506152146000830184614cd8565b92915050565b600060208201905061522f6000830184614ce7565b92915050565b6000602082019050818103600083015261524f8184614d05565b905092915050565b6000602082019050818103600083015261527081614d3e565b9050919050565b6000602082019050818103600083015261529081614d61565b9050919050565b600060208201905081810360008301526152b081614d84565b9050919050565b600060208201905081810360008301526152d081614da7565b9050919050565b600060208201905081810360008301526152f081614dca565b9050919050565b6000602082019050818103600083015261531081614ded565b9050919050565b6000602082019050818103600083015261533081614e10565b9050919050565b6000602082019050818103600083015261535081614e33565b9050919050565b6000602082019050818103600083015261537081614e56565b9050919050565b6000602082019050818103600083015261539081614e79565b9050919050565b600060208201905081810360008301526153b081614e9c565b9050919050565b600060208201905081810360008301526153d081614ebf565b9050919050565b600060208201905081810360008301526153f081614ee2565b9050919050565b6000602082019050818103600083015261541081614f05565b9050919050565b6000602082019050818103600083015261543081614f28565b9050919050565b6000602082019050818103600083015261545081614f4b565b9050919050565b6000602082019050818103600083015261547081614f6e565b9050919050565b6000602082019050818103600083015261549081614f91565b9050919050565b600060208201905081810360008301526154b081614fb4565b9050919050565b600060208201905081810360008301526154d081614fd7565b9050919050565b600060208201905081810360008301526154f081614ffa565b9050919050565b600060208201905061550c600083018461501d565b92915050565b6000604082019050615527600083018561502c565b615534602083018461502c565b9392505050565b6000602082019050615550600083018461503b565b92915050565b600060a08201905061556b600083018861503b565b6155786020830187614c0d565b6155856040830186615059565b6155926060830185614c7a565b61559f6080830184614c0d565b9695505050505050565b600060a0820190506155be600083018861503b565b6155cb6020830187614cf6565b81810360408301526155dd8186614c1c565b90506155ec6060830185614c0d565b6155f9608083018461503b565b9695505050505050565b6000602082019050615618600083018461504a565b92915050565b60006020820190506156336000830184615059565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006156af8261580f565b91506156ba8361580f565b92508261ffff038211156156d1576156d061597d565b5b828201905092915050565b60006156e78261583d565b91506156f28361583d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156157275761572661597d565b5b828201905092915050565b600061573d8261583d565b91506157488361583d565b925082615758576157576159ac565b5b828204905092915050565b600061576e8261583d565b91506157798361583d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157b2576157b161597d565b5b828202905092915050565b60006157c88261583d565b91506157d38361583d565b9250828210156157e6576157e561597d565b5b828203905092915050565b60006157fc8261581d565b9050919050565b60008115159050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b600061586f82615876565b9050919050565b60006158818261581d565b9050919050565b60006158938261589a565b9050919050565b60006158a58261581d565b9050919050565b60006158b7826158be565b9050919050565b60006158c98261581d565b9050919050565b60006158db826158e2565b9050919050565b60006158ed8261581d565b9050919050565b60006158ff8261583d565b9050919050565b60006159118261580f565b9050919050565b60005b8381101561593657808201518184015260208101905061591b565b83811115615945576000848401525b50505050565b6000600282049050600182168061596357607f821691505b60208210811415615977576159766159db565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f73756d206572726f720000000000000000000000000000000000000000000000600082015250565b7f216f70657261746f720000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f2121300000000000000000000000000000000000000000000000000000000000600082015250565b7f21756e7365740000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f6d61746963207061697220216578697374000000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f21617070726f7665640000000000000000000000000000000000000000000000600082015250565b7f746f6f206561726c792100000000000000000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f2176616c69640000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b615efd816157f1565b8114615f0857600080fd5b50565b615f1481615803565b8114615f1f57600080fd5b50565b615f2b8161580f565b8114615f3657600080fd5b50565b615f428161583d565b8114615f4d57600080fd5b50565b615f5981615857565b8114615f6457600080fd5b5056fea26469706673582212204e5f2e1da8aed082471693f15449494a0439b2d851dc2cd4648ca7f1cb4e9e7264736f6c63430008030033000000000000000000000000a509da749745ac07e9ae47e7a092ead2648b47f200000000000000000000000075ef87c8994c6c7bc07c80fef255afb32dce77c2000000000000000000000000add074dd2a2ce3552768fa75152ad53ac2842edc

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

000000000000000000000000a509da749745ac07e9ae47e7a092ead2648b47f200000000000000000000000075ef87c8994c6c7bc07c80fef255afb32dce77c2000000000000000000000000add074dd2a2ce3552768fa75152ad53ac2842edc

-----Decoded View---------------
Arg [0] : _myFriends (address): 0xa509da749745ac07e9ae47e7a092ead2648b47f2
Arg [1] : _addLiquidityHelper (address): 0x75ef87c8994c6c7bc07c80fef255afb32dce77c2
Arg [2] : _arcadiumToolBox (address): 0xadd074dd2a2ce3552768fa75152ad53ac2842edc

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000a509da749745ac07e9ae47e7a092ead2648b47f2
Arg [1] : 00000000000000000000000075ef87c8994c6c7bc07c80fef255afb32dce77c2
Arg [2] : 000000000000000000000000add074dd2a2ce3552768fa75152ad53ac2842edc


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.