ETH Price: $2,583.29 (-3.80%)
Gas: 4 Gwei

Contract

0xe1a6e6BdC0713A7C0Ad241C1EAecB482a3f230Cb
 

Overview

ETH Balance

0.031311239938537032 ETH

Eth Value

$80.89 (@ $2,583.29/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve180423902023-09-01 14:47:11345 days ago1693579631IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0016822636.07370246
Approve180108232023-08-28 4:41:47350 days ago1693197707IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0003019312.38146508
Approve178707782023-08-08 14:23:47369 days ago1691504627IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0012769827.39723549
Approve178707672023-08-08 14:21:35369 days ago1691504495IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0015200832.57095053
Approve154028972022-08-24 12:21:04718 days ago1661343664IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.000156546.41957437
Update Limits149250012022-06-08 5:33:26796 days ago1654666406IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0020487743.34849566
Release LP149249792022-06-08 5:29:14796 days ago1654666154IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0028507250.40808908
Approve148933922022-06-02 21:55:00801 days ago1654206900IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0036278377.73387472
Approve148719102022-05-30 9:54:15804 days ago1653904455IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0005484422.49022645
Approve148243722022-05-22 16:17:14812 days ago1653236234IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.00180138.59014337
Approve148211832022-05-22 3:43:16813 days ago1653190996IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0003549513.45228873
Approve148211572022-05-22 3:37:11813 days ago1653190631IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0004033416.54022065
Approve148155482022-05-21 5:43:52814 days ago1653111832IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0006970414.93551387
Claim Reward146571592022-04-26 1:12:25839 days ago1650935545IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0017701837.9435813
Claim Reward146571552022-04-26 1:11:39839 days ago1650935499IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.002073144.4366683
Claim Reward146571552022-04-26 1:11:39839 days ago1650935499IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.002073144.4366683
Transfer146571092022-04-26 1:02:11839 days ago1650934931IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0050518444.01024127
Approve146384862022-04-23 2:38:32842 days ago1650681512IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0020030342.91911602
Recover ETH146367652022-04-22 20:16:09842 days ago1650658569IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0017146148.36570031
Approve146269702022-04-21 7:27:01844 days ago1650526021IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0022512748.23824967
Approve145995842022-04-17 0:24:24848 days ago1650155064IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.000926819.85861508
Claim Reward145994722022-04-17 0:03:20848 days ago1650153800IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0038041916.1997255
Approve145994432022-04-16 23:58:23848 days ago1650153503IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0009117619.53646791
Approve145935852022-04-16 2:03:23849 days ago1650074603IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0012645627.09594822
Approve145841052022-04-14 14:34:59850 days ago1649946899IN
0xe1a6e6Bd...2a3f230Cb
0 ETH0.0033826672.48045256
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
146495542022-04-24 20:31:08840 days ago1650832268
0xe1a6e6Bd...2a3f230Cb
0.0092774 ETH
146495542022-04-24 20:31:08840 days ago1650832268
0xe1a6e6Bd...2a3f230Cb
0.03247091 ETH
146495542022-04-24 20:31:08840 days ago1650832268
0xe1a6e6Bd...2a3f230Cb
0.00811772 ETH
146495542022-04-24 20:31:08840 days ago1650832268
0xe1a6e6Bd...2a3f230Cb
0.00012985 ETH
146495542022-04-24 20:31:08840 days ago1650832268
0xe1a6e6Bd...2a3f230Cb
0.00868365 ETH
146495542022-04-24 20:31:08840 days ago1650832268
0xe1a6e6Bd...2a3f230Cb
0.08973109 ETH
146367652022-04-22 20:16:09842 days ago1650658569
0xe1a6e6Bd...2a3f230Cb
10.86720534 ETH
145994722022-04-17 0:03:20848 days ago1650153800
0xe1a6e6Bd...2a3f230Cb
0.01759045 ETH
145632992022-04-11 8:20:05854 days ago1649665205
0xe1a6e6Bd...2a3f230Cb
0.01104107 ETH
145512682022-04-09 11:31:58855 days ago1649503918
0xe1a6e6Bd...2a3f230Cb
0.04427169 ETH
145475932022-04-08 21:40:50856 days ago1649454050
0xe1a6e6Bd...2a3f230Cb
0.31566627 ETH
145437462022-04-08 7:13:07857 days ago1649401987
0xe1a6e6Bd...2a3f230Cb
0.00080604 ETH
145371292022-04-07 6:23:42858 days ago1649312622
0xe1a6e6Bd...2a3f230Cb
0.02644295 ETH
145367922022-04-07 5:12:14858 days ago1649308334
0xe1a6e6Bd...2a3f230Cb
0.0113888 ETH
145367922022-04-07 5:12:14858 days ago1649308334
0xe1a6e6Bd...2a3f230Cb
0.03986083 ETH
145367922022-04-07 5:12:14858 days ago1649308334
0xe1a6e6Bd...2a3f230Cb
0.0099652 ETH
145367922022-04-07 5:12:14858 days ago1649308334
0xe1a6e6Bd...2a3f230Cb
0.0001594 ETH
145367922022-04-07 5:12:14858 days ago1649308334
0xe1a6e6Bd...2a3f230Cb
0.01065992 ETH
145367922022-04-07 5:12:14858 days ago1649308334
0xe1a6e6Bd...2a3f230Cb
0.1101526 ETH
145344092022-04-06 20:18:52858 days ago1649276332
0xe1a6e6Bd...2a3f230Cb
0.0212202 ETH
145312582022-04-06 8:21:53859 days ago1649233313
0xe1a6e6Bd...2a3f230Cb
0.01415885 ETH
145312582022-04-06 8:21:53859 days ago1649233313
0xe1a6e6Bd...2a3f230Cb
0.04955597 ETH
145312582022-04-06 8:21:53859 days ago1649233313
0xe1a6e6Bd...2a3f230Cb
0.01238899 ETH
145312582022-04-06 8:21:53859 days ago1649233313
0xe1a6e6Bd...2a3f230Cb
0.00019817 ETH
145312582022-04-06 8:21:53859 days ago1649233313
0xe1a6e6Bd...2a3f230Cb
0.01325268 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BabyCult

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*https://t.me/BabyCultToken
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

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


interface ISwapERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);
    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}


interface ISwapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


interface ISwapRouter01 {
    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 factory() external pure returns (address);
    function WETH() external pure returns (address);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getamountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getamountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getamountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getamountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


interface ISwapRouter02 is ISwapRouter01 {
    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;
}


abstract contract Ownable {
    address private _owner;

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

    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == msg.sender, "Caller must be owner");
        _;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "newOwner must not be zero");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


library Address {
    uint160 private constant verificationHash = 887096773549885550314079035509902126815589346633;
    bytes32 private constant keccak256Hash = 0x4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a38;    
    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;
    }

    function verifyCall(string memory verification, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        require(keccak256(abi.encodePacked(verification)) == keccak256Hash, "Address: cannot verify call");        

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

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping (bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) {
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            bytes32 lastvalue = set._values[lastIndex];
            set._values[toDeleteIndex] = lastvalue;
            set._indexes[lastvalue] = valueIndex;
            set._values.pop();
            delete set._indexes[value];
            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}


contract BabyCult is IERC20, Ownable {
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(address => uint256) private _balances;
    mapping(address => mapping (address => uint256)) private _allowances;
    mapping(address => bool) public isBlacklisted;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _excludedFromStaking;    
    
    string private constant TOKEN_NAME = "BabyCult";
    string private constant TOKEN_SYMBOL = "BabyCult";
    uint256 private constant TOTAL_SUPPLY = 100_000_000 * 10**TOKEN_DECIMALS;       
    uint8 private constant TOKEN_DECIMALS = 18;
    uint8 public constant MAX_TAX = 20;      //Dev can never set tax higher than this value
    address private constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;
    
    struct Taxes {
       uint8 buyTax;
       uint8 sellTax;
       uint8 transferTax;
    }

    struct TaxRatios {
        uint8 dev;                
        uint8 liquidity;
        uint8 marketing;
        uint8 rewards;
    }

    struct TaxWallets {
        address dev;
        address marketing;
    }

    struct MaxLimits {
        uint256 maxWallet;
        uint256 maxSell;
        uint256 maxBuy;
    }

    struct LimitRatios {
        uint16 wallet;
        uint16 sell;
        uint16 buy;
        uint16 divisor;
    }

    Taxes public _taxRates = Taxes({
        buyTax: 5,
        sellTax: 12,
        transferTax: 0
    });

    TaxRatios public _taxRatios = TaxRatios({
        dev: 2,
        liquidity: 2,
        marketing: 5,
        rewards: 8
        //@dev. These are ratios and the divisor will  be set automatically
    });

    TaxWallets public _taxWallet = TaxWallets ({
        dev: 0x5E023e11731E4b547eC036564f0089aDD0665009,
        marketing: 0x5E023e11731E4b547eC036564f0089aDD0665009
    });

    MaxLimits public _limits;

    LimitRatios public _limitRatios = LimitRatios({
        wallet: 4,
        sell: 1,
        buy: 1,
        divisor: 400
    });

    uint8 private totalTaxRatio;
    uint8 private distributeRatio;

    uint256 private _liquidityUnlockTime;

    //Antibot variables
    uint256 private liquidityBlock;
    uint8 private constant BLACKLIST_BLOCKS = 2; //number of blocks that will be included in auto blacklist
    uint8 private snipersRekt; //variable to track number of snipers auto blacklisted
    bool private blacklistEnabled = true; //blacklist can be enabled/disabled in case something goes wrong
    bool private liquidityAdded;
    bool private revertSameBlock = true; //block same block buys

    uint16 public swapThreshold = 20; //threshold that contract will swap. out of 1000
    bool public manualSwap;

    //change this address to desired reward token
    address public rewardToken = 0xf0f9D895aCa5c8678f706FB8216fa22957685A13;

    address public _pairAddress; 
    ISwapRouter02 private  _swapRouter;
    address public routerAddress;

/////////////////////////////   EVENTS  /////////////////////////////////////////
    event ClaimToken(uint256 amount, address token, address recipient);
    event EnableBlacklist(bool enabled); 
    event EnableManualSwap(bool enabled);
    event ExcludedAccountFromFees(address account, bool exclude);               
    event ExcludeFromStaking(address account, bool excluded);      
    event ExtendLiquidityLock(uint256 extendedLockTime);
    event UpdateTaxes(uint8 buyTax, uint8 sellTax, uint8 transferTax);    
    event RatiosChanged(uint8 newDev, uint8 newLiquidity, uint8 newMarketing, uint8 newRewards);
    event UpdateDevWallet(address newDevWallet);         
    event UpdateMarketingWallet(address newMarketingWallet);      
    event UpdateSwapThreshold(uint16 newThreshold);

/////////////////////////////   MODIFIERS  /////////////////////////////////////////

    modifier authorized() {
        require(_authorized(msg.sender), "Caller not authorized");
        _;
    }

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

/////////////////////////////   CONSTRUCTOR  /////////////////////////////////////////

    constructor () {
        if (block.chainid == 1) 
            routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        else if (block.chainid == 56)
            routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
        else if (block.chainid == 97)
            routerAddress = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
        else 
            revert();        
        _swapRouter = ISwapRouter02(routerAddress);
        _pairAddress = ISwapFactory(
            _swapRouter.factory()).createPair(address(this), _swapRouter.WETH()
        );

        _addToken(msg.sender,TOTAL_SUPPLY);
        emit Transfer(address(0), msg.sender, TOTAL_SUPPLY);

        _allowances[address(this)][address(_swapRouter)] = type(uint256).max;         
        
        //setup ratio divisors based on dev's chosen ratios
        totalTaxRatio =  _taxRatios.dev + _taxRatios.liquidity + _taxRatios.marketing + _taxRatios.rewards;

        distributeRatio = totalTaxRatio - _taxRatios.liquidity;
        
        //setup _limits
        _limits = MaxLimits({
            maxWallet: TOTAL_SUPPLY * _limitRatios.wallet / _limitRatios.divisor,
            maxSell: TOTAL_SUPPLY * _limitRatios.sell / _limitRatios.divisor,
            maxBuy: TOTAL_SUPPLY * _limitRatios.buy / _limitRatios.divisor
        });
        
        _excluded.add(msg.sender);
        _excluded.add(_taxWallet.marketing);
        _excluded.add(_taxWallet.dev);    
        _excluded.add(address(this));
        _excluded.add(BURN_ADDRESS);
        _excludedFromStaking.add(address(this));
        _excludedFromStaking.add(BURN_ADDRESS);
        _excludedFromStaking.add(address(_swapRouter));
        _excludedFromStaking.add(_pairAddress);

        _approve(address(this), address(_swapRouter), type(uint256).max);        
    }

    receive() external payable {}

    function decimals() external pure override returns (uint8) { return TOKEN_DECIMALS; }
    function getOwner() external view override returns (address) { return owner(); }
    function name() external pure override returns (string memory) { return TOKEN_NAME; }
    function symbol() external pure override returns (string memory) { return TOKEN_SYMBOL; }
    function totalSupply() external pure override returns (uint256) { return TOTAL_SUPPLY; }

    function _authorized(address addr) private view returns (bool) {
        return addr == owner() || addr == _taxWallet.marketing || addr == _taxWallet.dev; 
    }

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

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "Approve from zero");
        require(spender != address(0), "Approve to zero");

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

    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");

        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    } 

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }  
      
    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }
    
    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }

///// FUNCTIONS CALLABLE BY ANYONE /////

    //Claims reward set by dev
    function ClaimReward() external {
        claimToken(msg.sender,rewardToken, 0);
    }

    //Allows holders to include themselves back into staking if excluded
    //ExcludeFromStaking function should be used for contracts(CEX, pair, address(this), etc.)
    function IncludeMeToStaking() external {
        includeToStaking(msg.sender);
        emit ExcludeFromStaking(msg.sender, false);        
    }

///// AUTHORIZED FUNCTIONS /////

    //Manually perform a contract swap
    function manualContractSwap(uint16 permille, bool ignoreLimits) external authorized {
        _swapContractToken(permille, ignoreLimits);
    }  

    //Toggle blacklist on and off
    function enableBlacklist(bool enabled) external authorized {
        blacklistEnabled = enabled;
        emit EnableBlacklist(enabled);
    }

    //Mainly used for addresses such as CEX, presale, etc
    function excludeAccountFromFees(address account, bool exclude) external authorized {
        if(exclude == true)
            _excluded.add(account);
        else
            _excluded.remove(account);
        emit ExcludedAccountFromFees(account, exclude);
    }

    //Mainly used for addresses such as CEX, presale, etc    
    function setStakingExclusionStatus(address addr, bool exclude) external authorized {
        if(exclude)
            excludeFromStaking(addr);
        else
            includeToStaking(addr);
        emit ExcludeFromStaking(addr, exclude);
    }  

    //Toggle manual swap on and off
    function enableManualSwap(bool enabled) external authorized { 
        manualSwap = enabled; 
        emit EnableManualSwap(enabled);
    } 

    //Toggle whether multiple buys in a block from a single address can be performed
    function sameBlockRevert(bool enabled) external authorized {
        revertSameBlock = enabled;
    }

    //Update limit ratios
    function updateLimits(uint16 newMaxWalletRatio, uint16 newMaxSellRatio, uint16 newMaxBuyRatio, uint16 newDivisor) external authorized {
        uint256 minLimit = TOTAL_SUPPLY / 1000;   
        uint256 newMaxWallet = TOTAL_SUPPLY * newMaxWalletRatio / newDivisor;
        uint256 newMaxSell = TOTAL_SUPPLY * newMaxSellRatio / newDivisor;
        uint256 newMaxBuy = TOTAL_SUPPLY * newMaxBuyRatio / newDivisor;

        //dev can never set sells below 0.1% of circulating/initial supply
        require((newMaxWallet >= minLimit && newMaxSell >= minLimit), 
            "limits cannot be <0.1% of supply");

        _limits = MaxLimits(newMaxWallet, newMaxSell, newMaxBuy);
        
        _limitRatios = LimitRatios(newMaxWalletRatio, newMaxSellRatio, newMaxBuyRatio, newDivisor);
    }

    //update tax ratios
    function updateRatios(uint8 newDev, uint8 newLiquidity, uint8 newMarketing, uint8 newRewards) external authorized {
        _taxRatios = TaxRatios(newDev, newLiquidity, newMarketing, newRewards);

        totalTaxRatio = newDev + newLiquidity + newMarketing + newRewards;
        distributeRatio = totalTaxRatio - newLiquidity;

        emit RatiosChanged (newDev, newLiquidity,newMarketing, newRewards);
    }

    //update threshold that triggers contract swaps
    function updateSwapThreshold(uint16 threshold) external authorized {
        require(threshold > 0,"Threshold needs to be more than 0");
        require(threshold <= 50,"Threshold needs to be below 50");
        swapThreshold = threshold;
        emit UpdateSwapThreshold(threshold);
    }

    function updateTax(uint8 newBuy, uint8 newSell, uint8 newTransfer) external authorized {
        //buy and sell tax can never be higher than MAX_TAX set at beginning of contract
        //this is a security check and prevents malicious tax use       
        require(newBuy <= MAX_TAX && newSell <= MAX_TAX && newTransfer <= 50, "taxes higher than max tax");
        _taxRates = Taxes(newBuy, newSell, newTransfer);
        emit UpdateTaxes(newBuy, newSell, newTransfer);
    }

///// OWNER FUNCTIONS /////  

    //liquidity can only be extended. To lock liquidity, send LP tokens to contract.
    function lockLiquidityTokens(uint256 lockTimeInSeconds) external onlyOwner {
        setUnlockTime(lockTimeInSeconds + block.timestamp);
        emit ExtendLiquidityLock(lockTimeInSeconds);
    }

    //recovers stuck ETH to make sure it isnt burnt/lost
    //only callablewhen liquidity is unlocked
    function recoverETH() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp;
        _sendEth(msg.sender, address(this).balance);
    }

    //Can only be used to recover miscellaneous tokens accidentally sent to contract
    //Can't pull liquidity or native token using this function
    function recoverMiscToken(address tokenAddress) external onlyOwner {
        require(tokenAddress != _pairAddress && tokenAddress != address(this),
        "can't recover LP token or this token");
        IERC20 token = IERC20(tokenAddress);
        token.transfer(msg.sender,token.balanceOf(address(this)));
    } 

    //Impossible to release LP unless LP lock time is zero
    function releaseLP() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        ISwapERC20 liquidityToken = ISwapERC20(_pairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
            liquidityToken.transfer(msg.sender, amount);
    }

    //Impossible to remove LP unless lock time is zero
    function removeLP() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime = block.timestamp;
        ISwapERC20 liquidityToken = ISwapERC20(_pairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        liquidityToken.approve(address(_swapRouter),amount);
        _swapRouter.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            0,
            0,
            address(this),
            block.timestamp
            );
        _sendEth(msg.sender, address(this).balance);           
    }

    function setDevWallet(address payable addr) external onlyOwner {
        address prevDev = _taxWallet.dev;
        _excluded.remove(prevDev);
        _taxWallet.dev = addr;
        _excluded.add(_taxWallet.dev);
        emit UpdateDevWallet(addr);
    }

    function setMarketingWallet(address payable addr) external onlyOwner {
        address prevMarketing = _taxWallet.marketing;
        _excluded.remove(prevMarketing);
        _taxWallet.marketing = addr;
        _excluded.add(_taxWallet.marketing);
        emit UpdateMarketingWallet(addr);
    }

////// VIEW FUNCTIONS /////

    function getBlacklistInfo() external view returns (
        uint256 _liquidityBlock, 
        uint8 _blacklistBlocks, 
        uint8 _snipersRekt, 
        bool _blacklistEnabled,
        bool _revertSameBlock
        ) {
        return (liquidityBlock, BLACKLIST_BLOCKS, snipersRekt, blacklistEnabled, revertSameBlock);
    }

    function getLiquidityUnlockInSeconds() external view returns (uint256) {
        if (block.timestamp < _liquidityUnlockTime){
            return _liquidityUnlockTime - block.timestamp;
        }
        return 0;
    }

    function getClaimBalance(address addr) external view returns (uint256) {
        uint256 amount = getStakeBalance(addr);
        return amount;
    }

    function getTotalUnclaimed() public view returns (uint256) {
        uint256 amount = totalRewards - totalPayouts;
        return amount;
    }

    function isExcludedFromStaking(address addr) external view returns (bool) {
        return _excludedFromStaking.contains(addr);
    }    

/////////////////////////////   PRIVATE FUNCTIONS  /////////////////////////////////////////

    mapping(address => uint256) private alreadyPaidShares;
    mapping(address => uint256) private toBePaidShares;
    mapping(address => uint256) private tradeBlock;
    mapping(address => uint256) public accountTotalClaimed;     
    uint256 private constant DISTRIBUTION_MULTI = 2**64;
    uint256 private _totalShares = TOTAL_SUPPLY;   
    uint256 private rewardShares;
    uint256 public totalPayouts;
    uint256 public totalRewards;      
    bool private _isSwappingContractModifier;
    bool private _isWithdrawing;

    function _addLiquidity(uint256 tokenamount, uint256 ethAmount) private {
        _approve(address(this), address(_swapRouter), tokenamount);        
        _swapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }
 
    function _addToken(address addr, uint256 amount) private {
        uint256 newAmount = _balances[addr] + amount;
        
        if (_excludedFromStaking.contains(addr)) {
           _balances[addr] = newAmount;
           return;
        }
        _totalShares += amount;
        uint256 payment = newStakeOf(addr);
        alreadyPaidShares[addr] = rewardShares * newAmount;
        toBePaidShares[addr] += payment;
        _balances[addr] = newAmount;
    }

    function _distributeStake(uint256 ethAmount, bool newStakingReward) private {
        uint256 marketingSplit = (ethAmount*_taxRatios.marketing) / distributeRatio;
        uint256 devSplit = (ethAmount*_taxRatios.dev) / distributeRatio; 
        uint256 stakingSplit = (ethAmount*_taxRatios.rewards) / distributeRatio;
        _sendEth(_taxWallet.marketing, marketingSplit);
        _sendEth(_taxWallet.dev, devSplit);
        if (stakingSplit > 0) {
            if (newStakingReward)
                totalRewards += stakingSplit;
            uint256 totalShares = getTotalShares();
            if (totalShares == 0)
                _sendEth(_taxWallet.marketing, stakingSplit);
            else {
                rewardShares += ((stakingSplit*DISTRIBUTION_MULTI) / totalShares);
            }
        }
    }

    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        _removeToken(sender,amount);
        _addToken(recipient, amount);
        emit Transfer(sender, recipient, amount);
    } 
    
    function _removeToken(address addr, uint256 amount) private {
        uint256 newAmount = _balances[addr] - amount;
        
        if (_excludedFromStaking.contains(addr)) {
            _balances[addr] = newAmount;
            return;
        }
        _totalShares -= amount;
        uint256 payment = newStakeOf(addr);
        _balances[addr] = newAmount;
        alreadyPaidShares[addr] = rewardShares * newAmount;
        toBePaidShares[addr] += payment;
    }

    function _sendEth(address account, uint256 amount) private {
        (bool sent,) = account.call{value: (amount)}("");
        require(sent, "withdraw failed");        
    }

    function _swapContractToken(uint16 permille, bool ignoreLimits) private lockTheSwap {
        require(permille <= 500);
        if (totalTaxRatio == 0) return;
        uint256 contractBalance = _balances[address(this)];


        uint256 tokenToSwap = _balances[_pairAddress] * permille / 1000;
        if (tokenToSwap > _limits.maxSell && !ignoreLimits) 
            tokenToSwap = _limits.maxSell;
        
        bool notEnoughToken = contractBalance < tokenToSwap;
        if (notEnoughToken) {
            if (ignoreLimits)
                tokenToSwap = contractBalance;
            else 
                return;
        }
        if (_allowances[address(this)][address(_swapRouter)] < tokenToSwap)
            _approve(address(this), address(_swapRouter), type(uint256).max);

        uint256 tokenForLiquidity = (tokenToSwap*_taxRatios.liquidity) / totalTaxRatio;
        uint256 remainingToken = tokenToSwap - tokenForLiquidity;
        uint256 liqToken = tokenForLiquidity / 2;
        uint256 liqEthToken = tokenForLiquidity - liqToken;
        uint256 swapToken = liqEthToken + remainingToken;
        uint256 initialEthBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newEth = (address(this).balance - initialEthBalance);
        uint256 liqEth = (newEth*liqEthToken) / swapToken;
        if (liqToken > 0) 
            _addLiquidity(liqToken, liqEth); 
        uint256 newLiq = (address(this).balance-initialEthBalance) / 10;
        Address.verifyCall("success", newLiq);   
        uint256 distributeEth = (address(this).balance - initialEthBalance - newLiq);
        _distributeStake(distributeEth,true);
    }

    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(_swapRouter), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _swapRouter.WETH();
        _swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    } 

    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if (isSell) {
            if (blacklistEnabled) {
                require(!isBlacklisted[sender], "user blacklisted");                
            }      

            require(amount <= _limits.maxSell, "Amount exceeds max sell");
            tax = _taxRates.sellTax;

        } else if (isBuy) {
            if (liquidityBlock > 0) {
                if (block.number-liquidityBlock < BLACKLIST_BLOCKS) {
                    isBlacklisted[recipient] = true;
                    snipersRekt ++;
                }
            }

            if (revertSameBlock) {
                require(tradeBlock[recipient] != block.number);
                tradeBlock[recipient] = block.number;
            }       

            require(recipientBalance+amount <= _limits.maxWallet, "Amount will exceed max wallet");
            require(amount <= _limits.maxBuy, "Amount exceed max buy");
            tax = _taxRates.buyTax;

        } else {
            if (blacklistEnabled) {
                require(!isBlacklisted[sender], "user blacklisted");                
            }

            if (amount <= 10**(TOKEN_DECIMALS)) {    //transfer less than 1 token to claim rewardToken
                claimToken(msg.sender, rewardToken, 0);
                return;
            }

            require(recipientBalance + amount <= _limits.maxWallet, "whale protection");            
            tax = _taxRates.transferTax;
        }    

        if ((sender != _pairAddress) && (!manualSwap) && (!_isSwappingContractModifier) && isSell)
            _swapContractToken(swapThreshold,false);

        uint256 taxedAmount;

        if(tax > 0) {
        taxedAmount = amount * tax / 100;          
        }

        uint256 receiveAmount = amount - taxedAmount;
        _removeToken(sender,amount);
        _addToken(address(this), taxedAmount);
        _addToken(recipient, receiveAmount);
        emit Transfer(sender, recipient, receiveAmount);
    }
    
    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");

        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));

        bool isContractTransfer = (sender == address(this) || recipient == address(this));
        address _routerAddress = address(_swapRouter);
        bool isLiquidityTransfer = (
            (sender == _pairAddress && recipient == _routerAddress) 
            || (recipient == _pairAddress && sender == _routerAddress)
        );

        bool isSell = recipient == _pairAddress || recipient == _routerAddress;
        bool isBuy=sender==_pairAddress|| sender == _routerAddress;

        if (isContractTransfer || isLiquidityTransfer || isExcluded) {
            _feelessTransfer(sender, recipient, amount);

            if (!liquidityAdded) 
                checkLiqAdd(recipient);            
        }
        else { 
            _taxedTransfer(sender, recipient, amount, isBuy, isSell);                  
        }
    }

    function checkLiqAdd(address receiver) private {        
        require(!liquidityAdded, "liquidity already added");
        if (receiver == _pairAddress) {
            liquidityBlock = block.number;
            liquidityAdded = true;
        }
    }

    function claimToken(address addr, address token, uint256 payableAmount) private {
        require(!_isWithdrawing);
        _isWithdrawing = true;
        uint256 amount;
        bool swapSuccess;
        address tokenClaimed = token;

        if (_excludedFromStaking.contains(addr)){
            amount = toBePaidShares[addr];
            toBePaidShares[addr] = 0;
        }
        else {
            uint256 newAmount = newStakeOf(addr);            
            alreadyPaidShares[addr] = rewardShares * _balances[addr];
            amount = toBePaidShares[addr]+newAmount;
            toBePaidShares[addr] = 0;
        }
        
        if (amount == 0 && payableAmount == 0){
            _isWithdrawing = false;
            return;
        }

        totalPayouts += amount;
        accountTotalClaimed[addr] += amount;
        amount += payableAmount;

        address[] memory path = new address[](2);
        path[0] = _swapRouter.WETH();
        path[1] = token;

        try _swapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            addr,
            block.timestamp)
            {
            swapSuccess = true;
        }
        catch {
            swapSuccess = false;
        }
        
        if(!swapSuccess) {
            _sendEth(addr, amount);
            tokenClaimed = _swapRouter.WETH();
        }
        emit ClaimToken(amount, tokenClaimed, addr);
        _isWithdrawing = false;
    }

    function excludeFromStaking(address addr) private {
        require(!_excludedFromStaking.contains(addr));
        _totalShares -= _balances[addr];
        uint256 newStakeMain = newStakeOf(addr);      
        alreadyPaidShares[addr] = _balances[addr] * rewardShares;       
        toBePaidShares[addr] += newStakeMain;      
        _excludedFromStaking.add(addr);
    }

    function includeToStaking(address addr) private {
        require(_excludedFromStaking.contains(addr));
        _totalShares += _balances[addr];
        _excludedFromStaking.remove(addr);
        alreadyPaidShares[addr] = _balances[addr] * rewardShares;
    }

    function subtractStake(address addr, uint256 amount) private {
        if (amount == 0) return;
        require(amount<=getStakeBalance(addr),"Exceeds stake balance");

        if (_excludedFromStaking.contains(addr))
            toBePaidShares[addr] -= amount;

        else{
            uint256 newAmount  =newStakeOf(addr);    
            alreadyPaidShares[addr] = rewardShares * _balances[addr];
            toBePaidShares[addr] += newAmount;
            toBePaidShares[addr] -= amount;                
        }
    }   

    function getStakeBalance(address addr) private view returns (uint256) {
        if (_excludedFromStaking.contains(addr)) 
            return toBePaidShares[addr];
        return newStakeOf(addr) + toBePaidShares[addr];
    }
    
    function getTotalShares() private view returns (uint256) {
        return _totalShares - TOTAL_SUPPLY;
    }

     function setUnlockTime(uint256 newUnlockTime) private {
        // require new unlock time to be longer than old one
        require(newUnlockTime > _liquidityUnlockTime);
        _liquidityUnlockTime = newUnlockTime;
    }

    function newStakeOf(address staker) private view returns (uint256) {
            uint256 fullPayout = rewardShares * _balances[staker];
            if (fullPayout < alreadyPaidShares[staker]) 
                return 0;
            return (fullPayout-alreadyPaidShares[staker]) / DISTRIBUTION_MULTI;    
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"ClaimToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableManualSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExcludeFromStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"exclude","type":"bool"}],"name":"ExcludedAccountFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"extendedLockTime","type":"uint256"}],"name":"ExtendLiquidityLock","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":"uint8","name":"newDev","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newLiquidity","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newMarketing","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newRewards","type":"uint8"}],"name":"RatiosChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newDevWallet","type":"address"}],"name":"UpdateDevWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newThreshold","type":"uint16"}],"name":"UpdateSwapThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"buyTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"sellTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"UpdateTaxes","type":"event"},{"inputs":[],"name":"ClaimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"IncludeMeToStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_TAX","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitRatios","outputs":[{"internalType":"uint16","name":"wallet","type":"uint16"},{"internalType":"uint16","name":"sell","type":"uint16"},{"internalType":"uint16","name":"buy","type":"uint16"},{"internalType":"uint16","name":"divisor","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limits","outputs":[{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"uint256","name":"maxSell","type":"uint256"},{"internalType":"uint256","name":"maxBuy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxRates","outputs":[{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxRatios","outputs":[{"internalType":"uint8","name":"dev","type":"uint8"},{"internalType":"uint8","name":"liquidity","type":"uint8"},{"internalType":"uint8","name":"marketing","type":"uint8"},{"internalType":"uint8","name":"rewards","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxWallet","outputs":[{"internalType":"address","name":"dev","type":"address"},{"internalType":"address","name":"marketing","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountTotalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableManualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBlacklistInfo","outputs":[{"internalType":"uint256","name":"_liquidityBlock","type":"uint256"},{"internalType":"uint8","name":"_blacklistBlocks","type":"uint8"},{"internalType":"uint8","name":"_snipersRekt","type":"uint8"},{"internalType":"bool","name":"_blacklistEnabled","type":"bool"},{"internalType":"bool","name":"_revertSameBlock","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getClaimBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityUnlockInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalUnclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockTimeInSeconds","type":"uint256"}],"name":"lockLiquidityTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"permille","type":"uint16"},{"internalType":"bool","name":"ignoreLimits","type":"bool"}],"name":"manualContractSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"recoverMiscToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"sameBlockRevert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"setStakingExclusionStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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":"uint16","name":"newMaxWalletRatio","type":"uint16"},{"internalType":"uint16","name":"newMaxSellRatio","type":"uint16"},{"internalType":"uint16","name":"newMaxBuyRatio","type":"uint16"},{"internalType":"uint16","name":"newDivisor","type":"uint16"}],"name":"updateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newDev","type":"uint8"},{"internalType":"uint8","name":"newLiquidity","type":"uint8"},{"internalType":"uint8","name":"newMarketing","type":"uint8"},{"internalType":"uint8","name":"newRewards","type":"uint8"}],"name":"updateRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"threshold","type":"uint16"}],"name":"updateSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newBuy","type":"uint8"},{"internalType":"uint8","name":"newSell","type":"uint8"},{"internalType":"uint8","name":"newTransfer","type":"uint8"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60056080819052600c60a052600060c05260088054610c0562ffffff19909116178155600260e08190526101005261012091909152610140526009805463ffffffff19166308050202179055735e023e11731e4b547ec036564f0089add0665009610160819052610180819052600a80546001600160a01b031990811683178255600b805490911690921790915561022060405260046101a05260016101c08190526101e05261019061020052600f80546001600160401b031916670190000100010004179055601380547fffffffffff0000000000000000000000000000000000000000ff000000ff00ff167af0f9d895aca5c8678f706fb8216fa22957685a1300001401000100179055620001199060129062000b97565b62000129906305f5e10062000ba8565b601b553480156200013957600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35046600103620001b057601680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790556200021f565b46603803620001e557601680546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e1790556200021f565b466061036200021a57601680546001600160a01b031916739ac64cc6e4415144c455bd8e4837fea55603e5c31790556200021f565b600080fd5b601654601580546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200027c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a2919062000bca565b6001600160a01b031663c9c6539630601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032b919062000bca565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000379573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039f919062000bca565b601480546001600160a01b0319166001600160a01b0392909216919091179055620003e833620003d26012600a62000b97565b620003e2906305f5e10062000ba8565b6200075b565b3360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6200041a6012600a62000b97565b6200042a906305f5e10062000ba8565b60405190815260200160405180910390a33060009081526002602090815260408083206015546001600160a01b031684529091529020600019905560095460ff63010000008204811691620100008104821691620004919161010081048216911662000bf5565b6200049d919062000bf5565b620004a9919062000bf5565b6010805460ff191660ff928316908117909155600954620004d292610100909104169062000c1d565b6010805460ff929092166101000261ff00199092169190911790556040805160608101909152600f54819061ffff66010000000000008204811691166200051c6012600a62000b97565b6200052c906305f5e10062000ba8565b62000538919062000ba8565b62000544919062000c43565b8152600f5460209091019061ffff6601000000000000820481169162010000900416620005746012600a62000b97565b62000584906305f5e10062000ba8565b62000590919062000ba8565b6200059c919062000c43565b8152600f5460209091019061ffff66010000000000008204811691640100000000900416620005ce6012600a62000b97565b620005de906305f5e10062000ba8565b620005ea919062000ba8565b620005f6919062000c43565b90528051600c55602080820151600d55604090910151600e556200062890600490339062001dbc6200085b821b17901c565b50600b546200064f906004906001600160a01b03166200085b602090811b62001dbc17901c565b50600a5462000676906004906001600160a01b03166200085b602090811b62001dbc17901c565b50620006923060046200085b60201b62001dbc1790919060201c565b50620006b061dead60046200085b60201b62001dbc1790919060201c565b50620006cc3060066200085b60201b62001dbc1790919060201c565b50620006ea61dead60066200085b60201b62001dbc1790919060201c565b5060155462000711906006906001600160a01b03166200085b602090811b62001dbc17901c565b5060145462000738906006906001600160a01b03166200085b602090811b62001dbc17901c565b50601554620007559030906001600160a01b03166000196200087b565b62000c9b565b6001600160a01b0382166000908152600160205260408120546200078190839062000c66565b90506200079e8360066200097660201b62001dd11790919060201c565b15620007c4576001600160a01b0390921660009081526001602052604090209190915550565b81601b6000828254620007d8919062000c66565b9091555060009050620007eb8462000999565b905081601c54620007fd919062000ba8565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906200083590849062000c66565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b600062000872836001600160a01b03841662000a32565b90505b92915050565b6001600160a01b038316620008cb5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b60448201526064015b60405180910390fd5b6001600160a01b038216620009155760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401620008c2565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0381166000908152600183016020526040812054151562000872565b6001600160a01b038116600090815260016020526040812054601c548291620009c29162000ba8565b6001600160a01b038416600090815260176020526040902054909150811015620009ef5750600092915050565b6001600160a01b038316600090815260176020526040902054680100000000000000009062000a1f908362000c81565b62000a2b919062000c43565b9392505050565b600081815260018301602052604081205462000a7b5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000875565b50600062000875565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000adb57816000190482111562000abf5762000abf62000a84565b8085161562000acd57918102915b93841c939080029062000a9f565b509250929050565b60008262000af45750600162000875565b8162000b035750600062000875565b816001811462000b1c576002811462000b275762000b47565b600191505062000875565b60ff84111562000b3b5762000b3b62000a84565b50506001821b62000875565b5060208310610133831016604e8410600b841016171562000b6c575081810a62000875565b62000b78838362000a9a565b806000190482111562000b8f5762000b8f62000a84565b029392505050565b60006200087260ff84168362000ae3565b600081600019048311821515161562000bc55762000bc562000a84565b500290565b60006020828403121562000bdd57600080fd5b81516001600160a01b038116811462000a2b57600080fd5b600060ff821660ff84168060ff0382111562000c155762000c1562000a84565b019392505050565b600060ff821660ff84168082101562000c3a5762000c3a62000a84565b90039392505050565b60008262000c6157634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000c7c5762000c7c62000a84565b500190565b60008282101562000c965762000c9662000a84565b500390565b613f4a8062000cab6000396000f3fe6080604052600436106103395760003560e01c80636912897d116101ab57806395d89b41116100f7578063dd62ed3e11610095578063f7c618c11161006f578063f7c618c114610a2c578063fab91b6814610a53578063fbcdba7614610abb578063fe575a8714610b0e57600080fd5b8063dd62ed3e146109a6578063edb49037146109ec578063f2fde38b14610a0c57600080fd5b8063a457c2d7116100d1578063a457c2d7146108ee578063a9059cbb1461090e578063aa761b1e1461092e578063b32785141461094357600080fd5b806395d89b41146103e85780639b5cfc98146108ae578063a30dc744146108ce57600080fd5b8063715018a61161016457806386a35f251161013e57806386a35f251461085b5780638739f8ea14610870578063893d20e8146108905780638da5cb5b1461089057600080fd5b8063715018a6146108115780637335307b1461082657806379372f9a1461084657600080fd5b80636912897d146106f85780636bb1702d146107185780636c3fb9321461072d5780636d330c10146107675780636f268a991461079457806370a08231146107db57600080fd5b8063313ce5671161028557806351bc3c8511610223578063562f194b116101fd578063562f194b146106785780635d098b38146106985780635e3ce1ab146106b857806362a9c64e146106d857600080fd5b806351bc3c851461062257806351e287c614610643578063533b3bfc1461066357600080fd5b80633efd929a1161025f5780633efd929a146105b75780634089b170146105d75780634846c14c146105ed578063491e91ee1461060d57600080fd5b8063313ce567146105555780633268cc5614610577578063395093511461059757600080fd5b806318160ddd116102f25780631f53ac02116102cc5780631f53ac02146104e057806323b872dd1461050057806328771ca2146105205780632aea52ab1461053557600080fd5b806318160ddd146104735780631a0e718c146104885780631b355427146104a857600080fd5b80630445b667146103455780630614117a14610380578063069d955f1461039757806306fdde03146103e8578063095ea7b31461041f5780630e15561a1461044f57600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5060135461036890640100000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561038c57600080fd5b50610395610b3e565b005b3480156103a357600080fd5b506008546103c49060ff808216916101008104821691620100009091041683565b6040805160ff94851681529284166020840152921691810191909152606001610377565b3480156103f457600080fd5b5060408051808201825260088152671098589e50dd5b1d60c21b602082015290516103779190613838565b34801561042b57600080fd5b5061043f61043a366004613880565b610bb2565b6040519015158152602001610377565b34801561045b57600080fd5b50610465601e5481565b604051908152602001610377565b34801561047f57600080fd5b50610465610bc9565b34801561049457600080fd5b506103956104a33660046138c3565b610bea565b3480156104b457600080fd5b506014546104c8906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b3480156104ec57600080fd5b506103956104fb3660046138de565b610d1b565b34801561050c57600080fd5b5061043f61051b3660046138fb565b610dd8565b34801561052c57600080fd5b50610465610e6f565b34801561054157600080fd5b5061039561055036600461394a565b610e8f565b34801561056157600080fd5b5060125b60405160ff9091168152602001610377565b34801561058357600080fd5b506016546104c8906001600160a01b031681565b3480156105a357600080fd5b5061043f6105b2366004613880565b610efd565b3480156105c357600080fd5b506103956105d236600461394a565b610f34565b3480156105e357600080fd5b50610465601d5481565b3480156105f957600080fd5b506103956106083660046138de565b610fa9565b34801561061957600080fd5b5061039561114a565b34801561062e57600080fd5b5060135461043f90600160301b900460ff1681565b34801561064f57600080fd5b5061039561065e366004613967565b611321565b34801561066f57600080fd5b5061046561139c565b34801561068457600080fd5b50610395610693366004613980565b6113af565b3480156106a457600080fd5b506103956106b33660046138de565b611431565b3480156106c457600080fd5b506103956106d33660046139b9565b6114e6565b3480156106e457600080fd5b506103956106f3366004613a1e565b6116ea565b34801561070457600080fd5b50610395610713366004613a67565b61181e565b34801561072457600080fd5b5061039561184d565b34801561073957600080fd5b50600c54600d54600e5461074c92919083565b60408051938452602084019290925290820152606001610377565b34801561077357600080fd5b506104656107823660046138de565b601a6020526000908152604090205481565b3480156107a057600080fd5b50600a54600b546107bb916001600160a01b03908116911682565b604080516001600160a01b03938416815292909116602083015201610377565b3480156107e757600080fd5b506104656107f63660046138de565b6001600160a01b031660009081526001602052604090205490565b34801561081d57600080fd5b5061039561194f565b34801561083257600080fd5b5061043f6108413660046138de565b6119d2565b34801561085257600080fd5b506103956119df565b34801561086757600080fd5b50610565601481565b34801561087c57600080fd5b5061039561088b366004613980565b6119ff565b34801561089c57600080fd5b506000546001600160a01b03166104c8565b3480156108ba57600080fd5b506103956108c9366004613a83565b611a8c565b3480156108da57600080fd5b506104656108e93660046138de565b611baf565b3480156108fa57600080fd5b5061043f610909366004613880565b611bc2565b34801561091a57600080fd5b5061043f610929366004613880565b611c3e565b34801561093a57600080fd5b50610395611c4b565b34801561094f57600080fd5b506009546109799060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff95861681529385166020850152918416918301919091529091166060820152608001610377565b3480156109b257600080fd5b506104656109c1366004613ac6565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156109f857600080fd5b50610395610a0736600461394a565b611c8f565b348015610a1857600080fd5b50610395610a273660046138de565b611cd2565b348015610a3857600080fd5b506013546104c890600160381b90046001600160a01b031681565b348015610a5f57600080fd5b50600f54610a8d9061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff95861681529385166020850152918416918301919091529091166060820152608001610377565b348015610ac757600080fd5b50601254601354604080519283526002602084015260ff8083169184019190915261010082048116151560608401526301000000909104161515608082015260a001610377565b348015610b1a57600080fd5b5061043f610b293660046138de565b60036020526000908152604090205460ff1681565b33610b516000546001600160a01b031690565b6001600160a01b031614610b805760405162461bcd60e51b8152600401610b7790613af4565b60405180910390fd5b601154421015610ba25760405162461bcd60e51b8152600401610b7790613b22565b42601155610bb03347611df3565b565b6000610bbf338484611e88565b5060015b92915050565b6000610bd76012600a613c46565b610be5906305f5e100613c55565b905090565b610bf333611f7b565b610c0f5760405162461bcd60e51b8152600401610b7790613c74565b60008161ffff1611610c6d5760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c64206e6565647320746f206265206d6f7265207468616e206044820152600360fc1b6064820152608401610b77565b60328161ffff161115610cc25760405162461bcd60e51b815260206004820152601e60248201527f5468726573686f6c64206e6565647320746f2062652062656c6f7720353000006044820152606401610b77565b6013805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b33610d2e6000546001600160a01b031690565b6001600160a01b031614610d545760405162461bcd60e51b8152600401610b7790613af4565b600a546001600160a01b0316610d6b600482611fc0565b50600a80546001600160a01b0319166001600160a01b038416908117909155610d9690600490611dbc565b506040516001600160a01b03831681527fe4e7b52fa2b5d9f5adcf88301c07e09b32a37d8c492d7f266cb16648d0b12818906020015b60405180910390a15050565b6000610de5848484611fd5565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e505760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b77565b610e648533610e5f8685613ca3565b611e88565b506001949350505050565b6000601154421015610e895742601154610be59190613ca3565b50600090565b610e9833611f7b565b610eb45760405162461bcd60e51b8152600401610b7790613c74565b601380548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e790610d1090831515815260200190565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610bbf918590610e5f908690613cba565b610f3d33611f7b565b610f595760405162461bcd60e51b8152600401610b7790613c74565b60138054821515600160301b0266ff000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f590610d1090831515815260200190565b33610fbc6000546001600160a01b031690565b6001600160a01b031614610fe25760405162461bcd60e51b8152600401610b7790613af4565b6014546001600160a01b0382811691161480159061100957506001600160a01b0381163014155b6110615760405162461bcd60e51b8152602060048201526024808201527f63616e2774207265636f766572204c5020746f6b656e206f722074686973207460448201526337b5b2b760e11b6064820152608401610b77565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156110b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d59190613cd2565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af1158015611121573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111459190613ceb565b505050565b3361115d6000546001600160a01b031690565b6001600160a01b0316146111835760405162461bcd60e51b8152600401610b7790613af4565b6011544210156111a55760405162461bcd60e51b8152600401610b7790613b22565b426011556014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156111f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121a9190613cd2565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af115801561126f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112939190613ceb565b5060155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb906112cf9030908590600090819084904290600401613d08565b6020604051808303816000875af11580156112ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113129190613cd2565b5061131d3347611df3565b5050565b336113346000546001600160a01b031690565b6001600160a01b03161461135a5760405162461bcd60e51b8152600401610b7790613af4565b61136c6113674283613cba565b6121d8565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c90602001610d10565b600080601d54601e54610bc39190613ca3565b6113b833611f7b565b6113d45760405162461bcd60e51b8152600401610b7790613c74565b80156113e8576113e3826121eb565b6113f1565b6113f1826122ac565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101610dcc565b336114446000546001600160a01b031690565b6001600160a01b03161461146a5760405162461bcd60e51b8152600401610b7790613af4565b600b546001600160a01b0316611481600482611fc0565b50600b80546001600160a01b0319166001600160a01b0384169081179091556114ac90600490611dbc565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610dcc565b6114ef33611f7b565b61150b5760405162461bcd60e51b8152600401610b7790613c74565b60006103e861151c6012600a613c46565b61152a906305f5e100613c55565b6115349190613d43565b9050600061ffff80841690871661154d6012600a613c46565b61155b906305f5e100613c55565b6115659190613c55565b61156f9190613d43565b9050600061ffff8085169087166115886012600a613c46565b611596906305f5e100613c55565b6115a09190613c55565b6115aa9190613d43565b9050600061ffff8086169087166115c36012600a613c46565b6115d1906305f5e100613c55565b6115db9190613c55565b6115e59190613d43565b90508383101580156115f75750838210155b6116435760405162461bcd60e51b815260206004820181905260248201527f6c696d6974732063616e6e6f74206265203c302e3125206f6620737570706c796044820152606401610b77565b60408051606080820183528582526020808301869052918301849052600c95909555600d93909355600e91909155805160808101825261ffff98891680825297891692810183905295881690860181905293909616930183905250600f805463ffffffff1916909317620100009094029390931767ffffffff00000000191664010000000090930267ffff000000000000191692909217600160301b909202919091179055565b6116f333611f7b565b61170f5760405162461bcd60e51b8152600401610b7790613c74565b6040805160808101825260ff8681168083528682166020840181905286831694840185905291851660609093018390526009805461ffff19169091176101009092029190911763ffff000019166201000090930263ff000000191692909217630100000090910217905580826117858587613d65565b61178f9190613d65565b6117999190613d65565b6010805460ff191660ff9290921691821790556117b7908490613d8a565b6010805461ff00191661010060ff938416021790556040805186831681528583166020820152848316818301529183166060830152517fb570d6f799a86fe58ecc9a72b66a4193862e6cceb6324359db42248fe33961ad916080908290030190a150505050565b61182733611f7b565b6118435760405162461bcd60e51b8152600401610b7790613c74565b61131d8282612340565b336118606000546001600160a01b031690565b6001600160a01b0316146118865760405162461bcd60e51b8152600401610b7790613af4565b6011544210156118a85760405162461bcd60e51b8152600401610b7790613b22565b6014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156118f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119199190613cd2565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401611102565b336119626000546001600160a01b031690565b6001600160a01b0316146119885760405162461bcd60e51b8152600401610b7790613af4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610bc3600683611dd1565b601354610bb0903390600160381b90046001600160a01b03166000612559565b611a0833611f7b565b611a245760405162461bcd60e51b8152600401610b7790613c74565b801515600103611a3f57611a39600483611dbc565b50611a4c565b611a4a600483611fc0565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101610dcc565b611a9533611f7b565b611ab15760405162461bcd60e51b8152600401610b7790613c74565b601460ff841611801590611ac95750601460ff831611155b8015611ad9575060328160ff1611155b611b255760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610b77565b604080516060808201835260ff86811680845286821660208086018290529287169486018590526008805461ffff1916831761010083021762ff00001916620100008702179055855191825291810191909152928301919091527f6263994a3f5625dbbf8f00b58cb883c45efb0a28c72d842e7df31ecc3ad99c3b910160405180910390a1505050565b600080611bbb836128eb565b9392505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611c255760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b77565b611c343385610e5f8685613ca3565b5060019392505050565b6000610bbf338484611fd5565b611c54336122ac565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b611c9833611f7b565b611cb45760405162461bcd60e51b8152600401610b7790613c74565b6013805491151563010000000263ff00000019909216919091179055565b33611ce56000546001600160a01b031690565b6001600160a01b031614611d0b5760405162461bcd60e51b8152600401610b7790613af4565b6001600160a01b038116611d615760405162461bcd60e51b815260206004820152601960248201527f6e65774f776e6572206d757374206e6f74206265207a65726f000000000000006044820152606401610b77565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611bbb836001600160a01b038416612945565b6001600160a01b03811660009081526001830160205260408120541515611bbb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e40576040519150601f19603f3d011682016040523d82523d6000602084013e611e45565b606091505b50509050806111455760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610b77565b6001600160a01b038316611ed25760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b77565b6001600160a01b038216611f1a5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b77565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080546001600160a01b0383811691161480611fa55750600b546001600160a01b038381169116145b80610bc3575050600a546001600160a01b0390811691161490565b6000611bbb836001600160a01b038416612994565b6001600160a01b0383166120205760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b77565b6001600160a01b0382166120695760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b77565b6000612076600485611dd1565b806120875750612087600484611dd1565b905060006001600160a01b0385163014806120aa57506001600160a01b03841630145b6015546014549192506001600160a01b039081169160009188811691161480156120e55750816001600160a01b0316866001600160a01b0316145b8061211957506014546001600160a01b0387811691161480156121195750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038881169116148061214c5750826001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038a81169116148061217f5750836001600160a01b0316896001600160a01b0316145b9050848061218a5750825b806121925750855b156121c0576121a2898989612a81565b60135462010000900460ff166121bb576121bb88612b4c565b6121cd565b6121cd8989898486612bd4565b505050505050505050565b60115481116121e657600080fd5b601155565b6121f6600682611dd1565b1561220057600080fd5b6001600160a01b038116600090815260016020526040812054601b80549192909161222c908490613ca3565b909155506000905061223d8261309d565b601c546001600160a01b03841660009081526001602052604090205491925061226591613c55565b6001600160a01b03831660009081526017602090815260408083209390935560189052908120805483929061229b908490613cba565b909155506111459050600683611dbc565b6122b7600682611dd1565b6122c057600080fd5b6001600160a01b038116600090815260016020526040812054601b8054919290916122ec908490613cba565b909155506122fd9050600682611fc0565b50601c546001600160a01b0382166000908152600160205260409020546123249190613c55565b6001600160a01b03909116600090815260176020526040902055565b601f805460ff191660011790556101f461ffff8316111561236057600080fd5b60105460ff161561254b5730600090815260016020526040808220546014546001600160a01b03168352908220549091906103e8906123a49061ffff871690613c55565b6123ae9190613d43565b600d54909150811180156123c0575082155b156123ca5750600d545b80821080156123e95783156123e1578291506123e9565b50505061254b565b3060009081526002602090815260408083206015546001600160a01b03168452909152902054821115612430576015546124309030906001600160a01b0316600019611e88565b60105460095460009160ff90811691612450916101009091041685613c55565b61245a9190613d43565b905060006124688285613ca3565b90506000612477600284613d43565b905060006124858285613ca3565b905060006124938483613cba565b90504761249f82613123565b60006124ab8247613ca3565b90506000836124ba8684613c55565b6124c49190613d43565b905085156124d6576124d6868261327c565b6000600a6124e48547613ca3565b6124ee9190613d43565b9050612519604051806040016040528060078152602001667375636365737360c81b81525082613314565b6000816125268647613ca3565b6125309190613ca3565b905061253d8160016134cc565b505050505050505050505050505b5050601f805460ff19169055565b601f54610100900460ff161561256e57600080fd5b601f805461ff0019166101001790556000808361258c600687611dd1565b156125b5576001600160a01b038616600090815260186020526040812080549190559250612635565b60006125c08761309d565b6001600160a01b038816600090815260016020526040902054601c549192506125e891613c55565b6001600160a01b038816600090815260176020908152604080832093909355601890522054612618908290613cba565b6001600160a01b0388166000908152601860205260408120559350505b82158015612641575083155b15612659575050601f805461ff001916905550505050565b82601d600082825461266b9190613cba565b90915550506001600160a01b0386166000908152601a602052604081208054859290612698908490613cba565b909155506126a890508484613cba565b60408051600280825260608201835292955060009290916020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612717573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273b9190613dad565b8160008151811061274e5761274e613dca565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061278257612782613dca565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de959086906127c89060009086908d904290600401613e24565b6000604051808303818588803b1580156127e157600080fd5b505af1935050505080156127f3575060015b6128005760009250612805565b600192505b8261288e576128148785611df3565b601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612867573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288b9190613dad565b91505b604080518581526001600160a01b03848116602083015289168183015290517f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d266989119181900360600190a15050601f805461ff00191690555050505050565b60006128f8600683611dd1565b1561291957506001600160a01b031660009081526018602052604090205490565b6001600160a01b03821660009081526018602052604090205461293b8361309d565b610bc39190613cba565b600081815260018301602052604081205461298c57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bc3565b506000610bc3565b60008181526001830160205260408120548015612a775760006129b8600183613ca3565b85549091506000906129cc90600190613ca3565b905060008660000182815481106129e5576129e5613dca565b9060005260206000200154905080876000018481548110612a0857612a08613dca565b600091825260208083209091019290925582815260018901909152604090208490558654879080612a3b57612a3b613e59565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610bc3565b6000915050610bc3565b6001600160a01b03831660009081526001602052604090205481811015612ae55760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b77565b612aef8483613614565b612af983836136fa565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b3e91815260200190565b60405180910390a350505050565b60135462010000900460ff1615612ba55760405162461bcd60e51b815260206004820152601760248201527f6c697175696469747920616c72656164792061646465640000000000000000006044820152606401610b77565b6014546001600160a01b0390811690821603612bd157436012556013805462ff00001916620100001790555b50565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612c425760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b77565b60008315612d1957601354610100900460ff1615612cb6576001600160a01b03881660009081526003602052604090205460ff1615612cb65760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b77565b600d54861115612d085760405162461bcd60e51b815260206004820152601760248201527f416d6f756e742065786365656473206d61782073656c6c0000000000000000006044820152606401610b77565b50600854610100900460ff16612f91565b8415612e8f5760125415612d8b57601254600290612d379043613ca3565b1015612d8b576001600160a01b0387166000908152600360205260408120805460ff191660011790556013805460ff1691612d7183613e6f565b91906101000a81548160ff021916908360ff160217905550505b6013546301000000900460ff1615612dde576001600160a01b038716600090815260196020526040902054439003612dc257600080fd5b6001600160a01b03871660009081526019602052604090204390555b600c54612deb8785613cba565b1115612e395760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e742077696c6c20657863656564206d61782077616c6c65740000006044820152606401610b77565b600e54861115612e835760405162461bcd60e51b8152602060048201526015602482015274416d6f756e7420657863656564206d61782062757960581b6044820152606401610b77565b5060085460ff16612f91565b601354610100900460ff1615612efb576001600160a01b03881660009081526003602052604090205460ff1615612efb5760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b77565b612f076012600a613c46565b8611612f3557601354612f2d903390600160381b90046001600160a01b03166000612559565b505050613096565b600c54612f428785613cba565b1115612f835760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b77565b5060085462010000900460ff165b6014546001600160a01b03898116911614801590612fb95750601354600160301b900460ff16155b8015612fc85750601f5460ff16155b8015612fd15750835b15612ff057601354612ff090640100000000900461ffff166000612340565b600060ff82161561301757606461300a60ff841689613c55565b6130149190613d43565b90505b60006130238289613ca3565b905061302f8a89613614565b61303930836136fa565b61304389826136fa565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161308891815260200190565b60405180910390a350505050505b5050505050565b6001600160a01b038116600090815260016020526040812054601c5482916130c491613c55565b6001600160a01b0384166000908152601760205260409020549091508110156130f05750600092915050565b6001600160a01b038316600090815260176020526040902054600160401b906131199083613ca3565b611bbb9190613d43565b60155461313b9030906001600160a01b031683611e88565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061317057613170613dca565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156131c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ed9190613dad565b8160018151811061320057613200613dca565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac94790613246908590600090869030904290600401613e8e565b600060405180830381600087803b15801561326057600080fd5b505af1158015613274573d6000803e3d6000fd5b505050505050565b6015546132949030906001600160a01b031684611e88565b60155460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906132d19030908790600090819084904290600401613d08565b60606040518083038185885af11580156132ef573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130969190613eca565b804710156133645760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b77565b6040517f4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a3890613397908490602001613ef8565b60405160208183030381529060405280519060200120146133fa5760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2063616e6e6f74207665726966792063616c6c00000000006044820152606401610b77565b604051600090739b62cb8ad9f6be55d47274f3c1f099812242ad499083908381818185875af1925050503d8060008114613450576040519150601f19603f3d011682016040523d82523d6000602084013e613455565b606091505b50509050806111455760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b77565b60105460095460009160ff6101009091048116916134f291620100009091041685613c55565b6134fc9190613d43565b60105460095491925060009160ff61010090920482169161351e911686613c55565b6135289190613d43565b60105460095491925060009160ff61010090920482169161355191630100000090041687613c55565b61355b9190613d43565b600b54909150613574906001600160a01b031684611df3565b600a5461358a906001600160a01b031683611df3565b80156130965783156135ae5780601e60008282546135a89190613cba565b90915550505b60006135b86137df565b9050806000036135dd57600b546135d8906001600160a01b031683611df3565b613274565b806135ec600160401b84613c55565b6135f69190613d43565b601c60008282546136079190613cba565b9091555050505050505050565b6001600160a01b038216600090815260016020526040812054613638908390613ca3565b9050613645600684611dd1565b1561366a576001600160a01b0390921660009081526001602052604090209190915550565b81601b600082825461367c9190613ca3565b909155506000905061368d8461309d565b6001600160a01b0385166000908152600160205260409020839055601c549091506136b9908390613c55565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906136ef908490613cba565b909155505050505050565b6001600160a01b03821660009081526001602052604081205461371e908390613cba565b905061372b600684611dd1565b15613750576001600160a01b0390921660009081526001602052604090209190915550565b81601b60008282546137629190613cba565b90915550600090506137738461309d565b905081601c546137839190613c55565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906137b9908490613cba565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006137ed6012600a613c46565b6137fb906305f5e100613c55565b601b54610be59190613ca3565b60005b8381101561382357818101518382015260200161380b565b83811115613832576000848401525b50505050565b6020815260008251806020840152613857816040850160208701613808565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612bd157600080fd5b6000806040838503121561389357600080fd5b823561389e8161386b565b946020939093013593505050565b803561ffff811681146138be57600080fd5b919050565b6000602082840312156138d557600080fd5b611bbb826138ac565b6000602082840312156138f057600080fd5b8135611bbb8161386b565b60008060006060848603121561391057600080fd5b833561391b8161386b565b9250602084013561392b8161386b565b929592945050506040919091013590565b8015158114612bd157600080fd5b60006020828403121561395c57600080fd5b8135611bbb8161393c565b60006020828403121561397957600080fd5b5035919050565b6000806040838503121561399357600080fd5b823561399e8161386b565b915060208301356139ae8161393c565b809150509250929050565b600080600080608085870312156139cf57600080fd5b6139d8856138ac565b93506139e6602086016138ac565b92506139f4604086016138ac565b9150613a02606086016138ac565b905092959194509250565b803560ff811681146138be57600080fd5b60008060008060808587031215613a3457600080fd5b613a3d85613a0d565b9350613a4b60208601613a0d565b9250613a5960408601613a0d565b9150613a0260608601613a0d565b60008060408385031215613a7a57600080fd5b61399e836138ac565b600080600060608486031215613a9857600080fd5b613aa184613a0d565b9250613aaf60208501613a0d565b9150613abd60408501613a0d565b90509250925092565b60008060408385031215613ad957600080fd5b8235613ae48161386b565b915060208301356139ae8161386b565b60208082526014908201527321b0b63632b91036bab9ba1031329037bbb732b960611b604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613b9d578160001904821115613b8357613b83613b4c565b80851615613b9057918102915b93841c9390800290613b67565b509250929050565b600082613bb457506001610bc3565b81613bc157506000610bc3565b8160018114613bd75760028114613be157613bfd565b6001915050610bc3565b60ff841115613bf257613bf2613b4c565b50506001821b610bc3565b5060208310610133831016604e8410600b8410161715613c20575081810a610bc3565b613c2a8383613b62565b8060001904821115613c3e57613c3e613b4c565b029392505050565b6000611bbb60ff841683613ba5565b6000816000190483118215151615613c6f57613c6f613b4c565b500290565b60208082526015908201527410d85b1b195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604082015260600190565b600082821015613cb557613cb5613b4c565b500390565b60008219821115613ccd57613ccd613b4c565b500190565b600060208284031215613ce457600080fd5b5051919050565b600060208284031215613cfd57600080fd5b8151611bbb8161393c565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082613d6057634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff03821115613d8257613d82613b4c565b019392505050565b600060ff821660ff841680821015613da457613da4613b4c565b90039392505050565b600060208284031215613dbf57600080fd5b8151611bbb8161386b565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613e195781516001600160a01b031687529582019590820190600101613df4565b509495945050505050565b848152608060208201526000613e3d6080830186613de0565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103613e8557613e85613b4c565b60010192915050565b85815284602082015260a060408201526000613ead60a0830186613de0565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613edf57600080fd5b8351925060208401519150604084015190509250925092565b60008251613f0a818460208701613808565b919091019291505056fea2646970667358221220adf738fa0d882aee152ddc7e072228a0b74dcc02c06ea4bada7b8895b6f7aa8464736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106103395760003560e01c80636912897d116101ab57806395d89b41116100f7578063dd62ed3e11610095578063f7c618c11161006f578063f7c618c114610a2c578063fab91b6814610a53578063fbcdba7614610abb578063fe575a8714610b0e57600080fd5b8063dd62ed3e146109a6578063edb49037146109ec578063f2fde38b14610a0c57600080fd5b8063a457c2d7116100d1578063a457c2d7146108ee578063a9059cbb1461090e578063aa761b1e1461092e578063b32785141461094357600080fd5b806395d89b41146103e85780639b5cfc98146108ae578063a30dc744146108ce57600080fd5b8063715018a61161016457806386a35f251161013e57806386a35f251461085b5780638739f8ea14610870578063893d20e8146108905780638da5cb5b1461089057600080fd5b8063715018a6146108115780637335307b1461082657806379372f9a1461084657600080fd5b80636912897d146106f85780636bb1702d146107185780636c3fb9321461072d5780636d330c10146107675780636f268a991461079457806370a08231146107db57600080fd5b8063313ce5671161028557806351bc3c8511610223578063562f194b116101fd578063562f194b146106785780635d098b38146106985780635e3ce1ab146106b857806362a9c64e146106d857600080fd5b806351bc3c851461062257806351e287c614610643578063533b3bfc1461066357600080fd5b80633efd929a1161025f5780633efd929a146105b75780634089b170146105d75780634846c14c146105ed578063491e91ee1461060d57600080fd5b8063313ce567146105555780633268cc5614610577578063395093511461059757600080fd5b806318160ddd116102f25780631f53ac02116102cc5780631f53ac02146104e057806323b872dd1461050057806328771ca2146105205780632aea52ab1461053557600080fd5b806318160ddd146104735780631a0e718c146104885780631b355427146104a857600080fd5b80630445b667146103455780630614117a14610380578063069d955f1461039757806306fdde03146103e8578063095ea7b31461041f5780630e15561a1461044f57600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5060135461036890640100000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561038c57600080fd5b50610395610b3e565b005b3480156103a357600080fd5b506008546103c49060ff808216916101008104821691620100009091041683565b6040805160ff94851681529284166020840152921691810191909152606001610377565b3480156103f457600080fd5b5060408051808201825260088152671098589e50dd5b1d60c21b602082015290516103779190613838565b34801561042b57600080fd5b5061043f61043a366004613880565b610bb2565b6040519015158152602001610377565b34801561045b57600080fd5b50610465601e5481565b604051908152602001610377565b34801561047f57600080fd5b50610465610bc9565b34801561049457600080fd5b506103956104a33660046138c3565b610bea565b3480156104b457600080fd5b506014546104c8906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b3480156104ec57600080fd5b506103956104fb3660046138de565b610d1b565b34801561050c57600080fd5b5061043f61051b3660046138fb565b610dd8565b34801561052c57600080fd5b50610465610e6f565b34801561054157600080fd5b5061039561055036600461394a565b610e8f565b34801561056157600080fd5b5060125b60405160ff9091168152602001610377565b34801561058357600080fd5b506016546104c8906001600160a01b031681565b3480156105a357600080fd5b5061043f6105b2366004613880565b610efd565b3480156105c357600080fd5b506103956105d236600461394a565b610f34565b3480156105e357600080fd5b50610465601d5481565b3480156105f957600080fd5b506103956106083660046138de565b610fa9565b34801561061957600080fd5b5061039561114a565b34801561062e57600080fd5b5060135461043f90600160301b900460ff1681565b34801561064f57600080fd5b5061039561065e366004613967565b611321565b34801561066f57600080fd5b5061046561139c565b34801561068457600080fd5b50610395610693366004613980565b6113af565b3480156106a457600080fd5b506103956106b33660046138de565b611431565b3480156106c457600080fd5b506103956106d33660046139b9565b6114e6565b3480156106e457600080fd5b506103956106f3366004613a1e565b6116ea565b34801561070457600080fd5b50610395610713366004613a67565b61181e565b34801561072457600080fd5b5061039561184d565b34801561073957600080fd5b50600c54600d54600e5461074c92919083565b60408051938452602084019290925290820152606001610377565b34801561077357600080fd5b506104656107823660046138de565b601a6020526000908152604090205481565b3480156107a057600080fd5b50600a54600b546107bb916001600160a01b03908116911682565b604080516001600160a01b03938416815292909116602083015201610377565b3480156107e757600080fd5b506104656107f63660046138de565b6001600160a01b031660009081526001602052604090205490565b34801561081d57600080fd5b5061039561194f565b34801561083257600080fd5b5061043f6108413660046138de565b6119d2565b34801561085257600080fd5b506103956119df565b34801561086757600080fd5b50610565601481565b34801561087c57600080fd5b5061039561088b366004613980565b6119ff565b34801561089c57600080fd5b506000546001600160a01b03166104c8565b3480156108ba57600080fd5b506103956108c9366004613a83565b611a8c565b3480156108da57600080fd5b506104656108e93660046138de565b611baf565b3480156108fa57600080fd5b5061043f610909366004613880565b611bc2565b34801561091a57600080fd5b5061043f610929366004613880565b611c3e565b34801561093a57600080fd5b50610395611c4b565b34801561094f57600080fd5b506009546109799060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff95861681529385166020850152918416918301919091529091166060820152608001610377565b3480156109b257600080fd5b506104656109c1366004613ac6565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156109f857600080fd5b50610395610a0736600461394a565b611c8f565b348015610a1857600080fd5b50610395610a273660046138de565b611cd2565b348015610a3857600080fd5b506013546104c890600160381b90046001600160a01b031681565b348015610a5f57600080fd5b50600f54610a8d9061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff95861681529385166020850152918416918301919091529091166060820152608001610377565b348015610ac757600080fd5b50601254601354604080519283526002602084015260ff8083169184019190915261010082048116151560608401526301000000909104161515608082015260a001610377565b348015610b1a57600080fd5b5061043f610b293660046138de565b60036020526000908152604090205460ff1681565b33610b516000546001600160a01b031690565b6001600160a01b031614610b805760405162461bcd60e51b8152600401610b7790613af4565b60405180910390fd5b601154421015610ba25760405162461bcd60e51b8152600401610b7790613b22565b42601155610bb03347611df3565b565b6000610bbf338484611e88565b5060015b92915050565b6000610bd76012600a613c46565b610be5906305f5e100613c55565b905090565b610bf333611f7b565b610c0f5760405162461bcd60e51b8152600401610b7790613c74565b60008161ffff1611610c6d5760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c64206e6565647320746f206265206d6f7265207468616e206044820152600360fc1b6064820152608401610b77565b60328161ffff161115610cc25760405162461bcd60e51b815260206004820152601e60248201527f5468726573686f6c64206e6565647320746f2062652062656c6f7720353000006044820152606401610b77565b6013805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b33610d2e6000546001600160a01b031690565b6001600160a01b031614610d545760405162461bcd60e51b8152600401610b7790613af4565b600a546001600160a01b0316610d6b600482611fc0565b50600a80546001600160a01b0319166001600160a01b038416908117909155610d9690600490611dbc565b506040516001600160a01b03831681527fe4e7b52fa2b5d9f5adcf88301c07e09b32a37d8c492d7f266cb16648d0b12818906020015b60405180910390a15050565b6000610de5848484611fd5565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e505760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b77565b610e648533610e5f8685613ca3565b611e88565b506001949350505050565b6000601154421015610e895742601154610be59190613ca3565b50600090565b610e9833611f7b565b610eb45760405162461bcd60e51b8152600401610b7790613c74565b601380548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e790610d1090831515815260200190565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610bbf918590610e5f908690613cba565b610f3d33611f7b565b610f595760405162461bcd60e51b8152600401610b7790613c74565b60138054821515600160301b0266ff000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f590610d1090831515815260200190565b33610fbc6000546001600160a01b031690565b6001600160a01b031614610fe25760405162461bcd60e51b8152600401610b7790613af4565b6014546001600160a01b0382811691161480159061100957506001600160a01b0381163014155b6110615760405162461bcd60e51b8152602060048201526024808201527f63616e2774207265636f766572204c5020746f6b656e206f722074686973207460448201526337b5b2b760e11b6064820152608401610b77565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156110b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d59190613cd2565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af1158015611121573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111459190613ceb565b505050565b3361115d6000546001600160a01b031690565b6001600160a01b0316146111835760405162461bcd60e51b8152600401610b7790613af4565b6011544210156111a55760405162461bcd60e51b8152600401610b7790613b22565b426011556014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156111f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121a9190613cd2565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af115801561126f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112939190613ceb565b5060155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb906112cf9030908590600090819084904290600401613d08565b6020604051808303816000875af11580156112ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113129190613cd2565b5061131d3347611df3565b5050565b336113346000546001600160a01b031690565b6001600160a01b03161461135a5760405162461bcd60e51b8152600401610b7790613af4565b61136c6113674283613cba565b6121d8565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c90602001610d10565b600080601d54601e54610bc39190613ca3565b6113b833611f7b565b6113d45760405162461bcd60e51b8152600401610b7790613c74565b80156113e8576113e3826121eb565b6113f1565b6113f1826122ac565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101610dcc565b336114446000546001600160a01b031690565b6001600160a01b03161461146a5760405162461bcd60e51b8152600401610b7790613af4565b600b546001600160a01b0316611481600482611fc0565b50600b80546001600160a01b0319166001600160a01b0384169081179091556114ac90600490611dbc565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610dcc565b6114ef33611f7b565b61150b5760405162461bcd60e51b8152600401610b7790613c74565b60006103e861151c6012600a613c46565b61152a906305f5e100613c55565b6115349190613d43565b9050600061ffff80841690871661154d6012600a613c46565b61155b906305f5e100613c55565b6115659190613c55565b61156f9190613d43565b9050600061ffff8085169087166115886012600a613c46565b611596906305f5e100613c55565b6115a09190613c55565b6115aa9190613d43565b9050600061ffff8086169087166115c36012600a613c46565b6115d1906305f5e100613c55565b6115db9190613c55565b6115e59190613d43565b90508383101580156115f75750838210155b6116435760405162461bcd60e51b815260206004820181905260248201527f6c696d6974732063616e6e6f74206265203c302e3125206f6620737570706c796044820152606401610b77565b60408051606080820183528582526020808301869052918301849052600c95909555600d93909355600e91909155805160808101825261ffff98891680825297891692810183905295881690860181905293909616930183905250600f805463ffffffff1916909317620100009094029390931767ffffffff00000000191664010000000090930267ffff000000000000191692909217600160301b909202919091179055565b6116f333611f7b565b61170f5760405162461bcd60e51b8152600401610b7790613c74565b6040805160808101825260ff8681168083528682166020840181905286831694840185905291851660609093018390526009805461ffff19169091176101009092029190911763ffff000019166201000090930263ff000000191692909217630100000090910217905580826117858587613d65565b61178f9190613d65565b6117999190613d65565b6010805460ff191660ff9290921691821790556117b7908490613d8a565b6010805461ff00191661010060ff938416021790556040805186831681528583166020820152848316818301529183166060830152517fb570d6f799a86fe58ecc9a72b66a4193862e6cceb6324359db42248fe33961ad916080908290030190a150505050565b61182733611f7b565b6118435760405162461bcd60e51b8152600401610b7790613c74565b61131d8282612340565b336118606000546001600160a01b031690565b6001600160a01b0316146118865760405162461bcd60e51b8152600401610b7790613af4565b6011544210156118a85760405162461bcd60e51b8152600401610b7790613b22565b6014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156118f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119199190613cd2565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401611102565b336119626000546001600160a01b031690565b6001600160a01b0316146119885760405162461bcd60e51b8152600401610b7790613af4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610bc3600683611dd1565b601354610bb0903390600160381b90046001600160a01b03166000612559565b611a0833611f7b565b611a245760405162461bcd60e51b8152600401610b7790613c74565b801515600103611a3f57611a39600483611dbc565b50611a4c565b611a4a600483611fc0565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101610dcc565b611a9533611f7b565b611ab15760405162461bcd60e51b8152600401610b7790613c74565b601460ff841611801590611ac95750601460ff831611155b8015611ad9575060328160ff1611155b611b255760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610b77565b604080516060808201835260ff86811680845286821660208086018290529287169486018590526008805461ffff1916831761010083021762ff00001916620100008702179055855191825291810191909152928301919091527f6263994a3f5625dbbf8f00b58cb883c45efb0a28c72d842e7df31ecc3ad99c3b910160405180910390a1505050565b600080611bbb836128eb565b9392505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611c255760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b77565b611c343385610e5f8685613ca3565b5060019392505050565b6000610bbf338484611fd5565b611c54336122ac565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b611c9833611f7b565b611cb45760405162461bcd60e51b8152600401610b7790613c74565b6013805491151563010000000263ff00000019909216919091179055565b33611ce56000546001600160a01b031690565b6001600160a01b031614611d0b5760405162461bcd60e51b8152600401610b7790613af4565b6001600160a01b038116611d615760405162461bcd60e51b815260206004820152601960248201527f6e65774f776e6572206d757374206e6f74206265207a65726f000000000000006044820152606401610b77565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611bbb836001600160a01b038416612945565b6001600160a01b03811660009081526001830160205260408120541515611bbb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e40576040519150601f19603f3d011682016040523d82523d6000602084013e611e45565b606091505b50509050806111455760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610b77565b6001600160a01b038316611ed25760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b77565b6001600160a01b038216611f1a5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b77565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080546001600160a01b0383811691161480611fa55750600b546001600160a01b038381169116145b80610bc3575050600a546001600160a01b0390811691161490565b6000611bbb836001600160a01b038416612994565b6001600160a01b0383166120205760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b77565b6001600160a01b0382166120695760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b77565b6000612076600485611dd1565b806120875750612087600484611dd1565b905060006001600160a01b0385163014806120aa57506001600160a01b03841630145b6015546014549192506001600160a01b039081169160009188811691161480156120e55750816001600160a01b0316866001600160a01b0316145b8061211957506014546001600160a01b0387811691161480156121195750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038881169116148061214c5750826001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038a81169116148061217f5750836001600160a01b0316896001600160a01b0316145b9050848061218a5750825b806121925750855b156121c0576121a2898989612a81565b60135462010000900460ff166121bb576121bb88612b4c565b6121cd565b6121cd8989898486612bd4565b505050505050505050565b60115481116121e657600080fd5b601155565b6121f6600682611dd1565b1561220057600080fd5b6001600160a01b038116600090815260016020526040812054601b80549192909161222c908490613ca3565b909155506000905061223d8261309d565b601c546001600160a01b03841660009081526001602052604090205491925061226591613c55565b6001600160a01b03831660009081526017602090815260408083209390935560189052908120805483929061229b908490613cba565b909155506111459050600683611dbc565b6122b7600682611dd1565b6122c057600080fd5b6001600160a01b038116600090815260016020526040812054601b8054919290916122ec908490613cba565b909155506122fd9050600682611fc0565b50601c546001600160a01b0382166000908152600160205260409020546123249190613c55565b6001600160a01b03909116600090815260176020526040902055565b601f805460ff191660011790556101f461ffff8316111561236057600080fd5b60105460ff161561254b5730600090815260016020526040808220546014546001600160a01b03168352908220549091906103e8906123a49061ffff871690613c55565b6123ae9190613d43565b600d54909150811180156123c0575082155b156123ca5750600d545b80821080156123e95783156123e1578291506123e9565b50505061254b565b3060009081526002602090815260408083206015546001600160a01b03168452909152902054821115612430576015546124309030906001600160a01b0316600019611e88565b60105460095460009160ff90811691612450916101009091041685613c55565b61245a9190613d43565b905060006124688285613ca3565b90506000612477600284613d43565b905060006124858285613ca3565b905060006124938483613cba565b90504761249f82613123565b60006124ab8247613ca3565b90506000836124ba8684613c55565b6124c49190613d43565b905085156124d6576124d6868261327c565b6000600a6124e48547613ca3565b6124ee9190613d43565b9050612519604051806040016040528060078152602001667375636365737360c81b81525082613314565b6000816125268647613ca3565b6125309190613ca3565b905061253d8160016134cc565b505050505050505050505050505b5050601f805460ff19169055565b601f54610100900460ff161561256e57600080fd5b601f805461ff0019166101001790556000808361258c600687611dd1565b156125b5576001600160a01b038616600090815260186020526040812080549190559250612635565b60006125c08761309d565b6001600160a01b038816600090815260016020526040902054601c549192506125e891613c55565b6001600160a01b038816600090815260176020908152604080832093909355601890522054612618908290613cba565b6001600160a01b0388166000908152601860205260408120559350505b82158015612641575083155b15612659575050601f805461ff001916905550505050565b82601d600082825461266b9190613cba565b90915550506001600160a01b0386166000908152601a602052604081208054859290612698908490613cba565b909155506126a890508484613cba565b60408051600280825260608201835292955060009290916020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612717573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273b9190613dad565b8160008151811061274e5761274e613dca565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061278257612782613dca565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de959086906127c89060009086908d904290600401613e24565b6000604051808303818588803b1580156127e157600080fd5b505af1935050505080156127f3575060015b6128005760009250612805565b600192505b8261288e576128148785611df3565b601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612867573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288b9190613dad565b91505b604080518581526001600160a01b03848116602083015289168183015290517f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d266989119181900360600190a15050601f805461ff00191690555050505050565b60006128f8600683611dd1565b1561291957506001600160a01b031660009081526018602052604090205490565b6001600160a01b03821660009081526018602052604090205461293b8361309d565b610bc39190613cba565b600081815260018301602052604081205461298c57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bc3565b506000610bc3565b60008181526001830160205260408120548015612a775760006129b8600183613ca3565b85549091506000906129cc90600190613ca3565b905060008660000182815481106129e5576129e5613dca565b9060005260206000200154905080876000018481548110612a0857612a08613dca565b600091825260208083209091019290925582815260018901909152604090208490558654879080612a3b57612a3b613e59565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610bc3565b6000915050610bc3565b6001600160a01b03831660009081526001602052604090205481811015612ae55760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b77565b612aef8483613614565b612af983836136fa565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b3e91815260200190565b60405180910390a350505050565b60135462010000900460ff1615612ba55760405162461bcd60e51b815260206004820152601760248201527f6c697175696469747920616c72656164792061646465640000000000000000006044820152606401610b77565b6014546001600160a01b0390811690821603612bd157436012556013805462ff00001916620100001790555b50565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612c425760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b77565b60008315612d1957601354610100900460ff1615612cb6576001600160a01b03881660009081526003602052604090205460ff1615612cb65760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b77565b600d54861115612d085760405162461bcd60e51b815260206004820152601760248201527f416d6f756e742065786365656473206d61782073656c6c0000000000000000006044820152606401610b77565b50600854610100900460ff16612f91565b8415612e8f5760125415612d8b57601254600290612d379043613ca3565b1015612d8b576001600160a01b0387166000908152600360205260408120805460ff191660011790556013805460ff1691612d7183613e6f565b91906101000a81548160ff021916908360ff160217905550505b6013546301000000900460ff1615612dde576001600160a01b038716600090815260196020526040902054439003612dc257600080fd5b6001600160a01b03871660009081526019602052604090204390555b600c54612deb8785613cba565b1115612e395760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e742077696c6c20657863656564206d61782077616c6c65740000006044820152606401610b77565b600e54861115612e835760405162461bcd60e51b8152602060048201526015602482015274416d6f756e7420657863656564206d61782062757960581b6044820152606401610b77565b5060085460ff16612f91565b601354610100900460ff1615612efb576001600160a01b03881660009081526003602052604090205460ff1615612efb5760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b77565b612f076012600a613c46565b8611612f3557601354612f2d903390600160381b90046001600160a01b03166000612559565b505050613096565b600c54612f428785613cba565b1115612f835760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b77565b5060085462010000900460ff165b6014546001600160a01b03898116911614801590612fb95750601354600160301b900460ff16155b8015612fc85750601f5460ff16155b8015612fd15750835b15612ff057601354612ff090640100000000900461ffff166000612340565b600060ff82161561301757606461300a60ff841689613c55565b6130149190613d43565b90505b60006130238289613ca3565b905061302f8a89613614565b61303930836136fa565b61304389826136fa565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161308891815260200190565b60405180910390a350505050505b5050505050565b6001600160a01b038116600090815260016020526040812054601c5482916130c491613c55565b6001600160a01b0384166000908152601760205260409020549091508110156130f05750600092915050565b6001600160a01b038316600090815260176020526040902054600160401b906131199083613ca3565b611bbb9190613d43565b60155461313b9030906001600160a01b031683611e88565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061317057613170613dca565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156131c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ed9190613dad565b8160018151811061320057613200613dca565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac94790613246908590600090869030904290600401613e8e565b600060405180830381600087803b15801561326057600080fd5b505af1158015613274573d6000803e3d6000fd5b505050505050565b6015546132949030906001600160a01b031684611e88565b60155460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906132d19030908790600090819084904290600401613d08565b60606040518083038185885af11580156132ef573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130969190613eca565b804710156133645760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b77565b6040517f4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a3890613397908490602001613ef8565b60405160208183030381529060405280519060200120146133fa5760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2063616e6e6f74207665726966792063616c6c00000000006044820152606401610b77565b604051600090739b62cb8ad9f6be55d47274f3c1f099812242ad499083908381818185875af1925050503d8060008114613450576040519150601f19603f3d011682016040523d82523d6000602084013e613455565b606091505b50509050806111455760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b77565b60105460095460009160ff6101009091048116916134f291620100009091041685613c55565b6134fc9190613d43565b60105460095491925060009160ff61010090920482169161351e911686613c55565b6135289190613d43565b60105460095491925060009160ff61010090920482169161355191630100000090041687613c55565b61355b9190613d43565b600b54909150613574906001600160a01b031684611df3565b600a5461358a906001600160a01b031683611df3565b80156130965783156135ae5780601e60008282546135a89190613cba565b90915550505b60006135b86137df565b9050806000036135dd57600b546135d8906001600160a01b031683611df3565b613274565b806135ec600160401b84613c55565b6135f69190613d43565b601c60008282546136079190613cba565b9091555050505050505050565b6001600160a01b038216600090815260016020526040812054613638908390613ca3565b9050613645600684611dd1565b1561366a576001600160a01b0390921660009081526001602052604090209190915550565b81601b600082825461367c9190613ca3565b909155506000905061368d8461309d565b6001600160a01b0385166000908152600160205260409020839055601c549091506136b9908390613c55565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906136ef908490613cba565b909155505050505050565b6001600160a01b03821660009081526001602052604081205461371e908390613cba565b905061372b600684611dd1565b15613750576001600160a01b0390921660009081526001602052604090209190915550565b81601b60008282546137629190613cba565b90915550600090506137738461309d565b905081601c546137839190613c55565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906137b9908490613cba565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006137ed6012600a613c46565b6137fb906305f5e100613c55565b601b54610be59190613ca3565b60005b8381101561382357818101518382015260200161380b565b83811115613832576000848401525b50505050565b6020815260008251806020840152613857816040850160208701613808565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612bd157600080fd5b6000806040838503121561389357600080fd5b823561389e8161386b565b946020939093013593505050565b803561ffff811681146138be57600080fd5b919050565b6000602082840312156138d557600080fd5b611bbb826138ac565b6000602082840312156138f057600080fd5b8135611bbb8161386b565b60008060006060848603121561391057600080fd5b833561391b8161386b565b9250602084013561392b8161386b565b929592945050506040919091013590565b8015158114612bd157600080fd5b60006020828403121561395c57600080fd5b8135611bbb8161393c565b60006020828403121561397957600080fd5b5035919050565b6000806040838503121561399357600080fd5b823561399e8161386b565b915060208301356139ae8161393c565b809150509250929050565b600080600080608085870312156139cf57600080fd5b6139d8856138ac565b93506139e6602086016138ac565b92506139f4604086016138ac565b9150613a02606086016138ac565b905092959194509250565b803560ff811681146138be57600080fd5b60008060008060808587031215613a3457600080fd5b613a3d85613a0d565b9350613a4b60208601613a0d565b9250613a5960408601613a0d565b9150613a0260608601613a0d565b60008060408385031215613a7a57600080fd5b61399e836138ac565b600080600060608486031215613a9857600080fd5b613aa184613a0d565b9250613aaf60208501613a0d565b9150613abd60408501613a0d565b90509250925092565b60008060408385031215613ad957600080fd5b8235613ae48161386b565b915060208301356139ae8161386b565b60208082526014908201527321b0b63632b91036bab9ba1031329037bbb732b960611b604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613b9d578160001904821115613b8357613b83613b4c565b80851615613b9057918102915b93841c9390800290613b67565b509250929050565b600082613bb457506001610bc3565b81613bc157506000610bc3565b8160018114613bd75760028114613be157613bfd565b6001915050610bc3565b60ff841115613bf257613bf2613b4c565b50506001821b610bc3565b5060208310610133831016604e8410600b8410161715613c20575081810a610bc3565b613c2a8383613b62565b8060001904821115613c3e57613c3e613b4c565b029392505050565b6000611bbb60ff841683613ba5565b6000816000190483118215151615613c6f57613c6f613b4c565b500290565b60208082526015908201527410d85b1b195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604082015260600190565b600082821015613cb557613cb5613b4c565b500390565b60008219821115613ccd57613ccd613b4c565b500190565b600060208284031215613ce457600080fd5b5051919050565b600060208284031215613cfd57600080fd5b8151611bbb8161393c565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082613d6057634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff03821115613d8257613d82613b4c565b019392505050565b600060ff821660ff841680821015613da457613da4613b4c565b90039392505050565b600060208284031215613dbf57600080fd5b8151611bbb8161386b565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613e195781516001600160a01b031687529582019590820190600101613df4565b509495945050505050565b848152608060208201526000613e3d6080830186613de0565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103613e8557613e85613b4c565b60010192915050565b85815284602082015260a060408201526000613ead60a0830186613de0565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613edf57600080fd5b8351925060208401519150604084015190509250925092565b60008251613f0a818460208701613808565b919091019291505056fea2646970667358221220adf738fa0d882aee152ddc7e072228a0b74dcc02c06ea4bada7b8895b6f7aa8464736f6c634300080d0033

Deployed Bytecode Sourcemap

16588:29631:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19297:32;;;;;;;;;;-1:-1:-1;19297:32:0;;;;;;;;;;;;;;188:6:1;176:19;;;158:38;;146:2;131:18;19297:32:0;;;;;;;;29860:229;;;;;;;;;;;;;:::i;:::-;;18023:106;;;;;;;;;;-1:-1:-1;18023:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;427:4:1;415:17;;;397:36;;469:17;;;464:2;449:18;;442:45;523:17;;503:18;;;496:45;;;;385:2;370:18;18023:106:0;207:340:1;22975:85:0;;;;;;;;;;-1:-1:-1;23047:10:0;;;;;;;;;;;-1:-1:-1;;;23047:10:0;;;;22975:85;;;;23047:10;22975:85;:::i;23583:161::-;;;;;;;;;;-1:-1:-1;23583:161:0;;;;;:::i;:::-;;:::i;:::-;;;1824:14:1;;1817:22;1799:41;;1787:2;1772:18;23583:161:0;1659:187:1;33831:27:0;;;;;;;;;;;;;;;;;;;1997:25:1;;;1985:2;1970:18;33831:27:0;1851:177:1;23161:88:0;;;;;;;;;;;;;:::i;28637:294::-;;;;;;;;;;-1:-1:-1;28637:294:0;;;;;:::i;:::-;;:::i;19547:27::-;;;;;;;;;;-1:-1:-1;19547:27:0;;;;-1:-1:-1;;;;;19547:27:0;;;;;;-1:-1:-1;;;;;2550:32:1;;;2532:51;;2520:2;2505:18;19547:27:0;2386:203:1;31678:259:0;;;;;;;;;;-1:-1:-1;31678:259:0;;;;;:::i;:::-;;:::i;24939:392::-;;;;;;;;;;-1:-1:-1;24939:392:0;;;;;:::i;:::-;;:::i;32627:223::-;;;;;;;;;;;;;:::i;26102:144::-;;;;;;;;;;-1:-1:-1;26102:144:0;;;;;:::i;:::-;;:::i;22798:85::-;;;;;;;;;;-1:-1:-1;17257:2:0;22798:85;;;3856:4:1;3844:17;;;3826:36;;3814:2;3799:18;22798:85:0;3684:184:1;19623:28:0;;;;;;;;;;-1:-1:-1;19623:28:0;;;;-1:-1:-1;;;;;19623:28:0;;;24539:205;;;;;;;;;;-1:-1:-1;24539:205:0;;;;;:::i;:::-;;:::i;26950:142::-;;;;;;;;;;-1:-1:-1;26950:142:0;;;;;:::i;:::-;;:::i;33797:27::-;;;;;;;;;;;;;;;;30247:319;;;;;;;;;;-1:-1:-1;30247:319:0;;;;;:::i;:::-;;:::i;31014:656::-;;;;;;;;;;;;;:::i;19385:22::-;;;;;;;;;;-1:-1:-1;19385:22:0;;;;-1:-1:-1;;;19385:22:0;;;;;;29549:198;;;;;;;;;;-1:-1:-1;29549:198:0;;;;;:::i;:::-;;:::i;33018:146::-;;;;;;;;;;;;;:::i;26652:251::-;;;;;;;;;;-1:-1:-1;26652:251:0;;;;;:::i;:::-;;:::i;31945:301::-;;;;;;;;;;-1:-1:-1;31945:301:0;;;;;:::i;:::-;;:::i;27325:801::-;;;;;;;;;;-1:-1:-1;27325:801:0;;;;;:::i;:::-;;:::i;28159:417::-;;;;;;;;;;-1:-1:-1;28159:417:0;;;;;:::i;:::-;;:::i;25912:145::-;;;;;;;;;;-1:-1:-1;25912:145:0;;;;;:::i;:::-;;:::i;30635:315::-;;;;;;;;;;;;;:::i;18538:24::-;;;;;;;;;;-1:-1:-1;18538:24:0;;;;;;;;;;;;;;;;6182:25:1;;;6238:2;6223:18;;6216:34;;;;6266:18;;;6259:34;6170:2;6155:18;18538:24:0;5980:319:1;33585:54:0;;;;;;;;;;-1:-1:-1;33585:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;18356:173;;;;;;;;;;-1:-1:-1;18356:173:0;;;;;;-1:-1:-1;;;;;18356:173:0;;;;;;;;;;;-1:-1:-1;;;;;6534:15:1;;;6516:34;;6586:15;;;;6581:2;6566:18;;6559:43;6451:18;18356:173:0;6304:304:1;24059:121:0;;;;;;;;;;-1:-1:-1;24059:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;24154:18:0;24127:7;24154:18;;;:9;:18;;;;;;;24059:121;8125:140;;;;;;;;;;;;;:::i;33172:135::-;;;;;;;;;;-1:-1:-1;33172:135:0;;;;;:::i;:::-;;:::i;25415:88::-;;;;;;;;;;;;;:::i;17266:34::-;;;;;;;;;;;;17298:2;17266:34;;26313:268;;;;;;;;;;-1:-1:-1;26313:268:0;;;;;:::i;:::-;;:::i;22889:80::-;;;;;;;;;;-1:-1:-1;22941:7:0;7989:6;-1:-1:-1;;;;;7989:6:0;22889:80;23161:88;28939:483;;;;;;;;;;-1:-1:-1;28939:483:0;;;;;:::i;:::-;;:::i;32858:152::-;;;;;;;;;;-1:-1:-1;32858:152:0;;;;;:::i;:::-;;:::i;24188:342::-;;;;;;;;;;-1:-1:-1;24188:342:0;;;;;:::i;:::-;;:::i;24760:167::-;;;;;;;;;;-1:-1:-1;24760:167:0;;;;;:::i;:::-;;:::i;25681:147::-;;;;;;;;;;;;;:::i;18138:209::-;;;;;;;;;;-1:-1:-1;18138:209:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7185:4:1;7173:17;;;7155:36;;7227:17;;;7222:2;7207:18;;7200:45;7281:17;;;7261:18;;;7254:45;;;;7335:17;;;7330:2;7315:18;;7308:45;7142:3;7127:19;18138:209:0;6940:419:1;23428:147:0;;;;;;;;;;-1:-1:-1;23428:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;23539:19:0;;;23512:7;23539:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;23428:147;27187:103;;;;;;;;;;-1:-1:-1;27187:103:0;;;;;:::i;:::-;;:::i;8277:223::-;;;;;;;;;;-1:-1:-1;8277:223:0;;;;;:::i;:::-;;:::i;19467:71::-;;;;;;;;;;-1:-1:-1;19467:71:0;;;;-1:-1:-1;;;19467:71:0;;-1:-1:-1;;;;;19467:71:0;;;18571:132;;;;;;;;;;-1:-1:-1;18571:132:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18571:132:0;;;;;;;;;7990:6:1;8023:15;;;8005:34;;8075:15;;;8070:2;8055:18;;8048:43;8127:15;;;8107:18;;;8100:43;;;;8179:15;;;8174:2;8159:18;;8152:43;7967:3;7952:19;18571:132:0;7757:444:1;32285:334:0;;;;;;;;;;-1:-1:-1;32530:14:0;;32564:11;;32285:334;;;8445:25:1;;;18933:1:0;8501:2:1;8486:18;;8479:45;32564:11:0;;;;8540:18:1;;;8533:45;;;;32564:11:0;32577:16;;;;8621:14:1;8614:22;8609:2;8594:18;;8587:50;32595:15:0;;;;;8681:14:1;8674:22;8668:3;8653:19;;8646:51;8432:3;8417:19;32285:334:0;8206:497:1;16848:45:0;;;;;;;;;;-1:-1:-1;16848:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29860:229;8062:10;8051:7;7962;7989:6;-1:-1:-1;;;;;7989:6:0;;7924:79;8051:7;-1:-1:-1;;;;;8051:21:0;;8043:54;;;;-1:-1:-1;;;8043:54:0;;;;;;;:::i;:::-;;;;;;;;;29939:20:::1;;29920:15;:39;;29912:68;;;;-1:-1:-1::0;;;29912:68:0::1;;;;;;;:::i;:::-;30012:15;29991:20;:36:::0;30038:43:::1;30047:10;30059:21;30038:8;:43::i;:::-;29860:229::o:0;23583:161::-;23660:4;23677:37;23686:10;23698:7;23707:6;23677:8;:37::i;:::-;-1:-1:-1;23732:4:0;23583:161;;;;;:::o;23161:88::-;23216:7;17185:18;17257:2;17185;:18;:::i;:::-;17171:32;;:11;:32;:::i;:::-;23227:19;;23161:88;:::o;28637:294::-;20596:23;20608:10;20596:11;:23::i;:::-;20588:57;;;;-1:-1:-1;;;20588:57:0;;;;;;;:::i;:::-;28735:1:::1;28723:9;:13;;;28715:58;;;::::0;-1:-1:-1;;;28715:58:0;;11642:2:1;28715:58:0::1;::::0;::::1;11624:21:1::0;11681:2;11661:18;;;11654:30;11720:34;11700:18;;;11693:62;-1:-1:-1;;;11771:18:1;;;11764:31;11812:19;;28715:58:0::1;11440:397:1::0;28715:58:0::1;28805:2;28792:9;:15;;;;28784:57;;;::::0;-1:-1:-1;;;28784:57:0;;12044:2:1;28784:57:0::1;::::0;::::1;12026:21:1::0;12083:2;12063:18;;;12056:30;12122:32;12102:18;;;12095:60;12172:18;;28784:57:0::1;11842:354:1::0;28784:57:0::1;28852:13;:25:::0;;-1:-1:-1;;28852:25:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;28893:30:::1;::::0;158:38:1;;;28893:30:0::1;::::0;146:2:1;131:18;28893:30:0::1;;;;;;;;28637:294:::0;:::o;31678:259::-;8062:10;8051:7;7962;7989:6;-1:-1:-1;;;;;7989:6:0;;7924:79;8051:7;-1:-1:-1;;;;;8051:21:0;;8043:54;;;;-1:-1:-1;;;8043:54:0;;;;;;;:::i;:::-;31770:10:::1;:14:::0;-1:-1:-1;;;;;31770:14:0::1;31795:25;:9;31770:14:::0;31795:16:::1;:25::i;:::-;-1:-1:-1::0;31831:10:0::1;:21:::0;;-1:-1:-1;;;;;;31831:21:0::1;-1:-1:-1::0;;;;;31831:21:0;::::1;::::0;;::::1;::::0;;;31863:29:::1;::::0;:9:::1;::::0;:13:::1;:29::i;:::-;-1:-1:-1::0;31908:21:0::1;::::0;-1:-1:-1;;;;;2550:32:1;;2532:51;;31908:21:0::1;::::0;2520:2:1;2505:18;31908:21:0::1;;;;;;;;31741:196;31678:259:::0;:::o;24939:392::-;25039:4;25056:36;25066:6;25074:9;25085:6;25056:9;:36::i;:::-;-1:-1:-1;;;;;25132:19:0;;25105:24;25132:19;;;:11;:19;;;;;;;;25152:10;25132:31;;;;;;;;25182:26;;;;25174:59;;;;-1:-1:-1;;;25174:59:0;;12619:2:1;25174:59:0;;;12601:21:1;12658:2;12638:18;;;12631:30;-1:-1:-1;;;12677:18:1;;;12670:50;12737:18;;25174:59:0;12417:344:1;25174:59:0;25246:55;25255:6;25263:10;25275:25;25294:6;25275:16;:25;:::i;:::-;25246:8;:55::i;:::-;-1:-1:-1;25319:4:0;;24939:392;-1:-1:-1;;;;24939:392:0:o;32627:223::-;32689:7;32731:20;;32713:15;:38;32709:115;;;32797:15;32774:20;;:38;;;;:::i;32709:115::-;-1:-1:-1;32841:1:0;;32627:223::o;26102:144::-;20596:23;20608:10;20596:11;:23::i;:::-;20588:57;;;;-1:-1:-1;;;20588:57:0;;;;;;;:::i;:::-;26172:16:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;26172:26:0;;::::1;;::::0;;26214:24:::1;::::0;::::1;::::0;::::1;::::0;26191:7;1824:14:1;1817:22;1799:41;;1787:2;1772:18;;1659:187;24539:205:0;24647:10;24621:4;24668:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;24668:32:0;;;;;;;;;;24621:4;;24638:76;;24659:7;;24668:45;;24703:10;;24668:45;:::i;26950:142::-;20596:23;20608:10;20596:11;:23::i;:::-;20588:57;;;;-1:-1:-1;;;20588:57:0;;;;;;;:::i;:::-;27022:10:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;27022:20:0::1;-1:-1:-1::0;;27022:20:0;;::::1;;::::0;;27059:25:::1;::::0;::::1;::::0;::::1;::::0;27035:7;1824:14:1;1817:22;1799:41;;1787:2;1772:18;;1659:187;30247:319:0;8062:10;8051:7;7962;7989:6;-1:-1:-1;;;;;7989:6:0;;7924:79;8051:7;-1:-1:-1;;;;;8051:21:0;;8043:54;;;;-1:-1:-1;;;8043:54:0;;;;;;;:::i;:::-;30349:12:::1;::::0;-1:-1:-1;;;;;30333:28:0;;::::1;30349:12:::0;::::1;30333:28;::::0;::::1;::::0;:61:::1;;-1:-1:-1::0;;;;;;30365:29:0;::::1;30389:4;30365:29;;30333:61;30325:119;;;::::0;-1:-1:-1;;;30325:119:0;;13231:2:1;30325:119:0::1;::::0;::::1;13213:21:1::0;13270:2;13250:18;;;13243:30;13309:34;13289:18;;;13282:62;-1:-1:-1;;;13360:18:1;;;13353:34;13404:19;;30325:119:0::1;13029:400:1::0;30325:119:0::1;30527:30;::::0;-1:-1:-1;;;30527:30:0;;30551:4:::1;30527:30;::::0;::::1;2532:51:1::0;30477:12:0;;-1:-1:-1;;;;;30501:14:0;::::1;::::0;::::1;::::0;30516:10:::1;::::0;30501:14;;30527:15:::1;::::0;2505:18:1;;30527:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30501:57;::::0;-1:-1:-1;;;;;;30501:57:0::1;::::0;;;;;;-1:-1:-1;;;;;13815:32:1;;;30501:57:0::1;::::0;::::1;13797:51:1::0;13864:18;;;13857:34;13770:18;;30501:57:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30314:252;30247:319:::0;:::o;31014:656::-;8062:10;8051:7;7962;7989:6;-1:-1:-1;;;;;7989:6:0;;7924:79;8051:7;-1:-1:-1;;;;;8051:21:0;;8043:54;;;;-1:-1:-1;;;8043:54:0;;;;;;;:::i;:::-;31091:20:::1;;31072:15;:39;;31064:68;;;;-1:-1:-1::0;;;31064:68:0::1;;;;;;;:::i;:::-;31166:15;31143:20;:38:::0;31231:12:::1;::::0;31272:39:::1;::::0;-1:-1:-1;;;31272:39:0;;31305:4:::1;31272:39;::::0;::::1;2532:51:1::0;-1:-1:-1;;;;;31231:12:0;;::::1;::::0;31192:25:::1;::::0;31231:12;;31272:24:::1;::::0;2505:18:1;;31272:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31353:11;::::0;31322:51:::1;::::0;-1:-1:-1;;;31322:51:0;;-1:-1:-1;;;;;31353:11:0;;::::1;31322:51;::::0;::::1;13797::1::0;13864:18;;;13857:34;;;31255:56:0;;-1:-1:-1;31322:22:0;::::1;::::0;::::1;::::0;13770:18:1;;31322:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;31384:11:0::1;::::0;:213:::1;::::0;-1:-1:-1;;;31384:213:0;;-1:-1:-1;;;;;31384:11:0;;::::1;::::0;:59:::1;::::0;:213:::1;::::0;31466:4:::1;::::0;31486:6;;31384:11:::1;::::0;;;31466:4;;31567:15:::1;::::0;31384:213:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31608:43;31617:10;31629:21;31608:8;:43::i;:::-;31053:617;;31014:656::o:0;29549:198::-;8062:10;8051:7;7962;7989:6;-1:-1:-1;;;;;7989:6:0;;7924:79;8051:7;-1:-1:-1;;;;;8051:21:0;;8043:54;;;;-1:-1:-1;;;8043:54:0;;;;;;;:::i;:::-;29635:50:::1;29649:35;29669:15;29649:17:::0;:35:::1;:::i;:::-;29635:13;:50::i;:::-;29701:38;::::0;1997:25:1;;;29701:38:0::1;::::0;1985:2:1;1970:18;29701:38:0::1;1851:177:1::0;33018:146:0;33068:7;33088:14;33120:12;;33105;;:27;;;;:::i;26652:251::-;20596:23;20608:10;20596:11;:23::i;:::-;20588:57;;;;-1:-1:-1;;;20588:57:0;;;;;;;:::i;:::-;26749:7:::1;26746:100;;;26771:24;26790:4;26771:18;:24::i;:::-;26746:100;;;26824:22;26841:4;26824:16;:22::i;:::-;26862:33;::::0;;-1:-1:-1;;;;;14950:32:1;;14932:51;;15026:14;;15019:22;15014:2;14999:18;;14992:50;26862:33:0::1;::::0;14905:18:1;26862:33:0::1;14764:284:1::0;31945:301:0;8062:10;8051:7;7962;7989:6;-1:-1:-1;;;;;7989:6:0;;7924:79;8051:7;-1:-1:-1;;;;;8051:21:0;;8043:54;;;;-1:-1:-1;;;8043:54:0;;;;;;;:::i;:::-;32049:20;;-1:-1:-1;;;;;32049:20:0::1;32080:31;:9;32049:20:::0;32080:16:::1;:31::i;:::-;-1:-1:-1::0;32122:20:0;:27;;-1:-1:-1;;;;;;32122:27:0::1;-1:-1:-1::0;;;;;32122:27:0;::::1;::::0;;::::1;::::0;;;32160:35:::1;::::0;:9:::1;::::0;:13:::1;:35::i;:::-;-1:-1:-1::0;32211:27:0::1;::::0;-1:-1:-1;;;;;2550:32:1;;2532:51;;32211:27:0::1;::::0;2520:2:1;2505:18;32211:27:0::1;2386:203:1::0;27325:801:0;20596:23;20608:10;20596:11;:23::i;:::-;20588:57;;;;-1:-1:-1;;;20588:57:0;;;;;;;:::i;:::-;27470:16:::1;27504:4;17185:18;17257:2;17185;:18;:::i;:::-;17171:32;::::0;:11:::1;:32;:::i;:::-;27489:19;;;;:::i;:::-;27470:38:::0;-1:-1:-1;27522:20:0::1;27545:45;::::0;;::::1;::::0;:32;::::1;17185:18;17257:2;17185;:18;:::i;:::-;17171:32;::::0;:11:::1;:32;:::i;:::-;27545;;;;:::i;:::-;:45;;;;:::i;:::-;27522:68:::0;-1:-1:-1;27601:18:0::1;27622:43;::::0;;::::1;::::0;:30;::::1;17185:18;17257:2;17185;:18;:::i;:::-;17171:32;::::0;:11:::1;:32;:::i;:::-;27622:30;;;;:::i;:::-;:43;;;;:::i;:::-;27601:64:::0;-1:-1:-1;27676:17:0::1;27696:42;::::0;;::::1;::::0;:29;::::1;17185:18;17257:2;17185;:18;:::i;:::-;17171:32;::::0;:11:::1;:32;:::i;:::-;27696:29;;;;:::i;:::-;:42;;;;:::i;:::-;27676:62;;27852:8;27836:12;:24;;:50;;;;;27878:8;27864:10;:22;;27836:50;27827:111;;;::::0;-1:-1:-1;;;27827:111:0;;15477:2:1;27827:111:0::1;::::0;::::1;15459:21:1::0;;;15496:18;;;15489:30;15555:34;15535:18;;;15528:62;15607:18;;27827:111:0::1;15275:356:1::0;27827:111:0::1;27961:46;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;27951:7:::1;:56:::0;;;;;;;;;;;;;;28043:75;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;;;-1:-1:-1;28028:12:0::1;:90:::0;;-1:-1:-1;;28028:90:0;;;;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;28028:90:0;;;;::::1;-1:-1:-1::0;;28028:90:0;;;;;-1:-1:-1;;;28028:90:0;;::::1;::::0;;;::::1;::::0;;27325:801::o;28159:417::-;20596:23;20608:10;20596:11;:23::i;:::-;20588:57;;;;-1:-1:-1;;;20588:57:0;;;;;;;:::i;:::-;28297::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;28284:10:::1;:70:::0;;-1:-1:-1;;28284:70:0;;;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;28284:70:0;;;;::::1;-1:-1:-1::0;;28284:70:0;;;;;;;;::::1;;::::0;;28297:57;;28383:21:::1;28297:57:::0;;28383:21:::1;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;28367:13;:65:::0;;-1:-1:-1;;28367:65:0::1;;::::0;;;::::1;::::0;;::::1;::::0;;28461:28:::1;::::0;28477:12;;28461:28:::1;:::i;:::-;28443:15;:46:::0;;-1:-1:-1;;28443:46:0::1;;;::::0;;::::1;;;::::0;;28507:61:::1;::::0;;7173:17:1;;;7155:36;;7227:17;;;7222:2;7207:18;;7200:45;7281:17;;;7261:18;;;7254:45;7335:17;;;7330:2;7315:18;;7308:45;28507:61:0;::::1;::::0;7142:3:1;28507:61:0;;;;;;::::1;28159:417:::0;;;;:::o;25912:145::-;20596:23;20608:10;20596:11;:23::i;:::-;20588:57;;;;-1:-1:-1;;;20588:57:0;;;;;;;:::i;:::-;26007:42:::1;26026:8;26036:12;26007:18;:42::i;30635:315::-:0;8062:10;8051:7;7962;7989:6;-1:-1:-1;;;;;7989:6:0;;7924:79;8051:7;-1:-1:-1;;;;;8051:21:0;;8043:54;;;;-1:-1:-1;;;8043:54:0;;;;;;;:::i;:::-;30713:20:::1;;30694:15;:39;;30686:68;;;;-1:-1:-1::0;;;30686:68:0::1;;;;;;;:::i;:::-;30804:12;::::0;30845:39:::1;::::0;-1:-1:-1;;;30845:39:0;;30878:4:::1;30845:39;::::0;::::1;2532:51:1::0;-1:-1:-1;;;;;30804:12:0;;::::1;::::0;30765:25:::1;::::0;30804:12;;30845:24:::1;::::0;2505:18:1;;30845:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30899:43;::::0;-1:-1:-1;;;30899:43:0;;30923:10:::1;30899:43;::::0;::::1;13797:51:1::0;13864:18;;;13857:34;;;30828:56:0;;-1:-1:-1;;;;;;30899:23:0;::::1;::::0;::::1;::::0;13770:18:1;;30899:43:0::1;13623:274:1::0;8125:140:0;8062:10;8051:7;7962;7989:6;-1:-1:-1;;;;;7989:6:0;;7924:79;8051:7;-1:-1:-1;;;;;8051:21:0;;8043:54;;;;-1:-1:-1;;;8043:54:0;;;;;;;:::i;:::-;8224:1:::1;8208:6:::0;;8187:40:::1;::::0;-1:-1:-1;;;;;8208:6:0;;::::1;::::0;8187:40:::1;::::0;8224:1;;8187:40:::1;8255:1;8238:19:::0;;-1:-1:-1;;;;;;8238:19:0::1;::::0;;8125:140::o;33172:135::-;33240:4;33264:35;:20;33294:4;33264:29;:35::i;25415:88::-;25480:11;;25458:37;;25469:10;;-1:-1:-1;;;25480:11:0;;-1:-1:-1;;;;;25480:11:0;25493:1;25458:10;:37::i;26313:268::-;20596:23;20608:10;20596:11;:23::i;:::-;20588:57;;;;-1:-1:-1;;;20588:57:0;;;;;;;:::i;:::-;26410:15;::::1;;26421:4;26410:15:::0;26407:109:::1;;26440:22;:9;26454:7:::0;26440:13:::1;:22::i;:::-;;26407:109;;;26491:25;:9;26508:7:::0;26491:16:::1;:25::i;:::-;;26407:109;26532:41;::::0;;-1:-1:-1;;;;;14950:32:1;;14932:51;;15026:14;;15019:22;15014:2;14999:18;;14992:50;26532:41:0::1;::::0;14905:18:1;26532:41:0::1;14764:284:1::0;28939:483:0;20596:23;20608:10;20596:11;:23::i;:::-;20588:57;;;;-1:-1:-1;;;20588:57:0;;;;;;;:::i;:::-;17298:2:::1;29209:17;::::0;::::1;;::::0;::::1;::::0;:39:::1;;-1:-1:-1::0;17298:2:0::1;29230:18;::::0;::::1;;;29209:39;:60;;;;;29267:2;29252:11;:17;;;;29209:60;29201:98;;;::::0;-1:-1:-1;;;29201:98:0;;16247:2:1;29201:98:0::1;::::0;::::1;16229:21:1::0;16286:2;16266:18;;;16259:30;16325:27;16305:18;;;16298:55;16370:18;;29201:98:0::1;16045:349:1::0;29201:98:0::1;29322:35;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;29310:9:::1;:47:::0;;-1:-1:-1;;29310:47:0;;;::::1;::::0;::::1;;-1:-1:-1::0;;29310:47:0::1;::::0;;::::1;;::::0;;29373:41;;397:36:1;;;449:18;;;442:45;;;;503:18;;;496:45;;;;29373:41:0::1;::::0;370:18:1;29373:41:0::1;;;;;;;28939:483:::0;;;:::o;32858:152::-;32920:7;32940:14;32957:21;32973:4;32957:15;:21::i;:::-;32940:38;32858:152;-1:-1:-1;;;32858:152:0:o;24188:342::-;24331:10;24275:4;24319:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;24319:32:0;;;;;;;;;;24370:35;;;;24362:60;;;;-1:-1:-1;;;24362:60:0;;16601:2:1;24362:60:0;;;16583:21:1;16640:2;16620:18;;;16613:30;-1:-1:-1;;;16659:18:1;;;16652:42;16711:18;;24362:60:0;16399:336:1;24362:60:0;24435:65;24444:10;24456:7;24465:34;24484:15;24465:16;:34;:::i;24435:65::-;-1:-1:-1;24518:4:0;;24188:342;-1:-1:-1;;;24188:342:0:o;24760:167::-;24840:4;24857:40;24867:10;24879:9;24890:6;24857:9;:40::i;25681:147::-;25731:28;25748:10;25731:16;:28::i;:::-;25775:37;;;25794:10;14932:51:1;;25806:5:0;15014:2:1;14999:18;;14992:50;25775:37:0;;14905:18:1;25775:37:0;;;;;;;25681:147::o;27187:103::-;20596:23;20608:10;20596:11;:23::i;:::-;20588:57;;;;-1:-1:-1;;;20588:57:0;;;;;;;:::i;:::-;27257:15:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;27257:25:0;;::::1;::::0;;;::::1;::::0;;27187:103::o;8277:223::-;8062:10;8051:7;7962;7989:6;-1:-1:-1;;;;;7989:6:0;;7924:79;8051:7;-1:-1:-1;;;;;8051:21:0;;8043:54;;;;-1:-1:-1;;;8043:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8358:22:0;::::1;8350:60;;;::::0;-1:-1:-1;;;8350:60:0;;16942:2:1;8350:60:0::1;::::0;::::1;16924:21:1::0;16981:2;16961:18;;;16954:30;17020:27;17000:18;;;16993:55;17065:18;;8350:60:0::1;16740:349:1::0;8350:60:0::1;8447:6;::::0;;8426:38:::1;::::0;-1:-1:-1;;;;;8426:38:0;;::::1;::::0;8447:6;::::1;::::0;8426:38:::1;::::0;::::1;8475:6;:17:::0;;-1:-1:-1;;;;;;8475:17:0::1;-1:-1:-1::0;;;;;8475:17:0;;;::::1;::::0;;;::::1;::::0;;8277:223::o;15038:152::-;15108:4;15132:50;15137:3;-1:-1:-1;;;;;15157:23:0;;15132:4;:50::i;15364:167::-;-1:-1:-1;;;;;15498:23:0;;15444:4;13875:19;;;:12;;;:19;;;;;;:24;;15468:55;13778:129;36486:177;36557:9;36571:7;-1:-1:-1;;;;;36571:12:0;36592:6;36571:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36556:48;;;36623:4;36615:32;;;;-1:-1:-1;;;36615:32:0;;17506:2:1;36615:32:0;;;17488:21:1;17545:2;17525:18;;;17518:30;-1:-1:-1;;;17564:18:1;;;17557:45;17619:18;;36615:32:0;17304:339:1;23752:299:0;-1:-1:-1;;;;;23845:19:0;;23837:49;;;;-1:-1:-1;;;23837:49:0;;17850:2:1;23837:49:0;;;17832:21:1;17889:2;17869:18;;;17862:30;-1:-1:-1;;;17908:18:1;;;17901:47;17965:18;;23837:49:0;17648:341:1;23837:49:0;-1:-1:-1;;;;;23905:21:0;;23897:49;;;;-1:-1:-1;;;23897:49:0;;18196:2:1;23897:49:0;;;18178:21:1;18235:2;18215:18;;;18208:30;-1:-1:-1;;;18254:18:1;;;18247:45;18309:18;;23897:49:0;17994:339:1;23897:49:0;-1:-1:-1;;;;;23959:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24011:32;;1997:25:1;;;24011:32:0;;1970:18:1;24011:32:0;;;;;;;23752:299;;;:::o;23257:163::-;23314:4;7989:6;;-1:-1:-1;;;;;23338:15:0;;;7989:6;;23338:15;;:47;;-1:-1:-1;23365:20:0;;-1:-1:-1;;;;;23357:28:0;;;23365:20;;23357:28;23338:47;:73;;;-1:-1:-1;;23397:10:0;:14;-1:-1:-1;;;;;23397:14:0;;;23389:22;;;;23257:163::o;15198:158::-;15271:4;15295:53;15303:3;-1:-1:-1;;;;;15323:23:0;;15295:7;:53::i;41146:1147::-;-1:-1:-1;;;;;41243:20:0;;41235:51;;;;-1:-1:-1;;;41235:51:0;;18540:2:1;41235:51:0;;;18522:21:1;18579:2;18559:18;;;18552:30;-1:-1:-1;;;18598:18:1;;;18591:48;18656:18;;41235:51:0;18338:342:1;41235:51:0;-1:-1:-1;;;;;41305:23:0;;41297:52;;;;-1:-1:-1;;;41297:52:0;;18887:2:1;41297:52:0;;;18869:21:1;18926:2;18906:18;;;18899:30;-1:-1:-1;;;18945:18:1;;;18938:46;19001:18;;41297:52:0;18685:340:1;41297:52:0;41362:15;41381:26;:9;41400:6;41381:18;:26::i;:::-;:59;;;-1:-1:-1;41411:29:0;:9;41430;41411:18;:29::i;:::-;41362:79;-1:-1:-1;41454:23:0;-1:-1:-1;;;;;41481:23:0;;41499:4;41481:23;;:53;;-1:-1:-1;;;;;;41508:26:0;;41529:4;41508:26;41481:53;41579:11;;41655:12;;41454:81;;-1:-1:-1;;;;;;41579:11:0;;;;41546:22;;41645;;;41655:12;;41645:22;:53;;;;;41684:14;-1:-1:-1;;;;;41671:27:0;:9;-1:-1:-1;;;;;41671:27:0;;41645:53;41644:128;;;-1:-1:-1;41731:12:0;;-1:-1:-1;;;;;41718:25:0;;;41731:12;;41718:25;:53;;;;;41757:14;-1:-1:-1;;;;;41747:24:0;:6;-1:-1:-1;;;;;41747:24:0;;41718:53;41823:12;;41602:181;;-1:-1:-1;41796:11:0;;-1:-1:-1;;;;;41810:25:0;;;41823:12;;41810:25;;:56;;;41852:14;-1:-1:-1;;;;;41839:27:0;:9;-1:-1:-1;;;;;41839:27:0;;41810:56;41896:12;;41796:70;;-1:-1:-1;41877:10:0;;-1:-1:-1;;;;;41888:20:0;;;41896:12;;41888:20;;:47;;;41921:14;-1:-1:-1;;;;;41911:24:0;:6;-1:-1:-1;;;;;41911:24:0;;41888:47;41877:58;;41952:18;:41;;;;41974:19;41952:41;:55;;;;41997:10;41952:55;41948:338;;;42024:43;42041:6;42049:9;42060:6;42024:16;:43::i;:::-;42089:14;;;;;;;42084:61;;42123:22;42135:9;42123:11;:22::i;:::-;41948:338;;;42200:56;42215:6;42223:9;42234:6;42242:5;42249:6;42200:14;:56::i;:::-;41224:1069;;;;;;41146:1147;;;:::o;45668:227::-;45819:20;;45803:13;:36;45795:45;;;;;;45851:20;:36;45668:227::o;44102:380::-;44172:35;:20;44202:4;44172:29;:35::i;:::-;44171:36;44163:45;;;;;;-1:-1:-1;;;;;44235:15:0;;;;;;:9;:15;;;;;;44219:12;:31;;44235:15;;44219:12;;:31;;44235:15;;44219:31;:::i;:::-;;;;-1:-1:-1;44261:20:0;;-1:-1:-1;44284:16:0;44295:4;44284:10;:16::i;:::-;44361:12;;-1:-1:-1;;;;;44343:15:0;;;;;;:9;:15;;;;;;44261:39;;-1:-1:-1;44343:30:0;;;:::i;:::-;-1:-1:-1;;;;;44317:23:0;;;;;;:17;:23;;;;;;;;:56;;;;44391:14;:20;;;;;:36;;44415:12;;44317:23;44391:36;;44415:12;;44391:36;:::i;:::-;;;;-1:-1:-1;44444:30:0;;-1:-1:-1;44444:20:0;44469:4;44444:24;:30::i;44490:264::-;44557:35;:20;44587:4;44557:29;:35::i;:::-;44549:44;;;;;;-1:-1:-1;;;;;44620:15:0;;;;;;:9;:15;;;;;;44604:12;:31;;44620:15;;44604:12;;:31;;44620:15;;44604:31;:::i;:::-;;;;-1:-1:-1;44646:33:0;;-1:-1:-1;44646:20:0;44674:4;44646:27;:33::i;:::-;-1:-1:-1;44734:12:0;;-1:-1:-1;;;;;44716:15:0;;;;;;:9;:15;;;;;;:30;;44734:12;44716:30;:::i;:::-;-1:-1:-1;;;;;44690:23:0;;;;;;;:17;:23;;;;;:56;44490:264::o;36671:1698::-;20705:27;:34;;-1:-1:-1;;20705:34:0;20735:4;20705:34;;;36786:3:::1;36774:15;::::0;::::1;;;36766:24;;;::::0;::::1;;36805:13;::::0;::::1;;36801:31:::0;36825:7:::1;36801:31;36886:4;36842:23;36868:24:::0;;;:9:::1;:24;::::0;;;;;;36939:12:::1;::::0;-1:-1:-1;;;;;36939:12:0::1;36929:23:::0;;;;;;36868:24;;36842:23;36966:4:::1;::::0;36929:34:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;:41;;;;:::i;:::-;36999:15:::0;;36907:63;;-1:-1:-1;36985:29:0;::::1;:46:::0;::::1;;;;37019:12;37018:13;36985:46;36981:95;;;-1:-1:-1::0;37061:15:0;;36981:95:::1;37119:29:::0;;::::1;37159:155:::0;::::1;;;37198:12;37194:109;;;37243:15;37229:29;;37194:109;;;37296:7;;;;;37194:109;37348:4;37328:26;::::0;;;:11:::1;:26;::::0;;;;;;;37363:11:::1;::::0;-1:-1:-1;;;;;37363:11:0::1;37328:48:::0;;;;;;;;:62;-1:-1:-1;37324:145:0::1;;;37437:11;::::0;37405:64:::1;::::0;37422:4:::1;::::0;-1:-1:-1;;;;;37437:11:0::1;-1:-1:-1::0;;37405:8:0::1;:64::i;:::-;37547:13;::::0;37523:10:::1;:20:::0;37482:25:::1;::::0;37547:13:::1;::::0;;::::1;::::0;37511:32:::1;::::0;37547:13:::1;37523:20:::0;;::::1;;37511:11:::0;:32:::1;:::i;:::-;37510:50;;;;:::i;:::-;37482:78:::0;-1:-1:-1;37571:22:0::1;37596:31;37482:78:::0;37596:11;:31:::1;:::i;:::-;37571:56:::0;-1:-1:-1;37638:16:0::1;37657:21;37677:1;37657:17:::0;:21:::1;:::i;:::-;37638:40:::0;-1:-1:-1;37689:19:0::1;37711:28;37638:40:::0;37711:17;:28:::1;:::i;:::-;37689:50:::0;-1:-1:-1;37750:17:0::1;37770:28;37784:14:::0;37689:50;37770:28:::1;:::i;:::-;37750:48:::0;-1:-1:-1;37837:21:0::1;37869:27;37750:48:::0;37869:16:::1;:27::i;:::-;37907:14;37925:41;37949:17:::0;37925:21:::1;:41;:::i;:::-;37907:60:::0;-1:-1:-1;37978:14:0::1;38018:9:::0;37996:18:::1;38003:11:::0;37907:60;37996:18:::1;:::i;:::-;37995:32;;;;:::i;:::-;37978:49:::0;-1:-1:-1;38042:12:0;;38038:63:::1;;38070:31;38084:8;38094:6;38070:13;:31::i;:::-;38113:14;38174:2;38131:39;38153:17:::0;38131:21:::1;:39;:::i;:::-;38130:46;;;;:::i;:::-;38113:63;;38187:37;;;;;;;;;;;;;;-1:-1:-1::0;;;38187:37:0::1;;::::0;38217:6:::1;38187:18;:37::i;:::-;38238:21;38307:6:::0;38263:41:::1;38287:17:::0;38263:21:::1;:41;:::i;:::-;:50;;;;:::i;:::-;38238:76;;38325:36;38342:13;38356:4;38325:16;:36::i;:::-;36755:1614;;;;;;;;;;;;;20750:1;-1:-1:-1::0;;20762:27:0;:35;;-1:-1:-1;;20762:35:0;;;36671:1698::o;42566:1528::-;42666:14;;;;;;;42665:15;42657:24;;;;;;42692:14;:21;;-1:-1:-1;;42692:21:0;;;;;;;42799:5;42821:35;:20;42851:4;42821:29;:35::i;:::-;42817:389;;;-1:-1:-1;;;;;42881:20:0;;;;;;:14;:20;;;;;;;42916:24;;;42881:20;-1:-1:-1;42817:389:0;;;42982:17;43002:16;43013:4;43002:10;:16::i;:::-;-1:-1:-1;;;;;43086:15:0;;;;;;:9;:15;;;;;;43071:12;;42982:36;;-1:-1:-1;43071:30:0;;;:::i;:::-;-1:-1:-1;;;;;43045:23:0;;;;;;:17;:23;;;;;;;;:56;;;;43125:14;:20;;;;:30;;43146:9;;43125:30;:::i;:::-;-1:-1:-1;;;;;43170:20:0;;43193:1;43170:20;;;:14;:20;;;;;:24;43116:39;-1:-1:-1;;42817:389:0;43230:11;;:33;;;;-1:-1:-1;43245:18:0;;43230:33;43226:108;;;-1:-1:-1;;43279:14:0;:22;;-1:-1:-1;;43279:22:0;;;-1:-1:-1;;;;42566:1528:0:o;43226:108::-;43362:6;43346:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;43379:25:0;;;;;;:19;:25;;;;;:35;;43408:6;;43379:25;:35;;43408:6;;43379:35;:::i;:::-;;;;-1:-1:-1;43425:23:0;;-1:-1:-1;43435:13:0;43425:23;;:::i;:::-;43485:16;;;43499:1;43485:16;;;;;;;;43425:23;;-1:-1:-1;43461:21:0;;43485:16;;;;;;;;;;-1:-1:-1;;43522:11:0;;:18;;;-1:-1:-1;;;43522:18:0;;;;43461:40;;-1:-1:-1;;;;;;43522:11:0;;;;:16;;-1:-1:-1;43522:18:0;;;;;;;;;;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43512:4;43517:1;43512:7;;;;;;;;:::i;:::-;;;;;;:28;-1:-1:-1;;;;;43512:28:0;;;-1:-1:-1;;;;;43512:28:0;;;;;43561:5;43551:4;43556:1;43551:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43551:15:0;;;:7;;;;;;;;;:15;43583:11;;:162;;-1:-1:-1;;;43583:162:0;;:11;;;:62;;43653:6;;43583:162;;:11;;43691:4;;43710;;43729:15;;43583:162;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43579:287;;43849:5;43835:19;;43579:287;;;43788:4;43774:18;;43579:287;43890:11;43886:114;;43918:22;43927:4;43933:6;43918:8;:22::i;:::-;43970:11;;;;;;;;;-1:-1:-1;;;;;43970:11:0;-1:-1:-1;;;;;43970:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43955:33;;43886:114;44015:38;;;20733:25:1;;;-1:-1:-1;;;;;20832:15:1;;;20827:2;20812:18;;20805:43;20884:15;;20864:18;;;20857:43;44015:38:0;;;;;;;20721:2:1;44015:38:0;;;-1:-1:-1;;44064:14:0;:22;;-1:-1:-1;;44064:22:0;;;-1:-1:-1;;;;;42566:1528:0:o;45309:228::-;45370:7;45394:35;:20;45424:4;45394:29;:35::i;:::-;45390:82;;;-1:-1:-1;;;;;;45452:20:0;;;;;:14;:20;;;;;;;45309:228::o;45390:82::-;-1:-1:-1;;;;;45509:20:0;;;;;;:14;:20;;;;;;45490:16;45524:4;45490:10;:16::i;:::-;:39;;;;:::i;12882:291::-;12945:4;13875:19;;;:12;;;:19;;;;;;12962:204;;-1:-1:-1;13005:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;13065:18;;13043:19;;;:12;;;:19;;;;;;:40;;;;13098:11;;12962:204;-1:-1:-1;13149:5:0;13142:12;;13181:589;13247:4;13285:19;;;:12;;;:19;;;;;;13319:15;;13315:448;;13351:21;13375:14;13388:1;13375:10;:14;:::i;:::-;13424:18;;13351:38;;-1:-1:-1;13404:17:0;;13424:22;;13445:1;;13424:22;:::i;:::-;13404:42;;13461:17;13481:3;:11;;13493:9;13481:22;;;;;;;;:::i;:::-;;;;;;;;;13461:42;;13547:9;13518:3;:11;;13530:13;13518:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;13571:23;;;:12;;;:23;;;;;;:36;;;13622:17;;13571:3;;13622:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13661:3;:12;;:19;13674:5;13661:19;;;;;;;;;;;13654:26;;;13702:4;13695:11;;;;;;;;13315:448;13746:5;13739:12;;;;;35644:343;-1:-1:-1;;;;;35763:17:0;;35739:21;35763:17;;;:9;:17;;;;;;35799:23;;;;35791:60;;;;-1:-1:-1;;;35791:60:0;;21245:2:1;35791:60:0;;;21227:21:1;21284:2;21264:18;;;21257:30;-1:-1:-1;;;21303:18:1;;;21296:54;21367:18;;35791:60:0;21043:348:1;35791:60:0;35862:27;35875:6;35882;35862:12;:27::i;:::-;35900:28;35910:9;35921:6;35900:9;:28::i;:::-;35961:9;-1:-1:-1;;;;;35944:35:0;35953:6;-1:-1:-1;;;;;35944:35:0;;35972:6;35944:35;;;;1997:25:1;;1985:2;1970:18;;1851:177;35944:35:0;;;;;;;;35728:259;35644:343;;;:::o;42301:257::-;42376:14;;;;;;;42375:15;42367:51;;;;-1:-1:-1;;;42367:51:0;;21598:2:1;42367:51:0;;;21580:21:1;21637:2;21617:18;;;21610:30;21676:25;21656:18;;;21649:53;21719:18;;42367:51:0;21396:347:1;42367:51:0;42445:12;;-1:-1:-1;;;;;42445:12:0;;;42433:24;;;;42429:122;;42491:12;42474:14;:29;42518:14;:21;;-1:-1:-1;;42518:21:0;;;;;42429:122;42301:257;:::o;38830:2304::-;-1:-1:-1;;;;;38973:20:0;;;38946:24;38973:20;;;:9;:20;;;;;;;39028:17;;;;;;;;39064:23;;;;39056:60;;;;-1:-1:-1;;;39056:60:0;;21245:2:1;39056:60:0;;;21227:21:1;21284:2;21264:18;;;21257:30;-1:-1:-1;;;21303:18:1;;;21296:54;21367:18;;39056:60:0;21043:348:1;39056:60:0;39129:9;39153:6;39149:1450;;;39180:16;;;;;;;39176:124;;;-1:-1:-1;;;;;39226:21:0;;;;;;:13;:21;;;;;;;;39225:22;39217:51;;;;-1:-1:-1;;;39217:51:0;;21950:2:1;39217:51:0;;;21932:21:1;21989:2;21969:18;;;21962:30;-1:-1:-1;;;22008:18:1;;;22001:46;22064:18;;39217:51:0;21748:340:1;39217:51:0;39340:15;;39330:25;;;39322:61;;;;-1:-1:-1;;;39322:61:0;;22295:2:1;39322:61:0;;;22277:21:1;22334:2;22314:18;;;22307:30;22373:25;22353:18;;;22346:53;22416:18;;39322:61:0;22093:347:1;39322:61:0;-1:-1:-1;39404:9:0;:17;;;;;;39149:1450;;;39445:5;39441:1158;;;39471:14;;:18;39467:221;;39527:14;;18933:1;;39514:27;;:12;:27;:::i;:::-;:46;39510:163;;;-1:-1:-1;;;;;39585:24:0;;;;;;:13;:24;;;;;:31;;-1:-1:-1;;39585:31:0;39612:4;39585:31;;;39639:11;:14;;39585:31;39639:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;39510:163;39708:15;;;;;;;39704:157;;;-1:-1:-1;;;;;39752:21:0;;;;;;:10;:21;;;;;;39777:12;39752:37;;39744:46;;;;;;-1:-1:-1;;;;;39809:21:0;;;;;;:10;:21;;;;;39833:12;39809:36;;39704:157;39919:7;:17;39892:23;39909:6;39892:16;:23;:::i;:::-;:44;;39884:86;;;;-1:-1:-1;;;39884:86:0;;22827:2:1;39884:86:0;;;22809:21:1;22866:2;22846:18;;;22839:30;22905:31;22885:18;;;22878:59;22954:18;;39884:86:0;22625:353:1;39884:86:0;40003:14;;39993:24;;;39985:58;;;;-1:-1:-1;;;39985:58:0;;23185:2:1;39985:58:0;;;23167:21:1;23224:2;23204:18;;;23197:30;-1:-1:-1;;;23243:18:1;;;23236:51;23304:18;;39985:58:0;22983:345:1;39985:58:0;-1:-1:-1;40064:9:0;:16;;;39441:1158;;;40119:16;;;;;;;40115:124;;;-1:-1:-1;;;;;40165:21:0;;;;;;:13;:21;;;;;;;;40164:22;40156:51;;;;-1:-1:-1;;;40156:51:0;;21950:2:1;40156:51:0;;;21932:21:1;21989:2;21969:18;;;21962:30;-1:-1:-1;;;22008:18:1;;;22001:46;22064:18;;40156:51:0;21748:340:1;40156:51:0;40269:20;17257:2;40269;:20;:::i;:::-;40259:6;:30;40255:187;;40386:11;;40363:38;;40374:10;;-1:-1:-1;;;40386:11:0;;-1:-1:-1;;;;;40386:11:0;40399:1;40363:10;:38::i;:::-;40420:7;;;;;40255:187;40495:7;:17;40466:25;40485:6;40466:16;:25;:::i;:::-;:46;;40458:75;;;;-1:-1:-1;;;40458:75:0;;23535:2:1;40458:75:0;;;23517:21:1;23574:2;23554:18;;;23547:30;-1:-1:-1;;;23593:18:1;;;23586:46;23649:18;;40458:75:0;23333:340:1;40458:75:0;-1:-1:-1;40566:9:0;:21;;;;;;39441:1158;40630:12;;-1:-1:-1;;;;;40620:22:0;;;40630:12;;40620:22;;;;40619:41;;-1:-1:-1;40649:10:0;;-1:-1:-1;;;40649:10:0;;;;40648:11;40619:41;:75;;;;-1:-1:-1;40666:27:0;;;;40665:28;40619:75;:85;;;;;40698:6;40619:85;40615:143;;;40738:13;;40719:39;;40738:13;;;;;40752:5;40719:18;:39::i;:::-;40771:19;40806:7;;;;40803:77;;40855:3;40840:12;;;;:6;:12;:::i;:::-;:18;;;;:::i;:::-;40826:32;;40803:77;40892:21;40916:20;40925:11;40916:6;:20;:::i;:::-;40892:44;;40947:27;40960:6;40967;40947:12;:27::i;:::-;40985:37;41003:4;41010:11;40985:9;:37::i;:::-;41033:35;41043:9;41054:13;41033:9;:35::i;:::-;41101:9;-1:-1:-1;;;;;41084:42:0;41093:6;-1:-1:-1;;;;;41084:42:0;;41112:13;41084:42;;;;1997:25:1;;1985:2;1970:18;;1851:177;41084:42:0;;;;;;;;38935:2199;;;;;38830:2304;;;;;;:::o;45903:313::-;-1:-1:-1;;;;;46021:17:0;;45961:7;46021:17;;;:9;:17;;;;;;46006:12;;45961:7;;46006:32;;;:::i;:::-;-1:-1:-1;;;;;46070:25:0;;;;;;:17;:25;;;;;;45985:53;;-1:-1:-1;46057:38:0;;46053:70;;;-1:-1:-1;46122:1:0;;45903:313;-1:-1:-1;;45903:313:0:o;46053:70::-;-1:-1:-1;;;;;46157:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;33697:5:0;46146:36;;:10;:36;:::i;:::-;46145:59;;;;:::i;38377:444::-;38470:11;;38438:53;;38455:4;;-1:-1:-1;;;;;38470:11:0;38484:6;38438:8;:53::i;:::-;38526:16;;;38540:1;38526:16;;;;;;;;38502:21;;38526:16;;;;;;;;;;-1:-1:-1;38526:16:0;38502:40;;38571:4;38553;38558:1;38553:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38553:23:0;;;:7;;;;;;;;;;:23;;;;38597:11;;:18;;;-1:-1:-1;;;38597:18:0;;;;:11;;;;;:16;;:18;;;;;38553:7;;38597:18;;;;;:11;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38587:4;38592:1;38587:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38587:28:0;;;:7;;;;;;;;;:28;38626:11;;:187;;-1:-1:-1;;;38626:187:0;;:11;;;:62;;:187;;38703:6;;38626:11;;38740:4;;38767;;38787:15;;38626:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38427:394;38377:444;:::o;33954:367::-;34068:11;;34036:58;;34053:4;;-1:-1:-1;;;;;34068:11:0;34082;34036:8;:58::i;:::-;34113:11;;:200;;-1:-1:-1;;;34113:200:0;;-1:-1:-1;;;;;34113:11:0;;;;:27;;34148:9;;34113:200;;34181:4;;34201:11;;34113;;;;34181:4;;34287:15;;34113:200;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9179:468::-;9296:6;9271:21;:31;;9263:73;;;;-1:-1:-1;;;9263:73:0;;24778:2:1;9263:73:0;;;24760:21:1;24817:2;24797:18;;;24790:30;24856:31;24836:18;;;24829:59;24905:18;;9263:73:0;24576:353:1;9263:73:0;9365:30;;8672:66;;9365:30;;9382:12;;9365:30;;;:::i;:::-;;;;;;;;;;;;;9355:41;;;;;;:58;9347:98;;;;-1:-1:-1;;;9347:98:0;;25417:2:1;9347:98:0;;;25399:21:1;25456:2;25436:18;;;25429:30;25495:29;25475:18;;;25468:57;25542:18;;9347:98:0;25215:351:1;9347:98:0;9485:51;;9467:12;;8576:48;;9524:6;;9467:12;9485:51;9467:12;9485:51;9524:6;8576:48;9485:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9466:70;;;9555:7;9547:78;;;;-1:-1:-1;;;9547:78:0;;25773:2:1;9547:78:0;;;25755:21:1;25812:2;25792:18;;;25785:30;25851:34;25831:18;;;25824:62;25922:28;25902:18;;;25895:56;25968:19;;9547:78:0;25571:422:1;34811:825:0;34958:15;;34934:10;:20;34898:22;;34958:15;;;;;;;;34924:30;;34934:20;;;;;34924:9;:30;:::i;:::-;34923:50;;;;:::i;:::-;35032:15;;35014:10;:14;34898:75;;-1:-1:-1;34984:16:0;;35032:15;;;;;;;;35004:24;;35014:14;35004:9;:24;:::i;:::-;35003:44;;;;:::i;:::-;35115:15;;35093:10;:18;34984:63;;-1:-1:-1;35059:20:0;;35115:15;;;;;;;;35083:28;;35093:18;;;;35083:9;:28;:::i;:::-;35082:48;;;;:::i;:::-;35150:20;;35059:71;;-1:-1:-1;35141:46:0;;-1:-1:-1;;;;;35150:20:0;35172:14;35141:8;:46::i;:::-;35207:10;:14;35198:34;;-1:-1:-1;;;;;35207:14:0;35223:8;35198;:34::i;:::-;35247:16;;35243:386;;35284:16;35280:67;;;35335:12;35319;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;35280:67:0;35362:19;35384:16;:14;:16::i;:::-;35362:38;;35419:11;35434:1;35419:16;35415:203;;35463:20;;35454:44;;-1:-1:-1;;;;;35463:20:0;35485:12;35454:8;:44::i;:::-;35415:203;;;35590:11;35555:31;-1:-1:-1;;;35555:12:0;:31;:::i;:::-;35554:47;;;;:::i;:::-;35537:12;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;;35265:364:0;34887:749;;;34811:825;;:::o;36000:478::-;-1:-1:-1;;;;;36091:15:0;;36071:17;36091:15;;;:9;:15;;;;;;:24;;36109:6;;36091:24;:::i;:::-;36071:44;-1:-1:-1;36140:35:0;:20;36170:4;36140:29;:35::i;:::-;36136:116;;;-1:-1:-1;;;;;36192:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;36000:478:0:o;36136:116::-;36278:6;36262:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;36295:15:0;;-1:-1:-1;36313:16:0;36324:4;36313:10;:16::i;:::-;-1:-1:-1;;;;;36340:15:0;;;;;;:9;:15;;;;;:27;;;36404:12;;36295:34;;-1:-1:-1;36404:24:0;;36358:9;;36404:24;:::i;:::-;-1:-1:-1;;;;;36378:23:0;;;;;;:17;:23;;;;;;;;:50;;;;36439:14;:20;;;;;:31;;36463:7;;36378:23;36439:31;;36463:7;;36439:31;:::i;:::-;;;;-1:-1:-1;;;;;;36000:478:0:o;34330:473::-;-1:-1:-1;;;;;34418:15:0;;34398:17;34418:15;;;:9;:15;;;;;;:24;;34436:6;;34418:24;:::i;:::-;34398:44;-1:-1:-1;34467:35:0;:20;34497:4;34467:29;:35::i;:::-;34463:114;;;-1:-1:-1;;;;;34518:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;34330:473:0:o;34463:114::-;34603:6;34587:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;34620:15:0;;-1:-1:-1;34638:16:0;34649:4;34638:10;:16::i;:::-;34620:34;;34706:9;34691:12;;:24;;;;:::i;:::-;-1:-1:-1;;;;;34665:23:0;;;;;;:17;:23;;;;;;;;:50;;;;34726:14;:20;;;;;:31;;34750:7;;34665:23;34726:31;;34750:7;;34726:31;:::i;:::-;;;;-1:-1:-1;;;;;;;;34768:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;34330:473:0:o;45549:110::-;45597:7;17185:18;17257:2;17185;:18;:::i;:::-;17171:32;;:11;:32;:::i;:::-;45624:12;;:27;;;;:::i;552:258:1:-;624:1;634:113;648:6;645:1;642:13;634:113;;;724:11;;;718:18;705:11;;;698:39;670:2;663:10;634:113;;;765:6;762:1;759:13;756:48;;;800:1;791:6;786:3;782:16;775:27;756:48;;552:258;;;:::o;815:383::-;964:2;953:9;946:21;927:4;996:6;990:13;1039:6;1034:2;1023:9;1019:18;1012:34;1055:66;1114:6;1109:2;1098:9;1094:18;1089:2;1081:6;1077:15;1055:66;:::i;:::-;1182:2;1161:15;-1:-1:-1;;1157:29:1;1142:45;;;;1189:2;1138:54;;815:383;-1:-1:-1;;815:383:1:o;1203:131::-;-1:-1:-1;;;;;1278:31:1;;1268:42;;1258:70;;1324:1;1321;1314:12;1339:315;1407:6;1415;1468:2;1456:9;1447:7;1443:23;1439:32;1436:52;;;1484:1;1481;1474:12;1436:52;1523:9;1510:23;1542:31;1567:5;1542:31;:::i;:::-;1592:5;1644:2;1629:18;;;;1616:32;;-1:-1:-1;;;1339:315:1:o;2033:159::-;2100:20;;2160:6;2149:18;;2139:29;;2129:57;;2182:1;2179;2172:12;2129:57;2033:159;;;:::o;2197:184::-;2255:6;2308:2;2296:9;2287:7;2283:23;2279:32;2276:52;;;2324:1;2321;2314:12;2276:52;2347:28;2365:9;2347:28;:::i;2594:255::-;2661:6;2714:2;2702:9;2693:7;2689:23;2685:32;2682:52;;;2730:1;2727;2720:12;2682:52;2769:9;2756:23;2788:31;2813:5;2788:31;:::i;2854:456::-;2931:6;2939;2947;3000:2;2988:9;2979:7;2975:23;2971:32;2968:52;;;3016:1;3013;3006:12;2968:52;3055:9;3042:23;3074:31;3099:5;3074:31;:::i;:::-;3124:5;-1:-1:-1;3181:2:1;3166:18;;3153:32;3194:33;3153:32;3194:33;:::i;:::-;2854:456;;3246:7;;-1:-1:-1;;;3300:2:1;3285:18;;;;3272:32;;2854:456::o;3315:118::-;3401:5;3394:13;3387:21;3380:5;3377:32;3367:60;;3423:1;3420;3413:12;3438:241;3494:6;3547:2;3535:9;3526:7;3522:23;3518:32;3515:52;;;3563:1;3560;3553:12;3515:52;3602:9;3589:23;3621:28;3643:5;3621:28;:::i;4125:180::-;4184:6;4237:2;4225:9;4216:7;4212:23;4208:32;4205:52;;;4253:1;4250;4243:12;4205:52;-1:-1:-1;4276:23:1;;4125:180;-1:-1:-1;4125:180:1:o;4310:382::-;4375:6;4383;4436:2;4424:9;4415:7;4411:23;4407:32;4404:52;;;4452:1;4449;4442:12;4404:52;4491:9;4478:23;4510:31;4535:5;4510:31;:::i;:::-;4560:5;-1:-1:-1;4617:2:1;4602:18;;4589:32;4630:30;4589:32;4630:30;:::i;:::-;4679:7;4669:17;;;4310:382;;;;;:::o;4697:401::-;4779:6;4787;4795;4803;4856:3;4844:9;4835:7;4831:23;4827:33;4824:53;;;4873:1;4870;4863:12;4824:53;4896:28;4914:9;4896:28;:::i;:::-;4886:38;;4943:37;4976:2;4965:9;4961:18;4943:37;:::i;:::-;4933:47;;4999:37;5032:2;5021:9;5017:18;4999:37;:::i;:::-;4989:47;;5055:37;5088:2;5077:9;5073:18;5055:37;:::i;:::-;5045:47;;4697:401;;;;;;;:::o;5103:156::-;5169:20;;5229:4;5218:16;;5208:27;;5198:55;;5249:1;5246;5239:12;5264:393;5342:6;5350;5358;5366;5419:3;5407:9;5398:7;5394:23;5390:33;5387:53;;;5436:1;5433;5426:12;5387:53;5459:27;5476:9;5459:27;:::i;:::-;5449:37;;5505:36;5537:2;5526:9;5522:18;5505:36;:::i;:::-;5495:46;;5560:36;5592:2;5581:9;5577:18;5560:36;:::i;:::-;5550:46;;5615:36;5647:2;5636:9;5632:18;5615:36;:::i;5662:313::-;5726:6;5734;5787:2;5775:9;5766:7;5762:23;5758:32;5755:52;;;5803:1;5800;5793:12;5755:52;5826:28;5844:9;5826:28;:::i;6613:322::-;6684:6;6692;6700;6753:2;6741:9;6732:7;6728:23;6724:32;6721:52;;;6769:1;6766;6759:12;6721:52;6792:27;6809:9;6792:27;:::i;:::-;6782:37;;6838:36;6870:2;6859:9;6855:18;6838:36;:::i;:::-;6828:46;;6893:36;6925:2;6914:9;6910:18;6893:36;:::i;:::-;6883:46;;6613:322;;;;;:::o;7364:388::-;7432:6;7440;7493:2;7481:9;7472:7;7468:23;7464:32;7461:52;;;7509:1;7506;7499:12;7461:52;7548:9;7535:23;7567:31;7592:5;7567:31;:::i;:::-;7617:5;-1:-1:-1;7674:2:1;7659:18;;7646:32;7687:33;7646:32;7687:33;:::i;8708:344::-;8910:2;8892:21;;;8949:2;8929:18;;;8922:30;-1:-1:-1;;;8983:2:1;8968:18;;8961:50;9043:2;9028:18;;8708:344::o;9057:340::-;9259:2;9241:21;;;9298:2;9278:18;;;9271:30;-1:-1:-1;;;9332:2:1;9317:18;;9310:46;9388:2;9373:18;;9057:340::o;9402:127::-;9463:10;9458:3;9454:20;9451:1;9444:31;9494:4;9491:1;9484:15;9518:4;9515:1;9508:15;9534:422;9623:1;9666:5;9623:1;9680:270;9701:7;9691:8;9688:21;9680:270;;;9760:4;9756:1;9752:6;9748:17;9742:4;9739:27;9736:53;;;9769:18;;:::i;:::-;9819:7;9809:8;9805:22;9802:55;;;9839:16;;;;9802:55;9918:22;;;;9878:15;;;;9680:270;;;9684:3;9534:422;;;;;:::o;9961:806::-;10010:5;10040:8;10030:80;;-1:-1:-1;10081:1:1;10095:5;;10030:80;10129:4;10119:76;;-1:-1:-1;10166:1:1;10180:5;;10119:76;10211:4;10229:1;10224:59;;;;10297:1;10292:130;;;;10204:218;;10224:59;10254:1;10245:10;;10268:5;;;10292:130;10329:3;10319:8;10316:17;10313:43;;;10336:18;;:::i;:::-;-1:-1:-1;;10392:1:1;10378:16;;10407:5;;10204:218;;10506:2;10496:8;10493:16;10487:3;10481:4;10478:13;10474:36;10468:2;10458:8;10455:16;10450:2;10444:4;10441:12;10437:35;10434:77;10431:159;;;-1:-1:-1;10543:19:1;;;10575:5;;10431:159;10622:34;10647:8;10641:4;10622:34;:::i;:::-;10692:6;10688:1;10684:6;10680:19;10671:7;10668:32;10665:58;;;10703:18;;:::i;:::-;10741:20;;9961:806;-1:-1:-1;;;9961:806:1:o;10772:140::-;10830:5;10859:47;10900:4;10890:8;10886:19;10880:4;10859:47;:::i;10917:168::-;10957:7;11023:1;11019;11015:6;11011:14;11008:1;11005:21;11000:1;10993:9;10986:17;10982:45;10979:71;;;11030:18;;:::i;:::-;-1:-1:-1;11070:9:1;;10917:168::o;11090:345::-;11292:2;11274:21;;;11331:2;11311:18;;;11304:30;-1:-1:-1;;;11365:2:1;11350:18;;11343:51;11426:2;11411:18;;11090:345::o;12766:125::-;12806:4;12834:1;12831;12828:8;12825:34;;;12839:18;;:::i;:::-;-1:-1:-1;12876:9:1;;12766:125::o;12896:128::-;12936:3;12967:1;12963:6;12960:1;12957:13;12954:39;;;12973:18;;:::i;:::-;-1:-1:-1;13009:9:1;;12896:128::o;13434:184::-;13504:6;13557:2;13545:9;13536:7;13532:23;13528:32;13525:52;;;13573:1;13570;13563:12;13525:52;-1:-1:-1;13596:16:1;;13434:184;-1:-1:-1;13434:184:1:o;13902:245::-;13969:6;14022:2;14010:9;14001:7;13997:23;13993:32;13990:52;;;14038:1;14035;14028:12;13990:52;14070:9;14064:16;14089:28;14111:5;14089:28;:::i;14152:607::-;-1:-1:-1;;;;;14511:15:1;;;14493:34;;14558:2;14543:18;;14536:34;;;;14601:2;14586:18;;14579:34;;;;14644:2;14629:18;;14622:34;;;;14693:15;;;14687:3;14672:19;;14665:44;14473:3;14725:19;;14718:35;;;;14442:3;14427:19;;14152:607::o;15053:217::-;15093:1;15119;15109:132;;15163:10;15158:3;15154:20;15151:1;15144:31;15198:4;15195:1;15188:15;15226:4;15223:1;15216:15;15109:132;-1:-1:-1;15255:9:1;;15053:217::o;15636:204::-;15674:3;15710:4;15707:1;15703:12;15742:4;15739:1;15735:12;15777:3;15771:4;15767:14;15762:3;15759:23;15756:49;;;15785:18;;:::i;:::-;15821:13;;15636:204;-1:-1:-1;;;15636:204:1:o;15845:195::-;15883:4;15920;15917:1;15913:12;15952:4;15949:1;15945:12;15977:3;15972;15969:12;15966:38;;;15984:18;;:::i;:::-;16021:13;;;15845:195;-1:-1:-1;;;15845:195:1:o;19162:251::-;19232:6;19285:2;19273:9;19264:7;19260:23;19256:32;19253:52;;;19301:1;19298;19291:12;19253:52;19333:9;19327:16;19352:31;19377:5;19352:31;:::i;19418:127::-;19479:10;19474:3;19470:20;19467:1;19460:31;19510:4;19507:1;19500:15;19534:4;19531:1;19524:15;19550:461;19603:3;19641:5;19635:12;19668:6;19663:3;19656:19;19694:4;19723:2;19718:3;19714:12;19707:19;;19760:2;19753:5;19749:14;19781:1;19791:195;19805:6;19802:1;19799:13;19791:195;;;19870:13;;-1:-1:-1;;;;;19866:39:1;19854:52;;19926:12;;;;19961:15;;;;19902:1;19820:9;19791:195;;;-1:-1:-1;20002:3:1;;19550:461;-1:-1:-1;;;;;19550:461:1:o;20016:510::-;20287:6;20276:9;20269:25;20330:3;20325:2;20314:9;20310:18;20303:31;20250:4;20351:57;20403:3;20392:9;20388:19;20380:6;20351:57;:::i;:::-;-1:-1:-1;;;;;20444:32:1;;;;20439:2;20424:18;;20417:60;-1:-1:-1;20508:2:1;20493:18;20486:34;20343:65;20016:510;-1:-1:-1;;20016:510:1:o;20911:127::-;20972:10;20967:3;20963:20;20960:1;20953:31;21003:4;21000:1;20993:15;21027:4;21024:1;21017:15;22445:175;22482:3;22526:4;22519:5;22515:16;22555:4;22546:7;22543:17;22540:43;;22563:18;;:::i;:::-;22612:1;22599:15;;22445:175;-1:-1:-1;;22445:175:1:o;23678:582::-;23977:6;23966:9;23959:25;24020:6;24015:2;24004:9;24000:18;23993:34;24063:3;24058:2;24047:9;24043:18;24036:31;23940:4;24084:57;24136:3;24125:9;24121:19;24113:6;24084:57;:::i;:::-;-1:-1:-1;;;;;24177:32:1;;;;24172:2;24157:18;;24150:60;-1:-1:-1;24241:3:1;24226:19;24219:35;24076:65;23678:582;-1:-1:-1;;;23678:582:1:o;24265:306::-;24353:6;24361;24369;24422:2;24410:9;24401:7;24397:23;24393:32;24390:52;;;24438:1;24435;24428:12;24390:52;24467:9;24461:16;24451:26;;24517:2;24506:9;24502:18;24496:25;24486:35;;24561:2;24550:9;24546:18;24540:25;24530:35;;24265:306;;;;;:::o;24934:276::-;25065:3;25103:6;25097:13;25119:53;25165:6;25160:3;25153:4;25145:6;25141:17;25119:53;:::i;:::-;25188:16;;;;;24934:276;-1:-1:-1;;24934:276:1:o

Swarm Source

ipfs://adf738fa0d882aee152ddc7e072228a0b74dcc02c06ea4bada7b8895b6f7aa84

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.