ETH Price: $2,634.54 (-2.28%)

Contract

0xC7B89491Bb148551547837ea6ccB4Bb5144d8E47
 

Overview

ETH Balance

0.209051482330203098 ETH

Eth Value

$550.76 (@ $2,634.54/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer208737352024-10-01 22:49:2329 days ago1727822963IN
0xC7B89491...5144d8E47
0 ETH0.001175267.97064732
Approve197806642024-05-02 6:30:59182 days ago1714631459IN
0xC7B89491...5144d8E47
0 ETH0.0002647110.8955405
Approve197806632024-05-02 6:30:47182 days ago1714631447IN
0xC7B89491...5144d8E47
0 ETH0.000240729.90820224
Approve187475652023-12-09 8:45:35327 days ago1702111535IN
0xC7B89491...5144d8E47
0 ETH0.0018187439.04551994
Transfer From186787972023-11-29 17:36:11336 days ago1701279371IN
0xC7B89491...5144d8E47
0 ETH0.004692634.56877589
Approve185233582023-11-07 23:27:11358 days ago1699399631IN
0xC7B89491...5144d8E47
0 ETH0.0015747333.97348855
Approve183155472023-10-09 21:19:23387 days ago1696886363IN
0xC7B89491...5144d8E47
0 ETH0.00037668.14603359
Transfer183154472023-10-09 20:59:11387 days ago1696885151IN
0xC7B89491...5144d8E47
0 ETH0.001147797.78433155
Approve179915162023-08-25 11:49:35433 days ago1692964175IN
0xC7B89491...5144d8E47
0 ETH0.0006539914.13133494
Approve179913782023-08-25 11:21:59433 days ago1692962519IN
0xC7B89491...5144d8E47
0 ETH0.0006223213.44697883
Approve179597542023-08-21 1:13:23437 days ago1692580403IN
0xC7B89491...5144d8E47
0 ETH0.0005928512.81342046
Approve179596222023-08-21 0:46:59437 days ago1692578819IN
0xC7B89491...5144d8E47
0 ETH0.000550711.83808205
Approve179488222023-08-19 12:29:11439 days ago1692448151IN
0xC7B89491...5144d8E47
0 ETH0.0008976819.2718483
Approve179087202023-08-13 21:47:47444 days ago1691963267IN
0xC7B89491...5144d8E47
0 ETH0.0006368313.69308136
Approve179071382023-08-13 16:29:59444 days ago1691944199IN
0xC7B89491...5144d8E47
0 ETH0.0006957814.94127383
Approve177843042023-07-27 12:09:11462 days ago1690459751IN
0xC7B89491...5144d8E47
0 ETH0.0010088821.80533841
Transfer From177842922023-07-27 12:06:47462 days ago1690459607IN
0xC7B89491...5144d8E47
0 ETH0.0032633320.66550636
Approve177490632023-07-22 13:47:59466 days ago1690033679IN
0xC7B89491...5144d8E47
0 ETH0.00102321.99061333
Approve173632742023-05-29 7:51:35521 days ago1685346695IN
0xC7B89491...5144d8E47
0 ETH0.0007815632.16849463
Approve170861372023-04-20 7:05:47560 days ago1681974347IN
0xC7B89491...5144d8E47
0 ETH0.0014544159.86239387
Approve170615712023-04-16 19:41:23563 days ago1681674083IN
0xC7B89491...5144d8E47
0 ETH0.0014586731.52654253
Transfer170615622023-04-16 19:39:11563 days ago1681673951IN
0xC7B89491...5144d8E47
0 ETH0.0037254325.27003676
Approve170611672023-04-16 18:18:59563 days ago1681669139IN
0xC7B89491...5144d8E47
0 ETH0.0012717327.48638304
Approve170555682023-04-15 23:14:23564 days ago1681600463IN
0xC7B89491...5144d8E47
0 ETH0.0010534522.79217271
Approve170547182023-04-15 20:21:35564 days ago1681590095IN
0xC7B89491...5144d8E47
0 ETH0.0013326428.79529822
View all transactions

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
161693492022-12-12 14:53:47688 days ago1670856827
0xC7B89491...5144d8E47
0.20903148 ETH
161693492022-12-12 14:53:47688 days ago1670856827
0xC7B89491...5144d8E47
0.93598659 ETH
161693492022-12-12 14:53:47688 days ago1670856827
0xC7B89491...5144d8E47
0.93598659 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ePING

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-28
*/

/**	
 * 
$$$$$$$\        $$$$$$\       $$\   $$\        $$$$$$\  
$$  __$$\       \_$$  _|      $$$\  $$ |      $$  __$$\ 
$$ |  $$ |        $$ |        $$$$\ $$ |      $$ /  \__|
$$$$$$$  |        $$ |        $$ $$\$$ |      $$ |$$$$\ 
$$  ____/         $$ |        $$ \$$$$ |      $$ |\_$$ |
$$ |              $$ |        $$ |\$$$ |      $$ |  $$ |
$$ |            $$$$$$\       $$ | \$$ |      \$$$$$$  |
\__|            \______|      \__|  \__|       \______/ 
                                                        
*                                                   
*/  
/* PING
*
* Taxes structure:
*
* 3% taxes for Liquidity
* 2% reflected to HODLERS
* 3% operation/dev/marketing wallet
* 2% research wallet
*
* Total supply: 4 billion tokens.

https://www.sonarplatform.io/

World's first crypto metatracker - AI-driven data aggregation platform

*
*/

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.
     */
     function mint(address from, uint256 value) external;
     function burn(address from, uint256 value) external;

    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: @openzeppelin/contracts/math/SafeMath.sol


pragma solidity ^0.8.0;

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }
    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


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 GSN 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 payable) {
        address addr = msg.sender;
        address payable Sender = payable(addr);
        return Sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


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;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

pragma solidity ^0.8.0;

/**
 * @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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @uniswap/v2-periphery/contracts/interfaces/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);
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

//pragma solidity >=0.6.2;


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: @uniswap/v2-core/contracts/interfaces/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: contracts/PING.sol

pragma solidity ^0.8.0;
// SPDX-License-Identifier: None

/* PING
*
* Taxes structure:
*
* 3% taxes for Liquidity
* 2% reflected to HODLERS
* 3% operation/dev/marketing wallet
* 2% research wallet
*
*
*/

contract ePING is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcluded;
    mapping(address => bool) public adminAddresses;
    address[] private _excluded;
    bool public isWalletTransferFeeEnabled = false;
    bool public isContractTransferFeeEnabled = true;

    string private constant _name = "ePING";
    string private constant _symbol = "ePING";
    uint8 private constant _decimals = 9;

    uint256 private constant MAX = 16 * 10**36 * 10**_decimals;
    uint256 private  _tTotal = 1 * 10**0 * 10**_decimals;
    
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tRfiTotal;
    uint256 public numOfHODLers;
    uint256 private _tDevelopmentTotal;
    uint256 private _tResearchTotal;
    
    //@dev enable optimisation to pack this in 32b
    struct feeRatesStruct {
      uint8 rfi;
      uint8 liquidity;
      uint8 research;
      uint8 dev;
    }

    feeRatesStruct public feeRates = feeRatesStruct(
     {rfi: 2,
      liquidity: 6,
      research: 1,
      dev: 1}); //32 bytes - perfect, as it should be

    struct valuesFromGetValues{
      uint256 rAmount;
      uint256 rTransferAmount;
      uint256 rRfi;
      uint256 tTransferAmount;
      uint256 tRfi;
      uint256 tLiquidity;
      uint256 tResearch;
      uint256 tDev;
    }

    address public researchWallet;
    address public devWallet;
    mapping (address => bool) public isPresaleWallet;//exclude presaleWallet from max transaction limit, so that public can claim tokens.
    
    IUniswapV2Router02 public  PancakeSwapV2Router;
    address public  pancakeswapV2Pair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;

    uint256 public _maxTxAmount = 4 * 10**9  * 10**_decimals;  
    uint256 public numTokensSellToAddToLiquidity = 4 * 10**6 * 10**_decimals;   //0.1%

    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 bnbReceived, uint256 tokensIntoLiquidity);
    event BalanceWithdrawn(address withdrawer, uint256 amount);
    event LiquidityAdded(uint256 tokenAmount, uint256 bnbAmount);
    event MaxTxAmountChanged(uint256 oldValue, uint256 newValue);
    event SwapAndLiquifyStatus(string status);
    event WalletsChanged();
    event FeesChanged();
    event tokensBurned(uint256 amount, string message);
    event Mint(uint256 amount, address mintAddress);
    event Burn(uint256 amount, address burnAddress);


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

    constructor () {
        _rOwned[_msgSender()] = _rTotal;
        
        IUniswapV2Router02 _PancakeSwapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        pancakeswapV2Pair = IUniswapV2Factory(_PancakeSwapV2Router.factory()).createPair(address(this), _PancakeSwapV2Router.WETH()); //only utility is to have the pair at hand, on bscscan...
        PancakeSwapV2Router = _PancakeSwapV2Router;

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }
    function toggleWalletTransferTax() external onlyOwner {
        isWalletTransferFeeEnabled = !isWalletTransferFeeEnabled;
    }

    function toggleContractTransferTax() external onlyOwner {
        isContractTransferFeeEnabled = !isContractTransferFeeEnabled;
    }

    //std ERC20:
    function name() public pure returns (string memory) {
        return _name;
    }
    function symbol() public pure returns (string memory) {
        return _symbol;
    }
    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    //override ERC20:
    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient,amount, isWalletTransferFeeEnabled);
        return true;
    }


    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
       if (sender.isContract()) {
            _transfer(sender, recipient, amount, isContractTransferFeeEnabled);
        } else {
            _transfer(sender, recipient, amount, isWalletTransferFeeEnabled);
        }
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tRfiTotal;
    }

  

    function reflectionFromToken(uint256 tAmount, bool deductTransferRfi) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferRfi) {
            valuesFromGetValues memory s = _getValues(tAmount, true);
            return s.rAmount;
        } else {
            valuesFromGetValues memory s = _getValues(tAmount, true);
            return s.rTransferAmount;
        }
    }


    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromRFI(address account) public onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInRFI(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function excludeFromFeeAndRfi(address account) public onlyOwner {
        excludeFromFee(account);
        excludeFromRFI(account);
    }

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    /* @dev passing an array or just an uint256 would have been more efficient/elegant, I know
    */
    function setRfiRatesPercents(uint8 _rfi, uint8 _lp, uint8 _research, uint8 _dev) public onlyOwner {
      feeRates.rfi = _rfi;
      feeRates.liquidity = _lp;
      feeRates.research = _research;
      feeRates.dev = _dev;
      emit FeesChanged();
    }

    function setWallets(address _research, address _dev) public onlyOwner {
      researchWallet = _research;
      devWallet = _dev;
      _isExcludedFromFee[_research] = true;
      _isExcludedFromFee[_dev] = true;
      emit WalletsChanged();
    }

    function setPresaleWallet(address _presaleWallet) public onlyOwner {
      _isExcludedFromFee[_presaleWallet] = true;
      isPresaleWallet[_presaleWallet]=true;
    }

   function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner {
        uint256 _previoiusAmount = _maxTxAmount;
        _maxTxAmount = _tTotal.mul(maxTxPercent).div(100);
        emit MaxTxAmountChanged(_previoiusAmount, _maxTxAmount);
    }
    
    function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner {
        _maxTxAmount = maxTxAmount;
    }

    //@dev swapLiq is triggered only when the contract's balance is above this threshold
    function setThreshholdForLP(uint256 threshold) external onlyOwner {
      numTokensSellToAddToLiquidity = threshold * 10**_decimals;
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    //  @dev receive BNB from pancakeswapV2Router when swapping
    receive() external payable {}

    function _reflectRfi(uint256 rRfi, uint256 tRfi) private {
        _rTotal = _rTotal.sub(rRfi);
        _tRfiTotal = _tRfiTotal.add(tRfi);
    }

    function _getValues(uint256 tAmount, bool takeFee) private view returns (valuesFromGetValues memory to_return) {
        to_return = _getTValues(tAmount, takeFee);
        (to_return.rAmount, to_return.rTransferAmount, to_return.rRfi) = _getRValues(to_return, tAmount, takeFee, _getRate());

        return to_return;

    }

    function _getTValues(uint256 tAmount, bool takeFee) private view returns (valuesFromGetValues memory s) {

        if(!takeFee) {
            s.tTransferAmount = tAmount;
            return s;
        }

        s.tRfi = tAmount.mul(feeRates.rfi).div(100);
        s.tLiquidity = tAmount.mul(feeRates.liquidity).div(100);
        s.tResearch = tAmount.mul(feeRates.research).div(100);
        s.tDev = tAmount.mul(feeRates.dev).div(100);

        s.tTransferAmount = tAmount.sub(s.tRfi).sub(s.tLiquidity).sub(s.tResearch).sub(s.tDev);

        return s;
    }

    function _getRValues(valuesFromGetValues memory s, uint256 tAmount, bool takeFee, uint256 currentRate) private pure returns (uint256 rAmount, uint256 rTransferAmount, uint256 rRfi) {

        rAmount = tAmount.mul(currentRate); //wondering how rfi works ? This is the trick

        if(!takeFee) {
          return(rAmount, rAmount, 0);
        }

        rRfi = s.tRfi.mul(currentRate);
        uint256 rLiquidity = s.tLiquidity.mul(currentRate);
        uint256 rResearch = s.tResearch.mul(currentRate);
        uint256 rDev = s.tDev.mul(currentRate);

        rTransferAmount = rAmount.sub(rRfi).sub(rLiquidity).sub(rResearch).sub(rDev);

        return (rAmount, rTransferAmount, rRfi);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }


    function _approve(address owner, address spender, uint256 amount) private {
        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);
    }
    

    function _transfer(address from, address to, uint256 amount , bool takeFee) private {
        require(amount > 0, "Transfer amount must be greater than zero");
        require(amount <= balanceOf(from),"Insuf balance, check balance at SafeSale.finance if you have token lock");
        //Exclude owner and presale wallets from maxTxAmount.
        if((from != owner() && to != owner()) && ( !isPresaleWallet[from] &&  !isPresaleWallet[to]))  
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");

        uint256 contractTokenBalance = balanceOf(address(this));

        if(contractTokenBalance >= _maxTxAmount) {
            contractTokenBalance = _maxTxAmount;
        }

        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
        if (overMinTokenBalance && !inSwapAndLiquify && from != pancakeswapV2Pair && swapAndLiquifyEnabled) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }
        bool shouldTakeFeeForTransfer = takeFee &&
            !(_isExcludedFromFee[from] || _isExcludedFromFee[to]);

        _tokenTransfer(from, to, amount, shouldTakeFeeForTransfer);
    }


    function _tokenTransfer(address sender, address recipient, uint256 tAmount, bool takeFee) private {
        if (_rOwned[recipient] == 0) {numOfHODLers++;}
        valuesFromGetValues memory s = _getValues(tAmount, takeFee);

        if (_isExcluded[sender] && !_isExcluded[recipient]) {  //from excluded
                _tOwned[sender] = _tOwned[sender].sub(tAmount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) { //to excluded
                _tOwned[recipient] = _tOwned[recipient].add(s.tTransferAmount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) { //both excluded
                _tOwned[sender] = _tOwned[sender].sub(tAmount);
                _tOwned[recipient] = _tOwned[recipient].add(s.tTransferAmount);
        }

        //common to all transfers and == transfer std :
        _rOwned[sender] = _rOwned[sender].sub(s.rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(s.rTransferAmount);

        _takeLiquidity(s.tLiquidity);
        _reflectRfi(s.rRfi, s.tRfi);
        reflectDevandResearchFee(s.tDev,s.tResearch);

        emit Transfer(sender, recipient, s.tTransferAmount);
    }


    function reflectDevandResearchFee(uint256 tDev, uint256 tResearch) private {
        uint256 currentRate =  _getRate();
        uint256 rDevelopent =  tDev.mul(currentRate);
        uint256 rResearch =  tResearch.mul(currentRate);
        _tDevelopmentTotal = _tDevelopmentTotal.add(tDev);
        _rOwned[devWallet] = _rOwned[devWallet].add(rDevelopent);
        _tResearchTotal = _tResearchTotal.add(tResearch);
        _rOwned[researchWallet] = _rOwned[researchWallet].add(rResearch);
    }


    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

        // capture the contract's current BNB balance.
        // this is so that we can capture exactly the amount of BNB that the
        // swap creates, and not make the liquidity event include any BNB that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        if(swapTokensForBNB(half)) { //enough liquidity ? If not, no swapLiq
          uint256 newBalance = address(this).balance.sub(initialBalance);
          addLiquidity(otherHalf, newBalance);
          emit SwapAndLiquify(half, newBalance, otherHalf);
        }
    }

    // @dev This is used by the swapAndLiquify function to swap to BNB
    // allowance optimisation, only when needed - max allowance since spender=uniswap
    function swapTokensForBNB(uint256 tokenAmount) private returns (bool status){

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

        if(allowance(address(this), address(PancakeSwapV2Router)) < tokenAmount) {
          _approve(address(this), address(PancakeSwapV2Router), ~uint256(0));
        }

        try PancakeSwapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,0,path,address(this),block.timestamp) {
          emit SwapAndLiquifyStatus("Success");
          return true;
        }
        catch {
          emit SwapAndLiquifyStatus("Failed");
          return false;
        }

    }

    function addLiquidity(uint256 tokenAmount, uint256 bnbAmount) private {
        PancakeSwapV2Router.addLiquidityETH{value: bnbAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
        emit LiquidityAdded(tokenAmount, bnbAmount);
    }

    function totalDevelopmentFee() public view returns (uint256) {
        return _tDevelopmentTotal;
    }
    
    function totalResearchFee() public view returns (uint256) {
        return _tResearchTotal;
    }
    
    function adminConfig(address adminAddress , bool isAdmin) external onlyOwner {
        adminAddresses[adminAddress] = isAdmin;
    }

    modifier onlyAdmin() {
        require(adminAddresses[_msgSender()], "Caller is not an admin.");
        _;
    }

    function _mint(address recipient, uint256 amount) private {
        require(amount > 0, "Transfer amount must be greater than zero");
        require(_tTotal + amount <= 4 * 10**9 * 10**_decimals, "Total supply cannot exceed 4B");
        
        uint256 _rTransferAmount = (amount.mul(_rTotal)).div(_tTotal);
        
        _tTotal = _tTotal.add(amount);
        _rTotal = _rTotal.add(_rTransferAmount);

        if (_isExcluded[recipient]) {
            _tOwned[recipient] = _tOwned[recipient].add(amount);
        }

        _rOwned[recipient] = _rOwned[recipient].add(_rTransferAmount);

        emit Transfer(address(0), recipient, amount);
    }

    function _burn(address senderAddress, uint256 amount) private {
        require(amount > 0, "Transfer amount must be greater than zero");
        require(amount <= balanceOf(senderAddress), "Insufficient balance");
        require(_tTotal - amount >= 0, "Total supply cannot be below 0");

        uint256 _rTransferAmount = (amount.mul(_rTotal)).div(_tTotal);
        
        _tTotal = _tTotal.sub(amount);
        _rTotal = _rTotal.sub(_rTransferAmount);

        if (_isExcluded[senderAddress]) {
            _tOwned[senderAddress] = _tOwned[senderAddress].sub(amount);
        }

        _rOwned[senderAddress] = _rOwned[senderAddress].sub(_rTransferAmount);

        emit Transfer(senderAddress, address(0), amount);
    }

    function mint(address recipient, uint256 value)
        external
        override
        onlyAdmin
    {
        _mint(recipient, value);
        emit Mint(value, recipient);
    }

    function burn(address fromAddress, uint256 value) external override onlyAdmin {
        _burn(fromAddress, value);
        emit Burn(value, fromAddress);
    }
    
    
    function withdrawStuckTokens(IERC20 token, address to) external onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        token.transfer(to, balance);
    }

    function withdrawLeftoverETH(address payable receipient) external onlyOwner {
        receipient.transfer(address(this).balance);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BalanceWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"burnAddress","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[],"name":"FeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbAmount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"MaxTxAmountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"mintAddress","type":"address"}],"name":"Mint","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":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"status","type":"string"}],"name":"SwapAndLiquifyStatus","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":[],"name":"WalletsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"tokensBurned","type":"event"},{"inputs":[],"name":"PancakeSwapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"adminAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adminAddress","type":"address"},{"internalType":"bool","name":"isAdmin","type":"bool"}],"name":"adminConfig","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFeeAndRfi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromRFI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRates","outputs":[{"internalType":"uint8","name":"rfi","type":"uint8"},{"internalType":"uint8","name":"liquidity","type":"uint8"},{"internalType":"uint8","name":"research","type":"uint8"},{"internalType":"uint8","name":"dev","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInRFI","outputs":[],"stateMutability":"nonpayable","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":"isContractTransferFeeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPresaleWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWalletTransferFeeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"numOfHODLers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferRfi","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"researchWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_presaleWallet","type":"address"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_rfi","type":"uint8"},{"internalType":"uint8","name":"_lp","type":"uint8"},{"internalType":"uint8","name":"_research","type":"uint8"},{"internalType":"uint8","name":"_dev","type":"uint8"}],"name":"setRfiRatesPercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setThreshholdForLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_research","type":"address"},{"internalType":"address","name":"_dev","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"toggleContractTransferTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWalletTransferTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDevelopmentFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalResearchFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receipient","type":"address"}],"name":"withdrawLeftoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526008805461ffff1916610100179055620000216009600a6200051d565b6200002e90600162000535565b60098181556200004090600a6200051d565b6200005c906f0c097ce7bc90715b34b9f1000000000062000535565b62000068919062000557565b620000766009600a6200051d565b62000092906f0c097ce7bc90715b34b9f1000000000062000535565b6200009e91906200057a565b600a908155604080516080810182526002815260066020820152600191810182905260600152600f8054630101060263ffffffff199091161790556014805460ff60a81b1916600160a81b179055620000fa906009906200051d565b6200010a9063ee6b280062000535565b6015556200011b6009600a6200051d565b6200012a90623d090062000535565b6016553480156200013a57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600a543360009081526001602090815260409182902092909255805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a01559260048083019392829003018186803b158015620001de57600080fd5b505afa158015620001f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000219919062000594565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200026257600080fd5b505afa15801562000277573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029d919062000594565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002e657600080fd5b505af1158015620002fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000321919062000594565b601480546001600160a01b03199081166001600160a01b039384161790915560138054909116918316919091179055600160046000620003696000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526004909252902080549091166001179055620003b13390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600954604051620003f991815260200190565b60405180910390a350620005bf565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200045f57816000190482111562000443576200044362000408565b808516156200045157918102915b93841c939080029062000423565b509250929050565b600082620004785750600162000517565b81620004875750600062000517565b8160018114620004a05760028114620004ab57620004cb565b600191505062000517565b60ff841115620004bf57620004bf62000408565b50506001821b62000517565b5060208310610133831016604e8410600b8410161715620004f0575081810a62000517565b620004fc83836200041e565b806000190482111562000513576200051362000408565b0290505b92915050565b60006200052e60ff84168362000467565b9392505050565b600081600019048311821515161562000552576200055262000408565b500290565b6000826200057557634e487b7160e01b600052601260045260246000fd5b500690565b6000828210156200058f576200058f62000408565b500390565b600060208284031215620005a757600080fd5b81516001600160a01b03811681146200052e57600080fd5b6146ce80620005cf6000396000f3fe6080604052600436106103435760003560e01c80637688c584116101b0578063bfa24742116100ec578063d543dbeb11610095578063ea2f0b371161006f578063ea2f0b3714610a74578063ec28438a14610a94578063f2fde38b14610ab4578063fbc232cd14610ad457600080fd5b8063d543dbeb146109ec578063db5d653614610a0c578063dd62ed3e14610a2157600080fd5b8063d07a091c116100c6578063d07a091c14610996578063d12a7688146109b6578063d3f6a157146109cc57600080fd5b8063bfa2474214610936578063c49b9a8014610956578063c9becf121461097657600080fd5b806395d89b41116101595780639f16544d116101335780639f16544d146108c1578063a457c2d7146108d6578063a8e11c67146108f6578063a9059cbb1461091657600080fd5b806395d89b411461034f5780639dc29fac1461088c5780639ebd86db146108ac57600080fd5b806388f820201161018a57806388f82020146107ee5780638da5cb5b146108345780638ea5220f1461085f57600080fd5b80637688c5841461074857806379fdd832146107ab5780637d1db4a5146107d857600080fd5b806340c10f191161027f5780634ed38faf1161022857806354bc089f1161020257806354bc089f146106bb578063571d622d146106db5780636d2dda02146106fb57806370a082311461072857600080fd5b80634ed38faf146105f357806352892884146106235780635342acb41461067557600080fd5b80634549b039116102595780634549b039146105805780634a74bb02146105a05780634d11ef9b146105d357600080fd5b806340c10f191461051057806340fb7ad914610530578063437823ec1461056057600080fd5b806325b86edf116102ec578063313ce567116102c6578063313ce567146104a05780633467a760146104bc57806338dac461146104db57806339509351146104f057600080fd5b806325b86edf1461043e5780632d6c2631146104605780632d8381191461048057600080fd5b806318160ddd1161031d57806318160ddd146103f357806320fecdd11461040857806323b872dd1461041e57600080fd5b806306fdde031461034f578063095ea7b3146103a457806313114a9d146103d457600080fd5b3661034a57005b600080fd5b34801561035b57600080fd5b50604080518082018252600581527f6550494e470000000000000000000000000000000000000000000000000000006020820152905161039b919061404a565b60405180910390f35b3480156103b057600080fd5b506103c46103bf3660046140df565b610aee565b604051901515815260200161039b565b3480156103e057600080fd5b50600b545b60405190815260200161039b565b3480156103ff57600080fd5b506009546103e5565b34801561041457600080fd5b506103e5600c5481565b34801561042a57600080fd5b506103c461043936600461410b565b610b05565b34801561044a57600080fd5b5061045e61045936600461414c565b610bc2565b005b34801561046c57600080fd5b5061045e61047b366004614185565b610d9a565b34801561048c57600080fd5b506103e561049b3660046141a2565b61106f565b3480156104ac57600080fd5b506040516009815260200161039b565b3480156104c857600080fd5b506008546103c490610100900460ff1681565b3480156104e757600080fd5b5061045e611120565b3480156104fc57600080fd5b506103c461050b3660046140df565b6111db565b34801561051c57600080fd5b5061045e61052b3660046140df565b61121e565b34801561053c57600080fd5b506103c461054b366004614185565b60126020526000908152604090205460ff1681565b34801561056c57600080fd5b5061045e61057b366004614185565b6112f4565b34801561058c57600080fd5b506103e561059b3660046141c9565b6113c4565b3480156105ac57600080fd5b506014546103c4907501000000000000000000000000000000000000000000900460ff1681565b3480156105df57600080fd5b5061045e6105ee366004614185565b611468565b3480156105ff57600080fd5b506103c461060e366004614185565b60066020526000908152604090205460ff1681565b34801561062f57600080fd5b506014546106509073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161039b565b34801561068157600080fd5b506103c4610690366004614185565b73ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205460ff1690565b3480156106c757600080fd5b5061045e6106d6366004614185565b6114fe565b3480156106e757600080fd5b5061045e6106f6366004614185565b611739565b34801561070757600080fd5b506010546106509073ffffffffffffffffffffffffffffffffffffffff1681565b34801561073457600080fd5b506103e5610743366004614185565b6117fc565b34801561075457600080fd5b50600f5461077e9060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff9586168152938516602085015291841691830191909152909116606082015260800161039b565b3480156107b757600080fd5b506013546106509073ffffffffffffffffffffffffffffffffffffffff1681565b3480156107e457600080fd5b506103e560155481565b3480156107fa57600080fd5b506103c4610809366004614185565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205460ff1690565b34801561084057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610650565b34801561086b57600080fd5b506011546106509073ffffffffffffffffffffffffffffffffffffffff1681565b34801561089857600080fd5b5061045e6108a73660046140df565b611882565b3480156108b857600080fd5b50600e546103e5565b3480156108cd57600080fd5b5061045e611950565b3480156108e257600080fd5b506103c46108f13660046140df565b611a03565b34801561090257600080fd5b5061045e610911366004614204565b611a5f565b34801561092257600080fd5b506103c46109313660046140df565b611ba4565b34801561094257600080fd5b5061045e6109513660046141a2565b611bb9565b34801561096257600080fd5b5061045e610971366004614258565b611c56565b34801561098257600080fd5b5061045e610991366004614275565b611d5c565b3480156109a257600080fd5b5061045e6109b1366004614185565b611e33565b3480156109c257600080fd5b506103e560165481565b3480156109d857600080fd5b5061045e6109e736600461414c565b611f1b565b3480156109f857600080fd5b5061045e610a073660046141a2565b612066565b348015610a1857600080fd5b50600d546103e5565b348015610a2d57600080fd5b506103e5610a3c36600461414c565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205490565b348015610a8057600080fd5b5061045e610a8f366004614185565b612140565b348015610aa057600080fd5b5061045e610aaf3660046141a2565b61220d565b348015610ac057600080fd5b5061045e610acf366004614185565b612293565b348015610ae057600080fd5b506008546103c49060ff1681565b6000610afb338484612444565b5060015b92915050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15610b4457610b3f848484600860019054906101000a900460ff166125f8565b610b59565b600854610b599085908590859060ff166125f8565b610bb88433610bb38560405180606001604052806028815260200161464c6028913973ffffffffffffffffffffffffffffffffffffffff8a16600090815260036020908152604080832033845290915290205491906129ad565b612444565b5060019392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b158015610cb057600080fd5b505afa158015610cc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce891906142a3565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390529192509084169063a9059cbb90604401602060405180830381600087803b158015610d5c57600080fd5b505af1158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9491906142bc565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205460ff16610eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610c3f565b60005b60075481101561106b578173ffffffffffffffffffffffffffffffffffffffff1660078281548110610ee157610ee16142d9565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156110595760078054610f1990600190614337565b81548110610f2957610f296142d9565b6000918252602090912001546007805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610f6257610f626142d9565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055918416815260028252604080822082905560059092522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556007805480610ffd57610ffd61434e565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555050565b806110638161437d565b915050610ead565b5050565b6000600a54821115611103576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e73000000000000000000000000000000000000000000006064820152608401610c3f565b600061110d6129fe565b90506111198382612a21565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610afb918590610bb39086612a96565b3360009081526006602052604090205460ff16611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616c6c6572206973206e6f7420616e2061646d696e2e0000000000000000006044820152606401610c3f565b6112a18282612b0f565b6040805182815273ffffffffffffffffffffffffffffffffffffffff841660208201527ff3cea5493d790af0133817606f7350a91d7f154ea52eaa79d179d4d231e5010291015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000600954831115611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c3f565b8161144e576000611444846001612d82565b519150610aff9050565b600061145b846001612d82565b602001519150610aff9050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b6114f2816112f4565b6114fb816114fe565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205460ff161561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040902054156116905773ffffffffffffffffffffffffffffffffffffffff81166000908152600160205260409020546116699061106f565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260409020555b73ffffffffffffffffffffffffffffffffffffffff16600081815260056020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b60405173ffffffffffffffffffffffffffffffffffffffff8216904780156108fc02916000818181858888f1935050505015801561106b573d6000803e3d6000fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205460ff1615611853575073ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902054610aff9061106f565b3360009081526006602052604090205460ff166118fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616c6c6572206973206e6f7420616e2061646d696e2e0000000000000000006044820152606401610c3f565b6119058282612dfb565b6040805182815273ffffffffffffffffffffffffffffffffffffffff841660208201527ff6554c3a5d28e08c120b5a69c7edbaf52f935bd2596a60b8a18e282cd257cddb91016112e8565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6000610afb3384610bb3856040518060600160405280602581526020016146746025913933600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290205491906129ad565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b600f805460ff8681167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009092169190911761010086831602177fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff1662010000858316027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff16176301000000918416919091021790556040517f846206d6c3449ac0b05841dfb88bf28b55aef00f96152490c69c96238048de1590600090a150505050565b6000610afb336008548590859060ff166125f8565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b611c466009600a6144d6565b611c5090826144e5565b60165550565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b601480548215157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611d5190831515815260200190565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ddd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611eb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff166000908152600460209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092556012909352922080549091169091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b6010805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff000000000000000000000000000000000000000092831681179093556011805491851691909216811790915560009182526004602052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081166001908117909255928452818420805490931617909155517fffb3cd8846e7abe92a150cf0618d4e5f6c419c78b6a11e965eb40d6e63e690649190a15050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b601554600954612104906064906120fe90856130c5565b90612a21565b60158190556040805183815260208101929092527fd6f586005531e7d32112f5389278497d656f7ed9029f31f85494a3f58ca1833391016112e8565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461228e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b601555565b60005473ffffffffffffffffffffffffffffffffffffffff163314612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff81166123b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c3f565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff83166124e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c3f565b73ffffffffffffffffffffffffffffffffffffffff8216612589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610c3f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008211612688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610c3f565b612691846117fc565b821115612746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f496e7375662062616c616e63652c20636865636b2062616c616e63652061742060448201527f5361666553616c652e66696e616e636520696620796f75206861766520746f6b60648201527f656e206c6f636b00000000000000000000000000000000000000000000000000608482015260a401610c3f565b60005473ffffffffffffffffffffffffffffffffffffffff85811691161480159061278c575060005473ffffffffffffffffffffffffffffffffffffffff848116911614155b80156127ef575073ffffffffffffffffffffffffffffffffffffffff841660009081526012602052604090205460ff161580156127ef575073ffffffffffffffffffffffffffffffffffffffff831660009081526012602052604090205460ff16155b1561288657601554821115612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f78416d6f756e742e0000000000000000000000000000000000000000000000006064820152608401610c3f565b6000612891306117fc565b905060155481106128a157506015545b601654811080159081906128d0575060145474010000000000000000000000000000000000000000900460ff16155b80156128f7575060145473ffffffffffffffffffffffffffffffffffffffff878116911614155b801561291e57506014547501000000000000000000000000000000000000000000900460ff165b156129315760165491506129318261317a565b6000838015612996575073ffffffffffffffffffffffffffffffffffffffff871660009081526004602052604090205460ff1680612994575073ffffffffffffffffffffffffffffffffffffffff861660009081526004602052604090205460ff165b155b90506129a48787878461326e565b50505050505050565b600081848411156129eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f919061404a565b506129f68385614337565b949350505050565b6000806000612a0b61366e565b9092509050612a1a8282612a21565b9250505090565b6000808211612a8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c3f565b6111198284614522565b600080612aa3838561455d565b905083811015611119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c3f565b60008111612b9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610c3f565b612bab6009600a6144d6565b612bb99063ee6b28006144e5565b81600954612bc7919061455d565b1115612c2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f546f74616c20737570706c792063616e6e6f74206578636565642034420000006044820152606401610c3f565b6000612c4c6009546120fe600a54856130c590919063ffffffff16565b600954909150612c5c9083612a96565b600955600a54612c6c9082612a96565b600a5573ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604090205460ff1615612cf45773ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054612ccd9083612a96565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020555b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612d249082612a96565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125eb9086815260200190565b612dca60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b612dd48383613824565b9050612de9818484612de46129fe565b613947565b60408401526020830152815292915050565b60008111612e8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610c3f565b612e94826117fc565b811115612efd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610c3f565b600081600954612f0d9190614337565b1015612f75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f546f74616c20737570706c792063616e6e6f742062652062656c6f77203000006044820152606401610c3f565b6000612f926009546120fe600a54856130c590919063ffffffff16565b600954909150612fa290836139eb565b600955600a54612fb290826139eb565b600a5573ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604090205460ff161561303a5773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604090205461301390836139eb565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020555b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205461306a90826139eb565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125eb9086815260200190565b6000826130d457506000610aff565b60006130e083856144e5565b9050826130ed8583614522565b14611119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610c3f565b601480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560006131c6826002612a21565b905060006131d483836139eb565b9050476131e083613a61565b156132405760006131f147836139eb565b90506131fd8382613d5c565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505b5050601480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600160205260409020546132ae57600c80549060006132a88361437d565b91905055505b60006132ba8383612d82565b73ffffffffffffffffffffffffffffffffffffffff861660009081526005602052604090205490915060ff168015613318575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090205460ff16155b156133785773ffffffffffffffffffffffffffffffffffffffff851660009081526002602052604090205461334d90846139eb565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260026020526040902055613530565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604090205460ff161580156133d3575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090205460ff165b1561343757606081015173ffffffffffffffffffffffffffffffffffffffff851660009081526002602052604090205461340c91612a96565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260026020526040902055613530565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604090205460ff168015613491575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090205460ff165b156135305773ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260409020546134c690846139eb565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600260205260408082209390935560608401519187168152919091205461350991612a96565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260409020555b805173ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040902054613561916139eb565b73ffffffffffffffffffffffffffffffffffffffff808716600090815260016020908152604080832094909455840151918716815291909120546135a491612a96565b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604090205560a08101516135d890613e99565b6135ea81604001518260800151613f22565b6135fc8160e001518260c00151613f46565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836060015160405161365f91815260200190565b60405180910390a35050505050565b600a546009546000918291825b6007548110156137f45782600160006007848154811061369d5761369d6142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054118061372257508160026000600784815481106136ee576136ee6142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b1561373857600a54600954945094505050509091565b61378b6001600060078481548110613752576137526142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205484906139eb565b92506137e060026000600784815481106137a7576137a76142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205483906139eb565b9150806137ec8161437d565b91505061367b565b50600954600a5461380491612a21565b82101561381b57600a546009549350935050509091565b90939092509050565b61386c60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8161387d5760608101839052610aff565b600f54613895906064906120fe90869060ff166130c5565b6080820152600f546138b7906064906120fe908690610100900460ff166130c5565b60a0820152600f546138da906064906120fe90869062010000900460ff166130c5565b60c0820152600f546138fe906064906120fe9086906301000000900460ff166130c5565b8160e001818152505061393c8160e001516139368360c001516139368560a0015161393687608001518a6139eb90919063ffffffff16565b906139eb565b606082015292915050565b6000808061395586856130c5565b925084613967575081905060006139e1565b608087015161397690856130c5565b90506000613991858960a001516130c590919063ffffffff16565b905060006139ac868a60c001516130c590919063ffffffff16565b905060006139c7878b60e001516130c590919063ffffffff16565b90506139db81613936848187818c8b6139eb565b94505050505b9450945094915050565b600082821115613a57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c3f565b6111198284614337565b604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110613a9a57613a9a6142d9565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601354604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015613b1457600080fd5b505afa158015613b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b4c9190614575565b81600181518110613b5f57613b5f6142d9565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920181019190915260135430600090815260038352604080822092909416815291522054831115613bee57601354613bee90309073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612444565b6013546040517f791ac94700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063791ac94790613c4d908690600090869030904290600401614592565b600060405180830381600087803b158015613c6757600080fd5b505af1925050508015613c78575060015b613cec577f22b212abbac4f28435a37f1253f735d1d9c9b444577feee64b691ca091130297604051613cdb9060208082526006908201527f4661696c65640000000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a150600092915050565b7f22b212abbac4f28435a37f1253f735d1d9c9b444577feee64b691ca091130297604051613d4b9060208082526007908201527f5375636365737300000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a150600192915050565b60135473ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613d9f60005473ffffffffffffffffffffffffffffffffffffffff1690565b60405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015613e2757600080fd5b505af1158015613e3b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613e60919061461d565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b9250016112e8565b6000613ea36129fe565b90506000613eb183836130c5565b30600090815260016020526040902054909150613ece9082612a96565b3060009081526001602090815260408083209390935560059052205460ff1615613f1d5730600090815260026020526040902054613f0c9084612a96565b306000908152600260205260409020555b505050565b600a54613f2f90836139eb565b600a55600b54613f3f9082612a96565b600b555050565b6000613f506129fe565b90506000613f5e84836130c5565b90506000613f6c84846130c5565b600d54909150613f7c9086612a96565b600d5560115473ffffffffffffffffffffffffffffffffffffffff16600090815260016020526040902054613fb19083612a96565b60115473ffffffffffffffffffffffffffffffffffffffff16600090815260016020526040902055600e54613fe69085612a96565b600e5560105473ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205461401b9082612a96565b60105473ffffffffffffffffffffffffffffffffffffffff166000908152600160205260409020555050505050565b600060208083528351808285015260005b818110156140775785810183015185820160400152820161405b565b81811115614089576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146114fb57600080fd5b600080604083850312156140f257600080fd5b82356140fd816140bd565b946020939093013593505050565b60008060006060848603121561412057600080fd5b833561412b816140bd565b9250602084013561413b816140bd565b929592945050506040919091013590565b6000806040838503121561415f57600080fd5b823561416a816140bd565b9150602083013561417a816140bd565b809150509250929050565b60006020828403121561419757600080fd5b8135611119816140bd565b6000602082840312156141b457600080fd5b5035919050565b80151581146114fb57600080fd5b600080604083850312156141dc57600080fd5b82359150602083013561417a816141bb565b803560ff811681146141ff57600080fd5b919050565b6000806000806080858703121561421a57600080fd5b614223856141ee565b9350614231602086016141ee565b925061423f604086016141ee565b915061424d606086016141ee565b905092959194509250565b60006020828403121561426a57600080fd5b8135611119816141bb565b6000806040838503121561428857600080fd5b8235614293816140bd565b9150602083013561417a816141bb565b6000602082840312156142b557600080fd5b5051919050565b6000602082840312156142ce57600080fd5b8151611119816141bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561434957614349614308565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143af576143af614308565b5060010190565b600181815b8085111561440f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156143f5576143f5614308565b8085161561440257918102915b93841c93908002906143bb565b509250929050565b60008261442657506001610aff565b8161443357506000610aff565b816001811461444957600281146144535761446f565b6001915050610aff565b60ff84111561446457614464614308565b50506001821b610aff565b5060208310610133831016604e8410600b8410161715614492575081810a610aff565b61449c83836143b6565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156144ce576144ce614308565b029392505050565b600061111960ff841683614417565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561451d5761451d614308565b500290565b600082614558577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000821982111561457057614570614308565b500190565b60006020828403121561458757600080fd5b8151611119816140bd565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156145ef57845173ffffffffffffffffffffffffffffffffffffffff16835293830193918301916001016145bd565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b60008060006060848603121561463257600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204ad51105d22bc77a515d6b0e9e82627854012945e1913627b4b61b7c5e19abb264736f6c63430008090033

Deployed Bytecode

0x6080604052600436106103435760003560e01c80637688c584116101b0578063bfa24742116100ec578063d543dbeb11610095578063ea2f0b371161006f578063ea2f0b3714610a74578063ec28438a14610a94578063f2fde38b14610ab4578063fbc232cd14610ad457600080fd5b8063d543dbeb146109ec578063db5d653614610a0c578063dd62ed3e14610a2157600080fd5b8063d07a091c116100c6578063d07a091c14610996578063d12a7688146109b6578063d3f6a157146109cc57600080fd5b8063bfa2474214610936578063c49b9a8014610956578063c9becf121461097657600080fd5b806395d89b41116101595780639f16544d116101335780639f16544d146108c1578063a457c2d7146108d6578063a8e11c67146108f6578063a9059cbb1461091657600080fd5b806395d89b411461034f5780639dc29fac1461088c5780639ebd86db146108ac57600080fd5b806388f820201161018a57806388f82020146107ee5780638da5cb5b146108345780638ea5220f1461085f57600080fd5b80637688c5841461074857806379fdd832146107ab5780637d1db4a5146107d857600080fd5b806340c10f191161027f5780634ed38faf1161022857806354bc089f1161020257806354bc089f146106bb578063571d622d146106db5780636d2dda02146106fb57806370a082311461072857600080fd5b80634ed38faf146105f357806352892884146106235780635342acb41461067557600080fd5b80634549b039116102595780634549b039146105805780634a74bb02146105a05780634d11ef9b146105d357600080fd5b806340c10f191461051057806340fb7ad914610530578063437823ec1461056057600080fd5b806325b86edf116102ec578063313ce567116102c6578063313ce567146104a05780633467a760146104bc57806338dac461146104db57806339509351146104f057600080fd5b806325b86edf1461043e5780632d6c2631146104605780632d8381191461048057600080fd5b806318160ddd1161031d57806318160ddd146103f357806320fecdd11461040857806323b872dd1461041e57600080fd5b806306fdde031461034f578063095ea7b3146103a457806313114a9d146103d457600080fd5b3661034a57005b600080fd5b34801561035b57600080fd5b50604080518082018252600581527f6550494e470000000000000000000000000000000000000000000000000000006020820152905161039b919061404a565b60405180910390f35b3480156103b057600080fd5b506103c46103bf3660046140df565b610aee565b604051901515815260200161039b565b3480156103e057600080fd5b50600b545b60405190815260200161039b565b3480156103ff57600080fd5b506009546103e5565b34801561041457600080fd5b506103e5600c5481565b34801561042a57600080fd5b506103c461043936600461410b565b610b05565b34801561044a57600080fd5b5061045e61045936600461414c565b610bc2565b005b34801561046c57600080fd5b5061045e61047b366004614185565b610d9a565b34801561048c57600080fd5b506103e561049b3660046141a2565b61106f565b3480156104ac57600080fd5b506040516009815260200161039b565b3480156104c857600080fd5b506008546103c490610100900460ff1681565b3480156104e757600080fd5b5061045e611120565b3480156104fc57600080fd5b506103c461050b3660046140df565b6111db565b34801561051c57600080fd5b5061045e61052b3660046140df565b61121e565b34801561053c57600080fd5b506103c461054b366004614185565b60126020526000908152604090205460ff1681565b34801561056c57600080fd5b5061045e61057b366004614185565b6112f4565b34801561058c57600080fd5b506103e561059b3660046141c9565b6113c4565b3480156105ac57600080fd5b506014546103c4907501000000000000000000000000000000000000000000900460ff1681565b3480156105df57600080fd5b5061045e6105ee366004614185565b611468565b3480156105ff57600080fd5b506103c461060e366004614185565b60066020526000908152604090205460ff1681565b34801561062f57600080fd5b506014546106509073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161039b565b34801561068157600080fd5b506103c4610690366004614185565b73ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205460ff1690565b3480156106c757600080fd5b5061045e6106d6366004614185565b6114fe565b3480156106e757600080fd5b5061045e6106f6366004614185565b611739565b34801561070757600080fd5b506010546106509073ffffffffffffffffffffffffffffffffffffffff1681565b34801561073457600080fd5b506103e5610743366004614185565b6117fc565b34801561075457600080fd5b50600f5461077e9060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff9586168152938516602085015291841691830191909152909116606082015260800161039b565b3480156107b757600080fd5b506013546106509073ffffffffffffffffffffffffffffffffffffffff1681565b3480156107e457600080fd5b506103e560155481565b3480156107fa57600080fd5b506103c4610809366004614185565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205460ff1690565b34801561084057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610650565b34801561086b57600080fd5b506011546106509073ffffffffffffffffffffffffffffffffffffffff1681565b34801561089857600080fd5b5061045e6108a73660046140df565b611882565b3480156108b857600080fd5b50600e546103e5565b3480156108cd57600080fd5b5061045e611950565b3480156108e257600080fd5b506103c46108f13660046140df565b611a03565b34801561090257600080fd5b5061045e610911366004614204565b611a5f565b34801561092257600080fd5b506103c46109313660046140df565b611ba4565b34801561094257600080fd5b5061045e6109513660046141a2565b611bb9565b34801561096257600080fd5b5061045e610971366004614258565b611c56565b34801561098257600080fd5b5061045e610991366004614275565b611d5c565b3480156109a257600080fd5b5061045e6109b1366004614185565b611e33565b3480156109c257600080fd5b506103e560165481565b3480156109d857600080fd5b5061045e6109e736600461414c565b611f1b565b3480156109f857600080fd5b5061045e610a073660046141a2565b612066565b348015610a1857600080fd5b50600d546103e5565b348015610a2d57600080fd5b506103e5610a3c36600461414c565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205490565b348015610a8057600080fd5b5061045e610a8f366004614185565b612140565b348015610aa057600080fd5b5061045e610aaf3660046141a2565b61220d565b348015610ac057600080fd5b5061045e610acf366004614185565b612293565b348015610ae057600080fd5b506008546103c49060ff1681565b6000610afb338484612444565b5060015b92915050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15610b4457610b3f848484600860019054906101000a900460ff166125f8565b610b59565b600854610b599085908590859060ff166125f8565b610bb88433610bb38560405180606001604052806028815260200161464c6028913973ffffffffffffffffffffffffffffffffffffffff8a16600090815260036020908152604080832033845290915290205491906129ad565b612444565b5060019392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b158015610cb057600080fd5b505afa158015610cc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce891906142a3565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390529192509084169063a9059cbb90604401602060405180830381600087803b158015610d5c57600080fd5b505af1158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9491906142bc565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205460ff16610eaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610c3f565b60005b60075481101561106b578173ffffffffffffffffffffffffffffffffffffffff1660078281548110610ee157610ee16142d9565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156110595760078054610f1990600190614337565b81548110610f2957610f296142d9565b6000918252602090912001546007805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610f6257610f626142d9565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055918416815260028252604080822082905560059092522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556007805480610ffd57610ffd61434e565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555050565b806110638161437d565b915050610ead565b5050565b6000600a54821115611103576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e73000000000000000000000000000000000000000000006064820152608401610c3f565b600061110d6129fe565b90506111198382612a21565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610afb918590610bb39086612a96565b3360009081526006602052604090205460ff16611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616c6c6572206973206e6f7420616e2061646d696e2e0000000000000000006044820152606401610c3f565b6112a18282612b0f565b6040805182815273ffffffffffffffffffffffffffffffffffffffff841660208201527ff3cea5493d790af0133817606f7350a91d7f154ea52eaa79d179d4d231e5010291015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000600954831115611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c3f565b8161144e576000611444846001612d82565b519150610aff9050565b600061145b846001612d82565b602001519150610aff9050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146114e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b6114f2816112f4565b6114fb816114fe565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205460ff161561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040902054156116905773ffffffffffffffffffffffffffffffffffffffff81166000908152600160205260409020546116699061106f565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260409020555b73ffffffffffffffffffffffffffffffffffffffff16600081815260056020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b60405173ffffffffffffffffffffffffffffffffffffffff8216904780156108fc02916000818181858888f1935050505015801561106b573d6000803e3d6000fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205460ff1615611853575073ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902054610aff9061106f565b3360009081526006602052604090205460ff166118fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616c6c6572206973206e6f7420616e2061646d696e2e0000000000000000006044820152606401610c3f565b6119058282612dfb565b6040805182815273ffffffffffffffffffffffffffffffffffffffff841660208201527ff6554c3a5d28e08c120b5a69c7edbaf52f935bd2596a60b8a18e282cd257cddb91016112e8565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6000610afb3384610bb3856040518060600160405280602581526020016146746025913933600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290205491906129ad565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b600f805460ff8681167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009092169190911761010086831602177fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff1662010000858316027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff16176301000000918416919091021790556040517f846206d6c3449ac0b05841dfb88bf28b55aef00f96152490c69c96238048de1590600090a150505050565b6000610afb336008548590859060ff166125f8565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b611c466009600a6144d6565b611c5090826144e5565b60165550565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b601480548215157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611d5190831515815260200190565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ddd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611eb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff166000908152600460209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091821681179092556012909352922080549091169091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b6010805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff000000000000000000000000000000000000000092831681179093556011805491851691909216811790915560009182526004602052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081166001908117909255928452818420805490931617909155517fffb3cd8846e7abe92a150cf0618d4e5f6c419c78b6a11e965eb40d6e63e690649190a15050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b601554600954612104906064906120fe90856130c5565b90612a21565b60158190556040805183815260208101929092527fd6f586005531e7d32112f5389278497d656f7ed9029f31f85494a3f58ca1833391016112e8565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461228e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b601555565b60005473ffffffffffffffffffffffffffffffffffffffff163314612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c3f565b73ffffffffffffffffffffffffffffffffffffffff81166123b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c3f565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff83166124e6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c3f565b73ffffffffffffffffffffffffffffffffffffffff8216612589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610c3f565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008211612688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610c3f565b612691846117fc565b821115612746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f496e7375662062616c616e63652c20636865636b2062616c616e63652061742060448201527f5361666553616c652e66696e616e636520696620796f75206861766520746f6b60648201527f656e206c6f636b00000000000000000000000000000000000000000000000000608482015260a401610c3f565b60005473ffffffffffffffffffffffffffffffffffffffff85811691161480159061278c575060005473ffffffffffffffffffffffffffffffffffffffff848116911614155b80156127ef575073ffffffffffffffffffffffffffffffffffffffff841660009081526012602052604090205460ff161580156127ef575073ffffffffffffffffffffffffffffffffffffffff831660009081526012602052604090205460ff16155b1561288657601554821115612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f78416d6f756e742e0000000000000000000000000000000000000000000000006064820152608401610c3f565b6000612891306117fc565b905060155481106128a157506015545b601654811080159081906128d0575060145474010000000000000000000000000000000000000000900460ff16155b80156128f7575060145473ffffffffffffffffffffffffffffffffffffffff878116911614155b801561291e57506014547501000000000000000000000000000000000000000000900460ff165b156129315760165491506129318261317a565b6000838015612996575073ffffffffffffffffffffffffffffffffffffffff871660009081526004602052604090205460ff1680612994575073ffffffffffffffffffffffffffffffffffffffff861660009081526004602052604090205460ff165b155b90506129a48787878461326e565b50505050505050565b600081848411156129eb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f919061404a565b506129f68385614337565b949350505050565b6000806000612a0b61366e565b9092509050612a1a8282612a21565b9250505090565b6000808211612a8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c3f565b6111198284614522565b600080612aa3838561455d565b905083811015611119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c3f565b60008111612b9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610c3f565b612bab6009600a6144d6565b612bb99063ee6b28006144e5565b81600954612bc7919061455d565b1115612c2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f546f74616c20737570706c792063616e6e6f74206578636565642034420000006044820152606401610c3f565b6000612c4c6009546120fe600a54856130c590919063ffffffff16565b600954909150612c5c9083612a96565b600955600a54612c6c9082612a96565b600a5573ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604090205460ff1615612cf45773ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054612ccd9083612a96565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020555b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612d249082612a96565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125eb9086815260200190565b612dca60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b612dd48383613824565b9050612de9818484612de46129fe565b613947565b60408401526020830152815292915050565b60008111612e8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610c3f565b612e94826117fc565b811115612efd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610c3f565b600081600954612f0d9190614337565b1015612f75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f546f74616c20737570706c792063616e6e6f742062652062656c6f77203000006044820152606401610c3f565b6000612f926009546120fe600a54856130c590919063ffffffff16565b600954909150612fa290836139eb565b600955600a54612fb290826139eb565b600a5573ffffffffffffffffffffffffffffffffffffffff831660009081526005602052604090205460ff161561303a5773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604090205461301390836139eb565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020555b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205461306a90826139eb565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125eb9086815260200190565b6000826130d457506000610aff565b60006130e083856144e5565b9050826130ed8583614522565b14611119576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610c3f565b601480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560006131c6826002612a21565b905060006131d483836139eb565b9050476131e083613a61565b156132405760006131f147836139eb565b90506131fd8382613d5c565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505b5050601480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600160205260409020546132ae57600c80549060006132a88361437d565b91905055505b60006132ba8383612d82565b73ffffffffffffffffffffffffffffffffffffffff861660009081526005602052604090205490915060ff168015613318575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090205460ff16155b156133785773ffffffffffffffffffffffffffffffffffffffff851660009081526002602052604090205461334d90846139eb565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260026020526040902055613530565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604090205460ff161580156133d3575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090205460ff165b1561343757606081015173ffffffffffffffffffffffffffffffffffffffff851660009081526002602052604090205461340c91612a96565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260026020526040902055613530565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604090205460ff168015613491575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090205460ff165b156135305773ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260409020546134c690846139eb565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600260205260408082209390935560608401519187168152919091205461350991612a96565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600260205260409020555b805173ffffffffffffffffffffffffffffffffffffffff8616600090815260016020526040902054613561916139eb565b73ffffffffffffffffffffffffffffffffffffffff808716600090815260016020908152604080832094909455840151918716815291909120546135a491612a96565b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604090205560a08101516135d890613e99565b6135ea81604001518260800151613f22565b6135fc8160e001518260c00151613f46565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836060015160405161365f91815260200190565b60405180910390a35050505050565b600a546009546000918291825b6007548110156137f45782600160006007848154811061369d5761369d6142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054118061372257508160026000600784815481106136ee576136ee6142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b1561373857600a54600954945094505050509091565b61378b6001600060078481548110613752576137526142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205484906139eb565b92506137e060026000600784815481106137a7576137a76142d9565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205483906139eb565b9150806137ec8161437d565b91505061367b565b50600954600a5461380491612a21565b82101561381b57600a546009549350935050509091565b90939092509050565b61386c60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8161387d5760608101839052610aff565b600f54613895906064906120fe90869060ff166130c5565b6080820152600f546138b7906064906120fe908690610100900460ff166130c5565b60a0820152600f546138da906064906120fe90869062010000900460ff166130c5565b60c0820152600f546138fe906064906120fe9086906301000000900460ff166130c5565b8160e001818152505061393c8160e001516139368360c001516139368560a0015161393687608001518a6139eb90919063ffffffff16565b906139eb565b606082015292915050565b6000808061395586856130c5565b925084613967575081905060006139e1565b608087015161397690856130c5565b90506000613991858960a001516130c590919063ffffffff16565b905060006139ac868a60c001516130c590919063ffffffff16565b905060006139c7878b60e001516130c590919063ffffffff16565b90506139db81613936848187818c8b6139eb565b94505050505b9450945094915050565b600082821115613a57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c3f565b6111198284614337565b604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110613a9a57613a9a6142d9565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601354604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015613b1457600080fd5b505afa158015613b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b4c9190614575565b81600181518110613b5f57613b5f6142d9565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920181019190915260135430600090815260038352604080822092909416815291522054831115613bee57601354613bee90309073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612444565b6013546040517f791ac94700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063791ac94790613c4d908690600090869030904290600401614592565b600060405180830381600087803b158015613c6757600080fd5b505af1925050508015613c78575060015b613cec577f22b212abbac4f28435a37f1253f735d1d9c9b444577feee64b691ca091130297604051613cdb9060208082526006908201527f4661696c65640000000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a150600092915050565b7f22b212abbac4f28435a37f1253f735d1d9c9b444577feee64b691ca091130297604051613d4b9060208082526007908201527f5375636365737300000000000000000000000000000000000000000000000000604082015260600190565b60405180910390a150600192915050565b60135473ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080613d9f60005473ffffffffffffffffffffffffffffffffffffffff1690565b60405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b158015613e2757600080fd5b505af1158015613e3b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613e60919061461d565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b9250016112e8565b6000613ea36129fe565b90506000613eb183836130c5565b30600090815260016020526040902054909150613ece9082612a96565b3060009081526001602090815260408083209390935560059052205460ff1615613f1d5730600090815260026020526040902054613f0c9084612a96565b306000908152600260205260409020555b505050565b600a54613f2f90836139eb565b600a55600b54613f3f9082612a96565b600b555050565b6000613f506129fe565b90506000613f5e84836130c5565b90506000613f6c84846130c5565b600d54909150613f7c9086612a96565b600d5560115473ffffffffffffffffffffffffffffffffffffffff16600090815260016020526040902054613fb19083612a96565b60115473ffffffffffffffffffffffffffffffffffffffff16600090815260016020526040902055600e54613fe69085612a96565b600e5560105473ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205461401b9082612a96565b60105473ffffffffffffffffffffffffffffffffffffffff166000908152600160205260409020555050505050565b600060208083528351808285015260005b818110156140775785810183015185820160400152820161405b565b81811115614089576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146114fb57600080fd5b600080604083850312156140f257600080fd5b82356140fd816140bd565b946020939093013593505050565b60008060006060848603121561412057600080fd5b833561412b816140bd565b9250602084013561413b816140bd565b929592945050506040919091013590565b6000806040838503121561415f57600080fd5b823561416a816140bd565b9150602083013561417a816140bd565b809150509250929050565b60006020828403121561419757600080fd5b8135611119816140bd565b6000602082840312156141b457600080fd5b5035919050565b80151581146114fb57600080fd5b600080604083850312156141dc57600080fd5b82359150602083013561417a816141bb565b803560ff811681146141ff57600080fd5b919050565b6000806000806080858703121561421a57600080fd5b614223856141ee565b9350614231602086016141ee565b925061423f604086016141ee565b915061424d606086016141ee565b905092959194509250565b60006020828403121561426a57600080fd5b8135611119816141bb565b6000806040838503121561428857600080fd5b8235614293816140bd565b9150602083013561417a816141bb565b6000602082840312156142b557600080fd5b5051919050565b6000602082840312156142ce57600080fd5b8151611119816141bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561434957614349614308565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143af576143af614308565b5060010190565b600181815b8085111561440f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156143f5576143f5614308565b8085161561440257918102915b93841c93908002906143bb565b509250929050565b60008261442657506001610aff565b8161443357506000610aff565b816001811461444957600281146144535761446f565b6001915050610aff565b60ff84111561446457614464614308565b50506001821b610aff565b5060208310610133831016604e8410600b8410161715614492575081810a610aff565b61449c83836143b6565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156144ce576144ce614308565b029392505050565b600061111960ff841683614417565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561451d5761451d614308565b500290565b600082614558577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000821982111561457057614570614308565b500190565b60006020828403121561458757600080fd5b8151611119816140bd565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156145ef57845173ffffffffffffffffffffffffffffffffffffffff16835293830193918301916001016145bd565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b60008060006060848603121561463257600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204ad51105d22bc77a515d6b0e9e82627854012945e1913627b4b61b7c5e19abb264736f6c63430008090033

Deployed Bytecode Sourcemap

17134:21070:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21051:83;;;;;;;;;;-1:-1:-1;21121:5:0;;;;;;;;;;;;;;;;21051:83;;;;21121:5;21051:83;:::i;:::-;;;;;;;;22011:161;;;;;;;;;;-1:-1:-1;22011:161:0;;;;;:::i;:::-;;:::i;:::-;;;1319:14:1;;1312:22;1294:41;;1282:2;1267:18;22011:161:0;1154:187:1;23309:87:0;;;;;;;;;;-1:-1:-1;23378:10:0;;23309:87;;;1492:25:1;;;1480:2;1465:18;23309:87:0;1346:177:1;21347:95:0;;;;;;;;;;-1:-1:-1;21427:7:0;;21347:95;;18094:27;;;;;;;;;;;;;;;;22180:490;;;;;;;;;;-1:-1:-1;22180:490:0;;;;;:::i;:::-;;:::i;37871:179::-;;;;;;;;;;-1:-1:-1;37871:179:0;;;;;:::i;:::-;;:::i;:::-;;24475:472;;;;;;;;;;-1:-1:-1;24475:472:0;;;;;:::i;:::-;;:::i;23876:253::-;;;;;;;;;;-1:-1:-1;23876:253:0;;;;;:::i;:::-;;:::i;21233:83::-;;;;;;;;;;-1:-1:-1;21233:83:0;;17865:1;2974:36:1;;2962:2;2947:18;21233:83:0;2832:184:1;17680:47:0;;;;;;;;;;-1:-1:-1;17680:47:0;;;;;;;;;;;20890:135;;;;;;;;;;;;;:::i;22678:218::-;;;;;;;;;;-1:-1:-1;22678:218:0;;;;;:::i;:::-;;:::i;37495:188::-;;;;;;;;;;-1:-1:-1;37495:188:0;;;;;:::i;:::-;;:::i;18866:48::-;;;;;;;;;;-1:-1:-1;18866:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25103:111;;;;;;;;;;-1:-1:-1;25103:111:0;;;;;:::i;:::-;;:::i;23410:456::-;;;;;;;;;;-1:-1:-1;23410:456:0;;;;;:::i;:::-;;:::i;19134:40::-;;;;;;;;;;-1:-1:-1;19134:40:0;;;;;;;;;;;24955:140;;;;;;;;;;-1:-1:-1;24955:140:0;;;;;:::i;:::-;;:::i;17540:46::-;;;;;;;;;;-1:-1:-1;17540:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;19064:33;;;;;;;;;;-1:-1:-1;19064:33:0;;;;;;;;;;;3634:42:1;3622:55;;;3604:74;;3592:2;3577:18;19064:33:0;3458:226:1;25340:123:0;;;;;;;;;;-1:-1:-1;25340:123:0;;;;;:::i;:::-;25428:27;;25404:4;25428:27;;;:18;:27;;;;;;;;;25340:123;24137:330;;;;;;;;;;-1:-1:-1;24137:330:0;;;;;:::i;:::-;;:::i;38058:137::-;;;;;;;;;;-1:-1:-1;38058:137:0;;;;;:::i;:::-;;:::i;18799:29::-;;;;;;;;;;-1:-1:-1;18799:29:0;;;;;;;;21450:198;;;;;;;;;;-1:-1:-1;21450:198:0;;;;;:::i;:::-;;:::i;18386:120::-;;;;;;;;;;-1:-1:-1;18386:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4194:4:1;4182:17;;;4164:36;;4236:17;;;4231:2;4216:18;;4209:45;4290:17;;;4270:18;;;4263:45;;;;4344:17;;;4339:2;4324:18;;4317:45;4151:3;4136:19;18386:120:0;3949:419:1;19011:46:0;;;;;;;;;;-1:-1:-1;19011:46:0;;;;;;;;19183:56;;;;;;;;;;;;;;;;23181:120;;;;;;;;;;-1:-1:-1;23181:120:0;;;;;:::i;:::-;23273:20;;23249:4;23273:20;;;:11;:20;;;;;;;;;23181:120;10348:87;;;;;;;;;;-1:-1:-1;10394:7:0;10421:6;;;10348:87;;18835:24;;;;;;;;;;-1:-1:-1;18835:24:0;;;;;;;;37691:162;;;;;;;;;;-1:-1:-1;37691:162:0;;;;;:::i;:::-;;:::i;35687:99::-;;;;;;;;;;-1:-1:-1;35763:15:0;;35687:99;;20753:129;;;;;;;;;;;;;:::i;22904:269::-;;;;;;;;;;-1:-1:-1;22904:269:0;;;;;:::i;:::-;;:::i;25575:260::-;;;;;;;;;;-1:-1:-1;25575:260:0;;;;;:::i;:::-;;:::i;21656:194::-;;;;;;;;;;-1:-1:-1;21656:194:0;;;;;:::i;:::-;;:::i;26750:140::-;;;;;;;;;;-1:-1:-1;26750:140:0;;;;;:::i;:::-;;:::i;26898:171::-;;;;;;;;;;-1:-1:-1;26898:171:0;;;;;:::i;:::-;;:::i;35798:134::-;;;;;;;;;;-1:-1:-1;35798:134:0;;;;;:::i;:::-;;:::i;26104:170::-;;;;;;;;;;-1:-1:-1;26104:170:0;;;;;:::i;:::-;;:::i;19248:72::-;;;;;;;;;;;;;;;;25843:253;;;;;;;;;;-1:-1:-1;25843:253:0;;;;;:::i;:::-;;:::i;26281:250::-;;;;;;;;;;-1:-1:-1;26281:250:0;;;;;:::i;:::-;;:::i;35570:105::-;;;;;;;;;;-1:-1:-1;35649:18:0;;35570:105;;21860:143;;;;;;;;;;-1:-1:-1;21860:143:0;;;;;:::i;:::-;21968:18;;;;21941:7;21968:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21860:143;25222:110;;;;;;;;;;-1:-1:-1;25222:110:0;;;;;:::i;:::-;;:::i;26543:109::-;;;;;;;;;;-1:-1:-1;26543:109:0;;;;;:::i;:::-;;:::i;10803:244::-;;;;;;;;;;-1:-1:-1;10803:244:0;;;;;:::i;:::-;;:::i;17627:46::-;;;;;;;;;;-1:-1:-1;17627:46:0;;;;;;;;22011:161;22086:4;22103:39;7781:10;22126:7;22135:6;22103:8;:39::i;:::-;-1:-1:-1;22160:4:0;22011:161;;;;;:::o;22180:490::-;22278:4;22298:17;;;9251:20;9290:8;22294:215;;22334:66;22344:6;22352:9;22363:6;22371:28;;;;;;;;;;;22334:9;:66::i;:::-;22294:215;;;22470:26;;22433:64;;22443:6;;22451:9;;22462:6;;22470:26;;22433:9;:64::i;:::-;22519:121;22528:6;7781:10;22550:89;22588:6;22550:89;;;;;;;;;;;;;;;;;:19;;;;;;;:11;:19;;;;;;;;7781:10;22550:33;;;;;;;;;;:37;:89::i;:::-;22519:8;:121::i;:::-;-1:-1:-1;22658:4:0;22180:490;;;;;:::o;37871:179::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;;;;;;;;;37974:30:::1;::::0;;;;37998:4:::1;37974:30;::::0;::::1;3604:74:1::0;37956:15:0::1;::::0;37974::::1;::::0;::::1;::::0;::::1;::::0;3577:18:1;;37974:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38015:27;::::0;;;;:14:::1;6957:55:1::0;;;38015:27:0::1;::::0;::::1;6939:74:1::0;7029:18;;;7022:34;;;37956:48:0;;-1:-1:-1;38015:14:0;;::::1;::::0;::::1;::::0;6912:18:1;;38015:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37945:105;37871:179:::0;;:::o;24475:472::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;24554:20:::1;::::0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;24546:56;;;::::0;::::1;::::0;;7519:2:1;24546:56:0::1;::::0;::::1;7501:21:1::0;7558:2;7538:18;;;7531:30;7597:25;7577:18;;;7570:53;7640:18;;24546:56:0::1;7317:347:1::0;24546:56:0::1;24618:9;24613:327;24637:9;:16:::0;24633:20;::::1;24613:327;;;24695:7;24679:23;;:9;24689:1;24679:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;:23;24675:254;;;24738:9;24748:16:::0;;:20:::1;::::0;24767:1:::1;::::0;24748:20:::1;:::i;:::-;24738:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;24723:9:::1;:12:::0;;24738:31:::1;::::0;;::::1;::::0;24733:1;;24723:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;;::::1;;::::0;;::::1;;::::0;;24788:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;24827:11:::1;:20:::0;;;;:28;;;::::1;::::0;;24874:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;24613:327:::1;24475:472:::0;:::o;24675:254::-:1;24655:3:::0;::::1;::::0;::::1;:::i;:::-;;;;24613:327;;;;24475:472:::0;:::o;23876:253::-;23942:7;23981;;23970;:18;;23962:73;;;;;;;8768:2:1;23962:73:0;;;8750:21:1;8807:2;8787:18;;;8780:30;8846:34;8826:18;;;8819:62;8917:12;8897:18;;;8890:40;8947:19;;23962:73:0;8566:406:1;23962:73:0;24046:19;24069:10;:8;:10::i;:::-;24046:33;-1:-1:-1;24097:24:0;:7;24046:33;24097:11;:24::i;:::-;24090:31;23876:253;-1:-1:-1;;;23876:253:0:o;20890:135::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;20989:28:::1;::::0;;20957:60;;::::1;20989:28;::::0;;;::::1;;;20988:29;20957:60:::0;;::::1;;::::0;;20890:135::o;22678:218::-;7781:10;22766:4;22815:25;;;:11;:25;;;;;;;;;:34;;;;;;;;;;22766:4;;22783:83;;22806:7;;22815:50;;22854:10;22815:38;:50::i;37495:188::-;7781:10;35980:28;;;;:14;:28;;;;;;;;35972:64;;;;;;;9179:2:1;35972:64:0;;;9161:21:1;9218:2;9198:18;;;9191:30;9257:25;9237:18;;;9230:53;9300:18;;35972:64:0;8977:347:1;35972:64:0;37614:23:::1;37620:9;37631:5;37614;:23::i;:::-;37653:22;::::0;;9503:25:1;;;9576:42;9564:55;;9559:2;9544:18;;9537:83;37653:22:0::1;::::0;9476:18:1;37653:22:0::1;;;;;;;;37495:188:::0;;:::o;25103:111::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;25172:27:::1;;;::::0;;;:18:::1;:27;::::0;;;;:34;;;::::1;25202:4;25172:34;::::0;;25103:111::o;23410:456::-;23500:7;23539;;23528;:18;;23520:62;;;;;;;9833:2:1;23520:62:0;;;9815:21:1;9872:2;9852:18;;;9845:30;9911:33;9891:18;;;9884:61;9962:18;;23520:62:0;9631:355:1;23520:62:0;23598:17;23593:266;;23632:28;23663:25;23674:7;23683:4;23663:10;:25::i;:::-;23710:9;;-1:-1:-1;23703:16:0;;-1:-1:-1;23703:16:0;23593:266;23752:28;23783:25;23794:7;23803:4;23783:10;:25::i;:::-;23830:17;;;;-1:-1:-1;23823:24:0;;-1:-1:-1;23823:24:0;24955:140;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;25030:23:::1;25045:7;25030:14;:23::i;:::-;25064;25079:7;25064:14;:23::i;:::-;24955:140:::0;:::o;24137:330::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;24217:20:::1;::::0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;24216:21;24208:61;;;::::0;::::1;::::0;;10193:2:1;24208:61:0::1;::::0;::::1;10175:21:1::0;10232:2;10212:18;;;10205:30;10271:29;10251:18;;;10244:57;10318:18;;24208:61:0::1;9991:351:1::0;24208:61:0::1;24283:16;::::0;::::1;24302:1;24283:16:::0;;;:7:::1;:16;::::0;;;;;:20;24280:108:::1;;24359:16;::::0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;24339:37:::1;::::0;:19:::1;:37::i;:::-;24320:16;::::0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;24280:108:::1;24398:20;;;::::0;;;:11:::1;:20;::::0;;;;:27;;;::::1;24421:4;24398:27:::0;;::::1;::::0;;;24436:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;24137:330::o;38058:137::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;38145:42:::1;::::0;:19:::1;::::0;::::1;::::0;38165:21:::1;38145:42:::0;::::1;;;::::0;::::1;::::0;;;38165:21;38145:19;:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;21450:198:::0;21540:20;;;21516:7;21540:20;;;:11;:20;;;;;;;;21536:49;;;-1:-1:-1;21569:16:0;;;;;;:7;:16;;;;;;;21450:198::o;21536:49::-;21623:16;;;;;;;:7;:16;;;;;;21603:37;;:19;:37::i;37691:162::-;7781:10;35980:28;;;;:14;:28;;;;;;;;35972:64;;;;;;;9179:2:1;35972:64:0;;;9161:21:1;9218:2;9198:18;;;9191:30;9257:25;9237:18;;;9230:53;9300:18;;35972:64:0;8977:347:1;35972:64:0;37780:25:::1;37786:11;37799:5;37780;:25::i;:::-;37821:24;::::0;;9503:25:1;;;9576:42;9564:55;;9559:2;9544:18;;9537:83;37821:24:0::1;::::0;9476:18:1;37821:24:0::1;9329:297:1::0;20753:129:0;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;20848:26:::1;::::0;;20818:56;;::::1;20848:26;::::0;;::::1;20847:27;20818:56;::::0;;20753:129::o;22904:269::-;22997:4;23014:129;7781:10;23037:7;23046:96;23085:15;23046:96;;;;;;;;;;;;;;;;;7781:10;23046:25;;;;:11;:25;;;;;;;;;:34;;;;;;;;;;;;:38;:96::i;25575:260::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;25682:8:::1;:19:::0;;::::1;::::0;;::::1;25710:24:::0;;;;;;;;25682:19:::1;25710:24:::0;;::::1;;;25781:19:::0;;25743:29;;;::::1;;25781:19:::0;;;;;;::::1;::::0;;;::::1;;::::0;;25814:13:::1;::::0;::::1;::::0;-1:-1:-1;;25814:13:0::1;25575:260:::0;;;;:::o;21656:194::-;21734:4;21751:69;7781:10;21793:26;;21775:9;;21785:6;;21793:26;;21751:9;:69::i;26750:140::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;26869:13:::1;17865:1;26869:2;:13;:::i;:::-;26857:25;::::0;:9;:25:::1;:::i;:::-;26825:29;:57:::0;-1:-1:-1;26750:140:0:o;26898:171::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;26975:21:::1;:32:::0;;;::::1;;::::0;::::1;::::0;;;::::1;;::::0;;27023:38:::1;::::0;::::1;::::0;::::1;::::0;26999:8;1319:14:1;1312:22;1294:41;;1282:2;1267:18;;1154:187;27023:38:0::1;;;;;;;;26898:171:::0;:::o;35798:134::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;35886:28:::1;::::0;;;::::1;;::::0;;;:14:::1;:28;::::0;;;;:38;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;35798:134::o;26104:170::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;26180:34:::1;;;::::0;;;:18:::1;:34;::::0;;;;;;;:41;;26217:4:::1;26180:41:::0;;;::::1;::::0;::::1;::::0;;;26230:15:::1;:31:::0;;;;;:36;;;;::::1;::::0;;::::1;::::0;;26104:170::o;25843:253::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;25922:14:::1;:26:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;25957:9:::1;:16:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;25922:14:::1;25982:29:::0;;;:18:::1;:29;::::0;;;;;:36;;;;;::::1;25922:26:::0;25982:36;;::::1;::::0;;;26027:24;;;;;;:31;;;;::::1;;::::0;;;26072:16;::::1;::::0;25922:14;26072:16:::1;25843:253:::0;;:::o;26281:250::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;26385:12:::1;::::0;26423:7:::1;::::0;:34:::1;::::0;26453:3:::1;::::0;26423:25:::1;::::0;26435:12;26423:11:::1;:25::i;:::-;:29:::0;::::1;:34::i;:::-;26408:12;:49:::0;;;26473:50:::1;::::0;;12257:25:1;;;12313:2;12298:18;;12291:34;;;;26473:50:0::1;::::0;12230:18:1;26473:50:0::1;12083:248:1::0;25222:110:0;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;25289:27:::1;;25319:5;25289:27:::0;;;:18:::1;:27;::::0;;;;:35;;;::::1;::::0;;25222:110::o;26543:109::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;26618:12:::1;:26:::0;26543:109::o;10803:244::-;10394:7;10421:6;10568:23;10421:6;7781:10;10568:23;10560:68;;;;;;;6417:2:1;10560:68:0;;;6399:21:1;;;6436:18;;;6429:30;6495:34;6475:18;;;6468:62;6547:18;;10560:68:0;6215:356:1;10560:68:0;10892:22:::1;::::0;::::1;10884:73;;;::::0;::::1;::::0;;12538:2:1;10884:73:0::1;::::0;::::1;12520:21:1::0;12577:2;12557:18;;;12550:30;12616:34;12596:18;;;12589:62;12687:8;12667:18;;;12660:36;12713:19;;10884:73:0::1;12336:402:1::0;10884:73:0::1;10994:6;::::0;;10973:38:::1;::::0;::::1;::::0;;::::1;::::0;10994:6;::::1;::::0;10973:38:::1;::::0;::::1;11022:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;10803:244::o;30073:337::-;30166:19;;;30158:68;;;;;;;12945:2:1;30158:68:0;;;12927:21:1;12984:2;12964:18;;;12957:30;13023:34;13003:18;;;12996:62;13094:6;13074:18;;;13067:34;13118:19;;30158:68:0;12743:400:1;30158:68:0;30245:21;;;30237:68;;;;;;;13350:2:1;30237:68:0;;;13332:21:1;13389:2;13369:18;;;13362:30;13428:34;13408:18;;;13401:62;13499:4;13479:18;;;13472:32;13521:19;;30237:68:0;13148:398:1;30237:68:0;30318:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;30370:32;;1492:25:1;;;30370:32:0;;1465:18:1;30370:32:0;;;;;;;;30073:337;;;:::o;30424:1279::-;30536:1;30527:6;:10;30519:64;;;;;;;13753:2:1;30519:64:0;;;13735:21:1;13792:2;13772:18;;;13765:30;13831:34;13811:18;;;13804:62;13902:11;13882:18;;;13875:39;13931:19;;30519:64:0;13551:405:1;30519:64:0;30612:15;30622:4;30612:9;:15::i;:::-;30602:6;:25;;30594:108;;;;;;;14163:2:1;30594:108:0;;;14145:21:1;14202:2;14182:18;;;14175:30;14241:34;14221:18;;;14214:62;14312:34;14292:18;;;14285:62;14384:9;14363:19;;;14356:38;14411:19;;30594:108:0;13961:475:1;30594:108:0;10394:7;10421:6;;30780:15;;;10421:6;;30780:15;;;;:32;;-1:-1:-1;10394:7:0;10421:6;;30799:13;;;10421:6;;30799:13;;30780:32;30779:88;;;;-1:-1:-1;30820:21:0;;;;;;;:15;:21;;;;;;;;30819:22;:47;;;;-1:-1:-1;30847:19:0;;;;;;;:15;:19;;;;;;;;30846:20;30819:47;30776:183;;;30902:12;;30892:6;:22;;30884:75;;;;;;;14643:2:1;30884:75:0;;;14625:21:1;14682:2;14662:18;;;14655:30;14721:34;14701:18;;;14694:62;14792:10;14772:18;;;14765:38;14820:19;;30884:75:0;14441:404:1;30884:75:0;30972:28;31003:24;31021:4;31003:9;:24::i;:::-;30972:55;;31067:12;;31043:20;:36;31040:103;;-1:-1:-1;31119:12:0;;31040:103;31206:29;;31182:53;;;;;;;31250:40;;-1:-1:-1;31274:16:0;;;;;;;31273:17;31250:40;:69;;;;-1:-1:-1;31302:17:0;;;31294:25;;;31302:17;;31294:25;;31250:69;:94;;;;-1:-1:-1;31323:21:0;;;;;;;31250:94;31246:259;;;31384:29;;31361:52;;31457:36;31472:20;31457:14;:36::i;:::-;31515:29;31547:7;:77;;;;-1:-1:-1;31573:24:0;;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;31601:22:0;;;;;;;:18;:22;;;;;;;;31573:50;31571:53;31547:77;31515:109;;31637:58;31652:4;31658:2;31662:6;31670:24;31637:14;:58::i;:::-;30508:1195;;;30424:1279;;;;:::o;6886:166::-;6972:7;7008:12;7000:6;;;;6992:29;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;7039:5:0;7043:1;7039;:5;:::i;:::-;7032:12;6886:166;-1:-1:-1;;;;6886:166:0:o;28974:163::-;29015:7;29036:15;29053;29072:19;:17;:19::i;:::-;29035:56;;-1:-1:-1;29035:56:0;-1:-1:-1;29109:20:0;29035:56;;29109:11;:20::i;:::-;29102:27;;;;28974:163;:::o;6256:153::-;6314:7;6346:1;6342;:5;6334:44;;;;;;;15052:2:1;6334:44:0;;;15034:21:1;15091:2;15071:18;;;15064:30;15130:28;15110:18;;;15103:56;15176:18;;6334:44:0;14850:350:1;6334:44:0;6396:5;6400:1;6396;:5;:::i;4679:179::-;4737:7;;4769:5;4773:1;4769;:5;:::i;:::-;4757:17;;4798:1;4793;:6;;4785:46;;;;;;;15819:2:1;4785:46:0;;;15801:21:1;15858:2;15838:18;;;15831:30;15897:29;15877:18;;;15870:57;15944:18;;4785:46:0;15617:351:1;36064:670:0;36150:1;36141:6;:10;36133:64;;;;;;;13753:2:1;36133:64:0;;;13735:21:1;13792:2;13772:18;;;13765:30;13831:34;13811:18;;;13804:62;13902:11;13882:18;;;13875:39;13931:19;;36133:64:0;13551:405:1;36133:64:0;36248:13;17865:1;36248:2;:13;:::i;:::-;36236:25;;:9;:25;:::i;:::-;36226:6;36216:7;;:16;;;;:::i;:::-;:45;;36208:87;;;;;;;16175:2:1;36208:87:0;;;16157:21:1;16214:2;16194:18;;;16187:30;16253:31;16233:18;;;16226:59;16302:18;;36208:87:0;15973:353:1;36208:87:0;36316:24;36343:34;36369:7;;36344:19;36355:7;;36344:6;:10;;:19;;;;:::i;36343:34::-;36408:7;;36316:61;;-1:-1:-1;36408:19:0;;36420:6;36408:11;:19::i;:::-;36398:7;:29;36448:7;;:29;;36460:16;36448:11;:29::i;:::-;36438:7;:39;36494:22;;;;;;;:11;:22;;;;;;;;36490:106;;;36554:18;;;;;;;:7;:18;;;;;;:30;;36577:6;36554:22;:30::i;:::-;36533:18;;;;;;;:7;:18;;;;;:51;36490:106;36629:18;;;;;;;:7;:18;;;;;;:40;;36652:16;36629:22;:40::i;:::-;36608:18;;;;;;;:7;:18;;;;;;:61;;;;36687:39;;36608:18;;;36687:39;;;;36719:6;1492:25:1;;1480:2;1465:18;;1346:177;27334:330:0;27407:36;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27407:36:0;27468:29;27480:7;27489;27468:11;:29::i;:::-;27456:41;;27573:52;27585:9;27596:7;27605;27614:10;:8;:10::i;:::-;27573:11;:52::i;:::-;27555:14;;;27508:117;27528:25;;;27508:117;;;27334:330;;;;:::o;36742:745::-;36832:1;36823:6;:10;36815:64;;;;;;;13753:2:1;36815:64:0;;;13735:21:1;13792:2;13772:18;;;13765:30;13831:34;13811:18;;;13804:62;13902:11;13882:18;;;13875:39;13931:19;;36815:64:0;13551:405:1;36815:64:0;36908:24;36918:13;36908:9;:24::i;:::-;36898:6;:34;;36890:67;;;;;;;16533:2:1;36890:67:0;;;16515:21:1;16572:2;16552:18;;;16545:30;16611:22;16591:18;;;16584:50;16651:18;;36890:67:0;16331:344:1;36890:67:0;36996:1;36986:6;36976:7;;:16;;;;:::i;:::-;:21;;36968:64;;;;;;;16882:2:1;36968:64:0;;;16864:21:1;16921:2;16901:18;;;16894:30;16960:32;16940:18;;;16933:60;17010:18;;36968:64:0;16680:354:1;36968:64:0;37045:24;37072:34;37098:7;;37073:19;37084:7;;37073:6;:10;;:19;;;;:::i;37072:34::-;37137:7;;37045:61;;-1:-1:-1;37137:19:0;;37149:6;37137:11;:19::i;:::-;37127:7;:29;37177:7;;:29;;37189:16;37177:11;:29::i;:::-;37167:7;:39;37223:26;;;;;;;:11;:26;;;;;;;;37219:118;;;37291:22;;;;;;;:7;:22;;;;;;:34;;37318:6;37291:26;:34::i;:::-;37266:22;;;;;;;:7;:22;;;;;:59;37219:118;37374:22;;;;;;;:7;:22;;;;;;:44;;37401:16;37374:26;:44::i;:::-;37349:22;;;;;;;:7;:22;;;;;;:69;;;;37436:43;;;;;;37472:6;1492:25:1;;1480:2;1465:18;;1346:177;5558:220:0;5616:7;5640:6;5636:20;;-1:-1:-1;5655:1:0;5648:8;;5636:20;5667:9;5679:5;5683:1;5679;:5;:::i;:::-;5667:17;-1:-1:-1;5712:1:0;5703:5;5707:1;5667:17;5703:5;:::i;:::-;:10;5695:56;;;;;;;17241:2:1;5695:56:0;;;17223:21:1;17280:2;17260:18;;;17253:30;17319:34;17299:18;;;17292:62;17390:3;17370:18;;;17363:31;17411:19;;5695:56:0;17039:397:1;33409:846:0;20064:16;:23;;;;;;;;;33560:27:::1;:20:::0;33585:1:::1;33560:24;:27::i;:::-;33545:42:::0;-1:-1:-1;33598:17:0::1;33618:30;:20:::0;33545:42;33618:24:::1;:30::i;:::-;33598:50:::0;-1:-1:-1;33951:21:0::1;33988:22;34005:4:::0;33988:16:::1;:22::i;:::-;33985:263;;;34065:18;34086:41;:21;34112:14:::0;34086:25:::1;:41::i;:::-;34065:62;;34140:35;34153:9;34164:10;34140:12;:35::i;:::-;34193:43;::::0;;17643:25:1;;;17699:2;17684:18;;17677:34;;;17727:18;;;17720:34;;;34193:43:0::1;::::0;17631:2:1;17616:18;34193:43:0::1;;;;;;;34012:236;33985:263;-1:-1:-1::0;;20110:16:0;:24;;;;;;-1:-1:-1;;33409:846:0:o;31713:1175::-;31826:18;;;;;;;:7;:18;;;;;;31822:46;;31852:12;:14;;;:12;:14;;;:::i;:::-;;;;;;31822:46;31878:28;31909;31920:7;31929;31909:10;:28::i;:::-;31954:19;;;;;;;:11;:19;;;;;;31878:59;;-1:-1:-1;31954:19:0;;:46;;;;-1:-1:-1;31978:22:0;;;;;;;:11;:22;;;;;;;;31977:23;31954:46;31950:542;;;32056:15;;;;;;;:7;:15;;;;;;:28;;32076:7;32056:19;:28::i;:::-;32038:15;;;;;;;:7;:15;;;;;:46;31950:542;;;32107:19;;;;;;;:11;:19;;;;;;;;32106:20;:46;;;;-1:-1:-1;32130:22:0;;;;;;;:11;:22;;;;;;;;32106:46;32102:390;;;32231:17;;;;32208:18;;;;;;;:7;:18;;;;;;:41;;:22;:41::i;:::-;32187:18;;;;;;;:7;:18;;;;;:62;32102:390;;;32271:19;;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;32294:22:0;;;;;;;:11;:22;;;;;;;;32271:45;32267:225;;;32371:15;;;;;;;:7;:15;;;;;;:28;;32391:7;32371:19;:28::i;:::-;32353:15;;;;;;;;:7;:15;;;;;;:46;;;;32462:17;;;;32439:18;;;;;;;;;;:41;;:22;:41::i;:::-;32418:18;;;;;;;:7;:18;;;;;:62;32267:225;32599:9;;32579:15;;;32599:9;32579:15;;;:7;:15;;;;;;:30;;:19;:30::i;:::-;32561:15;;;;;;;;:7;:15;;;;;;;;:48;;;;32664:17;;;32641:18;;;;;;;;;;:41;;:22;:41::i;:::-;32620:18;;;;;;;:7;:18;;;;;:62;32710:12;;;;32695:28;;:14;:28::i;:::-;32734:27;32746:1;:6;;;32754:1;:6;;;32734:11;:27::i;:::-;32772:44;32797:1;:6;;;32804:1;:11;;;32772:24;:44::i;:::-;32851:9;32834:46;;32843:6;32834:46;;;32862:1;:17;;;32834:46;;;;1492:25:1;;1480:2;1465:18;;1346:177;32834:46:0;;;;;;;;31811:1077;31713:1175;;;;:::o;29145:555::-;29242:7;;29278;;29195;;;;;29296:289;29320:9;:16;29316:20;;29296:289;;;29386:7;29362;:21;29370:9;29380:1;29370:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;29362:21;;;;;;;;;;;;;:31;;:66;;;29421:7;29397;:21;29405:9;29415:1;29405:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;29397:21;;;;;;;;;;;;;:31;29362:66;29358:97;;;29438:7;;29447;;29430:25;;;;;;;29145:555;;:::o;29358:97::-;29480:34;29492:7;:21;29500:9;29510:1;29500:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;29492:21;;;;;;;;;;;;;29480:7;;:11;:34::i;:::-;29470:44;;29539:34;29551:7;:21;29559:9;29569:1;29559:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;29551:21;;;;;;;;;;;;;29539:7;;:11;:34::i;:::-;29529:44;-1:-1:-1;29338:3:0;;;;:::i;:::-;;;;29296:289;;;-1:-1:-1;29621:7:0;;29609;;:20;;:11;:20::i;:::-;29599:7;:30;29595:61;;;29639:7;;29648;;29631:25;;;;;;29145:555;;:::o;29595:61::-;29675:7;;29684;;-1:-1:-1;29145:555:0;-1:-1:-1;29145:555:0:o;27672:574::-;27746:28;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27746:28:0;27793:7;27789:90;;27817:17;;;:27;;;27859:8;;27789:90;27912:8;:12;27900:34;;27930:3;;27900:25;;:7;;27912:12;;27900:11;:25::i;:34::-;27891:6;;;:43;27972:8;:18;27960:40;;27996:3;;27960:31;;:7;;27972:18;;;;;27960:11;:31::i;:40::-;27945:12;;;:55;28037:8;:17;28025:39;;28060:3;;28025:30;;:7;;28037:17;;;;;28025:11;:30::i;:39::-;28011:11;;;:53;28096:8;:12;28084:34;;28114:3;;28084:25;;:7;;28096:12;;;;;28084:11;:25::i;:34::-;28075:1;:6;;:43;;;;;28151:66;28210:1;:6;;;28151:54;28193:1;:11;;;28151:37;28175:1;:12;;;28151:19;28163:1;:6;;;28151:7;:11;;:19;;;;:::i;:::-;:23;;:37::i;:66::-;28131:17;;;:86;27672:574;;;;:::o;28254:712::-;28379:15;;;28458:24;:7;28470:11;28458;:24::i;:::-;28448:34;;28545:7;28541:65;;-1:-1:-1;28574:7:0;;-1:-1:-1;28592:1:0;28567:27;;28541:65;28625:6;;;;:23;;28636:11;28625:10;:23::i;:::-;28618:30;;28659:18;28680:29;28697:11;28680:1;:12;;;:16;;:29;;;;:::i;:::-;28659:50;;28720:17;28740:28;28756:11;28740:1;:11;;;:15;;:28;;;;:::i;:::-;28720:48;;28779:12;28794:23;28805:11;28794:1;:6;;;:10;;:23;;;;:::i;:::-;28779:38;-1:-1:-1;28848:58:0;28779:38;28848:48;28886:9;28848:48;28870:10;28848:48;:7;28860:4;28848:11;:17::i;:58::-;28830:76;;28919:39;;;28254:712;;;;;;;;;:::o;5141:158::-;5199:7;5232:1;5227;:6;;5219:49;;;;;;;17967:2:1;5219:49:0;;;17949:21:1;18006:2;17986:18;;;17979:30;18045:32;18025:18;;;18018:60;18095:18;;5219:49:0;17765:354:1;5219:49:0;5286:5;5290:1;5286;:5;:::i;34422:733::-;34535:16;;;34549:1;34535:16;;;;;;;;34486:11;;;;34535:16;34549:1;34535:16;;;;;;;;;;-1:-1:-1;34535:16:0;34511:40;;34580:4;34562;34567:1;34562:7;;;;;;;;:::i;:::-;:23;;;;:7;;;;;;;;;;:23;;;;34606:19;;:26;;;;;;;;:19;;;;;:24;;:26;;;;;34562:7;;34606:26;;;;;:19;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34596:4;34601:1;34596:7;;;;;;;;:::i;:::-;:36;;;;:7;;;;;;;;;;:36;;;;34681:19;;34666:4;21941:7;21968:18;;;:11;:18;;;;;;34681:19;;;;21968:27;;;;;;34705:11;-1:-1:-1;34645:164:0;;;34763:19;;34731:66;;34748:4;;34763:19;;34785:11;34731:8;:66::i;:::-;34825:19;;:134;;;;;:19;;;;;:70;;:134;;34910:11;;34825:19;;34924:4;;34937;;34943:15;;34825:134;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34821:325;;35079:30;;;;;19802:2:1;19784:21;;;19841:1;19821:18;;;19814:29;19879:8;19874:2;19859:18;;19852:36;19920:2;19905:18;;19600:329;35079:30:0;;;;;;;;-1:-1:-1;35129:5:0;;34422:733;-1:-1:-1;;34422:733:0:o;34821:325::-;34978:31;;;;;20136:2:1;20118:21;;;20175:1;20155:18;;;20148:29;20213:9;20208:2;20193:18;;20186:37;20255:2;20240:18;;19934:330;34978:31:0;;;;;;;;-1:-1:-1;35029:4:0;;34422:733;-1:-1:-1;;34422:733:0:o;35163:399::-;35244:19;;;;:35;35287:9;35320:4;35340:11;35244:19;;35452:7;10394;10421:6;;;;10348:87;35452:7;35244:256;;;;;;;;;;20582:42:1;20651:15;;;35244:256:0;;;20633:34:1;20683:18;;;20676:34;;;;20726:18;;;20719:34;;;;20769:18;;;20762:34;20833:15;;;20812:19;;;20805:44;35474:15:0;20865:19:1;;;20858:35;20544:19;;35244:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;35516:38:0;;;12257:25:1;;;12313:2;12298:18;;12291:34;;;35516:38:0;;-1:-1:-1;12230:18:1;35516:38:0;12083:248:1;29708:355:0;29771:19;29794:10;:8;:10::i;:::-;29771:33;-1:-1:-1;29815:18:0;29836:27;:10;29771:33;29836:14;:27::i;:::-;29915:4;29899:22;;;;:7;:22;;;;;;29815:48;;-1:-1:-1;29899:38:0;;29815:48;29899:26;:38::i;:::-;29890:4;29874:22;;;;:7;:22;;;;;;;;:63;;;;29951:11;:26;;;;;;29948:107;;;30033:4;30017:22;;;;:7;:22;;;;;;:38;;30044:10;30017:26;:38::i;:::-;30008:4;29992:22;;;;:7;:22;;;;;:63;29948:107;29760:303;;29708:355;:::o;27179:147::-;27257:7;;:17;;27269:4;27257:11;:17::i;:::-;27247:7;:27;27298:10;;:20;;27313:4;27298:14;:20::i;:::-;27285:10;:33;-1:-1:-1;;27179:147:0:o;32898:501::-;32984:19;33007:10;:8;:10::i;:::-;32984:33;-1:-1:-1;33028:19:0;33051:21;:4;32984:33;33051:8;:21::i;:::-;33028:44;-1:-1:-1;33083:17:0;33104:26;:9;33118:11;33104:13;:26::i;:::-;33162:18;;33083:47;;-1:-1:-1;33162:28:0;;33185:4;33162:22;:28::i;:::-;33141:18;:49;33230:9;;;;33222:18;;;;:7;:18;;;;;;:35;;33245:11;33222:22;:35::i;:::-;33209:9;;;;33201:18;;;;:7;:18;;;;;:56;33286:15;;:30;;33306:9;33286:19;:30::i;:::-;33268:15;:48;33361:14;;;;33353:23;;;;:7;:23;;;;;;:38;;33381:9;33353:27;:38::i;:::-;33335:14;;;;33327:23;;;;:7;:23;;;;;:64;-1:-1:-1;;;;;32898:501:0:o;14:656:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;586:2:1;574:15;591:66;570:88;555:104;;;;661:2;551:113;;14:656;-1:-1:-1;;;14:656:1:o;675:154::-;761:42;754:5;750:54;743:5;740:65;730:93;;819:1;816;809:12;834:315;902:6;910;963:2;951:9;942:7;938:23;934:32;931:52;;;979:1;976;969:12;931:52;1018:9;1005:23;1037:31;1062:5;1037:31;:::i;:::-;1087:5;1139:2;1124:18;;;;1111:32;;-1:-1:-1;;;834:315:1:o;1528:456::-;1605:6;1613;1621;1674:2;1662:9;1653:7;1649:23;1645:32;1642:52;;;1690:1;1687;1680:12;1642:52;1729:9;1716:23;1748:31;1773:5;1748:31;:::i;:::-;1798:5;-1:-1:-1;1855:2:1;1840:18;;1827:32;1868:33;1827:32;1868:33;:::i;:::-;1528:456;;1920:7;;-1:-1:-1;;;1974:2:1;1959:18;;;;1946:32;;1528:456::o;1989:401::-;2070:6;2078;2131:2;2119:9;2110:7;2106:23;2102:32;2099:52;;;2147:1;2144;2137:12;2099:52;2186:9;2173:23;2205:31;2230:5;2205:31;:::i;:::-;2255:5;-1:-1:-1;2312:2:1;2297:18;;2284:32;2325:33;2284:32;2325:33;:::i;:::-;2377:7;2367:17;;;1989:401;;;;;:::o;2395:247::-;2454:6;2507:2;2495:9;2486:7;2482:23;2478:32;2475:52;;;2523:1;2520;2513:12;2475:52;2562:9;2549:23;2581:31;2606:5;2581:31;:::i;2647:180::-;2706:6;2759:2;2747:9;2738:7;2734:23;2730:32;2727:52;;;2775:1;2772;2765:12;2727:52;-1:-1:-1;2798:23:1;;2647:180;-1:-1:-1;2647:180:1:o;3021:118::-;3107:5;3100:13;3093:21;3086:5;3083:32;3073:60;;3129:1;3126;3119:12;3144:309;3209:6;3217;3270:2;3258:9;3249:7;3245:23;3241:32;3238:52;;;3286:1;3283;3276:12;3238:52;3322:9;3309:23;3299:33;;3382:2;3371:9;3367:18;3354:32;3395:28;3417:5;3395:28;:::i;4630:156::-;4696:20;;4756:4;4745:16;;4735:27;;4725:55;;4776:1;4773;4766:12;4725:55;4630:156;;;:::o;4791:393::-;4869:6;4877;4885;4893;4946:3;4934:9;4925:7;4921:23;4917:33;4914:53;;;4963:1;4960;4953:12;4914:53;4986:27;5003:9;4986:27;:::i;:::-;4976:37;;5032:36;5064:2;5053:9;5049:18;5032:36;:::i;:::-;5022:46;;5087:36;5119:2;5108:9;5104:18;5087:36;:::i;:::-;5077:46;;5142:36;5174:2;5163:9;5159:18;5142:36;:::i;:::-;5132:46;;4791:393;;;;;;;:::o;5189:241::-;5245:6;5298:2;5286:9;5277:7;5273:23;5269:32;5266:52;;;5314:1;5311;5304:12;5266:52;5353:9;5340:23;5372:28;5394:5;5372:28;:::i;5435:382::-;5500:6;5508;5561:2;5549:9;5540:7;5536:23;5532:32;5529:52;;;5577:1;5574;5567:12;5529:52;5616:9;5603:23;5635:31;5660:5;5635:31;:::i;:::-;5685:5;-1:-1:-1;5742:2:1;5727:18;;5714:32;5755:30;5714:32;5755:30;:::i;6576:184::-;6646:6;6699:2;6687:9;6678:7;6674:23;6670:32;6667:52;;;6715:1;6712;6705:12;6667:52;-1:-1:-1;6738:16:1;;6576:184;-1:-1:-1;6576:184:1:o;7067:245::-;7134:6;7187:2;7175:9;7166:7;7162:23;7158:32;7155:52;;;7203:1;7200;7193:12;7155:52;7235:9;7229:16;7254:28;7276:5;7254:28;:::i;7669:184::-;7721:77;7718:1;7711:88;7818:4;7815:1;7808:15;7842:4;7839:1;7832:15;7858:184;7910:77;7907:1;7900:88;8007:4;8004:1;7997:15;8031:4;8028:1;8021:15;8047:125;8087:4;8115:1;8112;8109:8;8106:34;;;8120:18;;:::i;:::-;-1:-1:-1;8157:9:1;;8047:125::o;8177:184::-;8229:77;8226:1;8219:88;8326:4;8323:1;8316:15;8350:4;8347:1;8340:15;8366:195;8405:3;8436:66;8429:5;8426:77;8423:103;;;8506:18;;:::i;:::-;-1:-1:-1;8553:1:1;8542:13;;8366:195::o;10347:482::-;10436:1;10479:5;10436:1;10493:330;10514:7;10504:8;10501:21;10493:330;;;10633:4;10565:66;10561:77;10555:4;10552:87;10549:113;;;10642:18;;:::i;:::-;10692:7;10682:8;10678:22;10675:55;;;10712:16;;;;10675:55;10791:22;;;;10751:15;;;;10493:330;;;10497:3;10347:482;;;;;:::o;10834:866::-;10883:5;10913:8;10903:80;;-1:-1:-1;10954:1:1;10968:5;;10903:80;11002:4;10992:76;;-1:-1:-1;11039:1:1;11053:5;;10992:76;11084:4;11102:1;11097:59;;;;11170:1;11165:130;;;;11077:218;;11097:59;11127:1;11118:10;;11141:5;;;11165:130;11202:3;11192:8;11189:17;11186:43;;;11209:18;;:::i;:::-;-1:-1:-1;;11265:1:1;11251:16;;11280:5;;11077:218;;11379:2;11369:8;11366:16;11360:3;11354:4;11351:13;11347:36;11341:2;11331:8;11328:16;11323:2;11317:4;11314:12;11310:35;11307:77;11304:159;;;-1:-1:-1;11416:19:1;;;11448:5;;11304:159;11495:34;11520:8;11514:4;11495:34;:::i;:::-;11625:6;11557:66;11553:79;11544:7;11541:92;11538:118;;;11636:18;;:::i;:::-;11674:20;;10834:866;-1:-1:-1;;;10834:866:1:o;11705:140::-;11763:5;11792:47;11833:4;11823:8;11819:19;11813:4;11792:47;:::i;11850:228::-;11890:7;12016:1;11948:66;11944:74;11941:1;11938:81;11933:1;11926:9;11919:17;11915:105;11912:131;;;12023:18;;:::i;:::-;-1:-1:-1;12063:9:1;;11850:228::o;15205:274::-;15245:1;15271;15261:189;;15306:77;15303:1;15296:88;15407:4;15404:1;15397:15;15435:4;15432:1;15425:15;15261:189;-1:-1:-1;15464:9:1;;15205:274::o;15484:128::-;15524:3;15555:1;15551:6;15548:1;15545:13;15542:39;;;15561:18;;:::i;:::-;-1:-1:-1;15597:9:1;;15484:128::o;18313:251::-;18383:6;18436:2;18424:9;18415:7;18411:23;18407:32;18404:52;;;18452:1;18449;18442:12;18404:52;18484:9;18478:16;18503:31;18528:5;18503:31;:::i;18569:1026::-;18831:4;18879:3;18868:9;18864:19;18910:6;18899:9;18892:25;18936:2;18974:6;18969:2;18958:9;18954:18;18947:34;19017:3;19012:2;19001:9;18997:18;18990:31;19041:6;19076;19070:13;19107:6;19099;19092:22;19145:3;19134:9;19130:19;19123:26;;19184:2;19176:6;19172:15;19158:29;;19205:1;19215:218;19229:6;19226:1;19223:13;19215:218;;;19294:13;;19309:42;19290:62;19278:75;;19408:15;;;;19373:12;;;;19251:1;19244:9;19215:218;;;-1:-1:-1;;19501:42:1;19489:55;;;;19484:2;19469:18;;19462:83;-1:-1:-1;;;19576:3:1;19561:19;19554:35;19450:3;18569:1026;-1:-1:-1;;;18569:1026:1:o;20904:306::-;20992:6;21000;21008;21061:2;21049:9;21040:7;21036:23;21032:32;21029:52;;;21077:1;21074;21067:12;21029:52;21106:9;21100:16;21090:26;;21156:2;21145:9;21141:18;21135:25;21125:35;;21200:2;21189:9;21185:18;21179:25;21169:35;;20904:306;;;;;:::o

Swarm Source

ipfs://4ad51105d22bc77a515d6b0e9e82627854012945e1913627b4b61b7c5e19abb2

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.