ETH Price: $3,401.22 (+2.00%)

Contract

0xE683d3BDa5AE110497aAe63f2561694A4374F2aE
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve215069752024-12-29 8:36:473 hrs ago1735461407IN
0xE683d3BD...A4374F2aE
0 ETH0.000190024.0816473
Approve215069352024-12-29 8:28:473 hrs ago1735460927IN
0xE683d3BD...A4374F2aE
0 ETH0.000172473.69907957
Transfer214345582024-12-19 5:43:5910 days ago1734587039IN
0xE683d3BD...A4374F2aE
0 ETH0.0018469110.86511506
Approve214223692024-12-17 12:50:4711 days ago1734439847IN
0xE683d3BD...A4374F2aE
0 ETH0.0005662812.15434892
Approve214151672024-12-16 12:46:1112 days ago1734353171IN
0xE683d3BD...A4374F2aE
0 ETH0.000631713.62530132
Approve214150392024-12-16 12:20:2312 days ago1734351623IN
0xE683d3BD...A4374F2aE
0 ETH0.000602913.00400933
Approve214092642024-12-15 16:59:2313 days ago1734281963IN
0xE683d3BD...A4374F2aE
0 ETH0.0005311111.40826305
Approve214059962024-12-15 6:01:2314 days ago1734242483IN
0xE683d3BD...A4374F2aE
0 ETH0.000391578.4089094
Approve213963272024-12-13 21:38:2315 days ago1734125903IN
0xE683d3BD...A4374F2aE
0 ETH0.0006407113.74120424
Approve213847982024-12-12 7:01:3517 days ago1733986895IN
0xE683d3BD...A4374F2aE
0 ETH0.0007166415.38949524
Transfer213464842024-12-06 22:37:3522 days ago1733524655IN
0xE683d3BD...A4374F2aE
0 ETH0.0024022717.49988877
Transfer213464752024-12-06 22:35:4722 days ago1733524547IN
0xE683d3BD...A4374F2aE
0 ETH0.0025198318.35621609
Transfer213464392024-12-06 22:28:2322 days ago1733524103IN
0xE683d3BD...A4374F2aE
0 ETH0.0025417518.51590918
Approve213214882024-12-03 10:49:4726 days ago1733222987IN
0xE683d3BD...A4374F2aE
0 ETH0.0009208819.74995376
Approve213182682024-12-03 0:01:5926 days ago1733184119IN
0xE683d3BD...A4374F2aE
0 ETH0.0012245326.2623007
Approve212574922024-11-24 12:05:5934 days ago1732449959IN
0xE683d3BD...A4374F2aE
0 ETH0.0005073410.89502377
Transfer212068922024-11-17 10:40:5942 days ago1731840059IN
0xE683d3BD...A4374F2aE
0 ETH0.001410379.22718119
Transfer211881702024-11-14 19:58:2344 days ago1731614303IN
0xE683d3BD...A4374F2aE
0 ETH0.0042175524.81818916
Approve211880272024-11-14 19:29:4744 days ago1731612587IN
0xE683d3BD...A4374F2aE
0 ETH0.001292527.87802489
Approve211684902024-11-12 2:01:4747 days ago1731376907IN
0xE683d3BD...A4374F2aE
0 ETH0.0012748627.37704482
Transfer211658312024-11-11 17:07:4747 days ago1731344867IN
0xE683d3BD...A4374F2aE
0 ETH0.0089140264.93032877
Update Treasury ...211628622024-11-11 7:11:1148 days ago1731309071IN
0xE683d3BD...A4374F2aE
0 ETH0.0004054312.49186933
Update Marketing...211628502024-11-11 7:08:4748 days ago1731308927IN
0xE683d3BD...A4374F2aE
0 ETH0.0004121612.69087705
Update Treasury ...211628172024-11-11 7:02:1148 days ago1731308531IN
0xE683d3BD...A4374F2aE
0 ETH0.0004421213.63223527
Update Marketing...211627752024-11-11 6:53:4748 days ago1731308027IN
0xE683d3BD...A4374F2aE
0 ETH0.000432813.3363379
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
214206002024-12-17 6:55:4712 days ago1734418547
0xE683d3BD...A4374F2aE
0.22034666 ETH
214206002024-12-17 6:55:4712 days ago1734418547
0xE683d3BD...A4374F2aE
0.22034666 ETH
214206002024-12-17 6:55:4712 days ago1734418547
0xE683d3BD...A4374F2aE
0.44069333 ETH
214205882024-12-17 6:53:2312 days ago1734418403
0xE683d3BD...A4374F2aE
0.07980021 ETH
214205882024-12-17 6:53:2312 days ago1734418403
0xE683d3BD...A4374F2aE
0.07980021 ETH
214205882024-12-17 6:53:2312 days ago1734418403
0xE683d3BD...A4374F2aE
0.15960042 ETH
214205882024-12-17 6:53:2312 days ago1734418403
0xE683d3BD...A4374F2aE
0.04509274 ETH
214205882024-12-17 6:53:2312 days ago1734418403
0xE683d3BD...A4374F2aE
0.04509274 ETH
214205882024-12-17 6:53:2312 days ago1734418403
0xE683d3BD...A4374F2aE
0.09018548 ETH
214151672024-12-16 12:46:1112 days ago1734353171
0xE683d3BD...A4374F2aE
0.02737805 ETH
214151672024-12-16 12:46:1112 days ago1734353171
0xE683d3BD...A4374F2aE
0.02736772 ETH
214151672024-12-16 12:46:1112 days ago1734353171
0xE683d3BD...A4374F2aE
0.05474578 ETH
207215012024-09-10 16:48:35109 days ago1725986915
0xE683d3BD...A4374F2aE
0.03017255 ETH
207215012024-09-10 16:48:35109 days ago1725986915
0xE683d3BD...A4374F2aE
0.03017255 ETH
207215012024-09-10 16:48:35109 days ago1725986915
0xE683d3BD...A4374F2aE
0.0603451 ETH
207084442024-09-08 21:01:59111 days ago1725829319
0xE683d3BD...A4374F2aE
0.03235123 ETH
207084442024-09-08 21:01:59111 days ago1725829319
0xE683d3BD...A4374F2aE
0.03235123 ETH
207084442024-09-08 21:01:59111 days ago1725829319
0xE683d3BD...A4374F2aE
0.06470247 ETH
206845912024-09-05 13:09:35114 days ago1725541775
0xE683d3BD...A4374F2aE
0.03275184 ETH
206845912024-09-05 13:09:35114 days ago1725541775
0xE683d3BD...A4374F2aE
0.03275184 ETH
206845912024-09-05 13:09:35114 days ago1725541775
0xE683d3BD...A4374F2aE
0.06550368 ETH
206830942024-09-05 8:08:47115 days ago1725523727
0xE683d3BD...A4374F2aE
0.05236712 ETH
206830942024-09-05 8:08:47115 days ago1725523727
0xE683d3BD...A4374F2aE
0.05236712 ETH
206830942024-09-05 8:08:47115 days ago1725523727
0xE683d3BD...A4374F2aE
0.10473425 ETH
206813372024-09-05 2:15:11115 days ago1725502511
0xE683d3BD...A4374F2aE
0.02822689 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UltimateToken

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-08-29
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

library Address {
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }
    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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }
    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

pragma solidity ^0.8.0;

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, 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 from, address to, uint256 amount) external returns (bool);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() {
        _transferOwnership(_msgSender());
    }
    modifier onlyOwner() {
        _checkOwner();
        _;
    }
    function owner() public view virtual returns (address) {
        return _owner;
    }
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IERC20Permit {
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library SafeERC20 {
    using Address for address;
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
    }
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
        }
    }
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
            _callOptionalReturn(token, approvalCall);
        }
    }
    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

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

    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return
            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
    }
}

pragma solidity >=0.5.0;

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}
pragma solidity 0.8.19;

interface IUniswapV2Caller {
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        address router,
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        uint256 deadline
    ) external;
}
interface IFee {
    function payFee(
        uint256 _tokenType,
        address creator,
        bool isAntibot,
        address referrer
    ) external payable;
}
contract UltimateToken is IERC20, Ownable {
    using SafeERC20 for IERC20;
    struct Args {
        string name;
        string symbol;
        uint8 decimals;
        uint256 totalSupply;
        uint256 maxWallet;
        uint256 maxTransactionAmount;
        address marketingWallet;
        address mainRouter;
        address baseTokenForMarket; 
        address treasuryWallet;       
        bool isMarketingFeeBaseToken;
        uint24 sellLiquidityFee;
        uint24 buyLiquidityFee;
        uint24 sellMarketingFee;
        uint24 buyMarketingFee;
        uint24 sellTreasuryFee;
        uint24 buyTreasuryFee;
        uint24 sellRewardFee;
        uint24 buyRewardFee;
        uint24 sellBurnFee;
        uint24 buyBurnFee;
        address feeContract;
        address uniswapV2Caller;
    }
    IUniswapV2Caller public uniswapV2Caller;
    address public baseTokenForMarket;
    uint8 private _decimals;
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcluded;
    address[] private _excluded;
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tRwardFeeTotal;
    string private _name;
    string private _symbol;

    uint256 private _rewardFee;
    uint256 private _previousRewardFee;

    uint256 private _liquidityFee;
    uint256 private _previousLiquidityFee;

    uint256 private _marketingFee;
    uint256 private _previousMarketingFee;

    uint256 private _treasuryFee;
    uint256 private _previousTreasuryFee;

    uint256 private _burnFee;
    uint256 private _previousBurnFee;

    bool private inSwapAndLiquify;
    uint24 public sellRewardFee;
    uint24 public buyRewardFee;
    uint24 public sellLiquidityFee;
    uint24 public buyLiquidityFee;

    uint24 public sellMarketingFee;
    uint24 public buyMarketingFee;

    uint24 public sellTreasuryFee;
    uint24 public buyTreasuryFee;

    uint24 public sellBurnFee;
    uint24 public buyBurnFee;

    address public marketingWallet;
    bool public isMarketingFeeBaseToken;
    address public treasuryWallet;



    uint256 public minAmountToTakeFee;
    uint256 public maxWallet;
    uint256 public maxTransactionAmount;


    IUniswapV2Router02 public mainRouter;
    address public mainPair;

    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public isExcludedFromMaxTransactionAmount;
    mapping(address => bool) public automatedMarketMakerPairs;

    uint256 private _liquidityFeeTokens;
    uint256 private _marketingFeeTokens;
    uint256 private _treasuryFeeTokens;

    event UpdateLiquidityFee(
        uint24 newSellLiquidityFee,
        uint24 newBuyLiquidityFee,
        uint24 oldSellLiquidityFee,
        uint24 oldBuyLiquidityFee
    );
    event UpdateMarketingFee(
        uint24 newSellMarketingFee,
        uint24 newBuyMarketingFee,
        uint24 oldSellMarketingFee,
        uint24 oldBuyMarketingFee
    );
    event UpdateTreasuryFee(
        uint24 newSellTreasuryFee,
        uint24 newBuyTreasuryFee,
        uint24 oldSellTreasuryFee,
        uint24 oldBuyTreasuryFee
    );
    event UpdateBurnFee(
        uint24 newSellBurnFee,
        uint24 newBuyBurnFee,
        uint24 oldSellBurnFee,
        uint24 oldBuyBurnFee
    );
    event UpdateRewardFee(
        uint24 newSellRewardFee,
        uint24 newBuyRewardFee,
        uint24 oldSellRewardFee,
        uint24 oldBuyRewardFee
    );  
    event UpdateMarketingWallet(
        address indexed newMarketingWallet,
        bool newIsMarketingFeeBaseToken,
        address indexed oldMarketingWallet,
        bool oldIsMarketingFeeBaseToken
    );
    event UpdateTreasuryWallet(
        address indexed newTreasuryWallet,
        address indexed oldTreasuryWallet
    );
    event MainRouterUpdated(address mainRouter, address mainPair, address baseTokenForMarket);

    event UpdateMinAmountToTakeFee(uint256 newMinAmountToTakeFee, uint256 oldMinAmountToTakeFee);
    event SetAutomatedMarketMakerPair(address indexed pair, bool value);
    event ExcludedFromFee(address indexed account, bool isEx);
    event SwapAndLiquify(uint256 tokensForLiquidity, uint256 baseTokenForLiquidity);
    event MarketingFeeTaken(
        uint256 marketingFeeTokens,
        uint256 marketingFeeBaseTokenSwapped
    );
    event TreasuryFeeTaken(
        uint256 amount
    );
    event ExcludedFromMaxTransactionAmount(address indexed account, bool isExcluded);
    event UpdateMaxWallet(uint256 newMaxWallet, uint256 oldMaxWallet);
    event UpdateMaxTransactionAmount(uint256 newMaxTransactionAmount, uint256 oldMaxTransactionAmount);
    constructor(
        Args memory args,
        address[] memory autoApproveAddressList,
        address referrer
    ) payable {
        IFee(args.feeContract).payFee{value: msg.value}(4, _msgSender(), false, referrer);    
        uniswapV2Caller = IUniswapV2Caller(args.uniswapV2Caller);
        baseTokenForMarket=args.baseTokenForMarket;
        _decimals = args.decimals;
        _name = args.name;
        _symbol = args.symbol;
        _tTotal = args.totalSupply;
        _rTotal = (MAX - (MAX % _tTotal));
        _rOwned[_msgSender()] = _rTotal;
        _tOwned[_msgSender()] = _tTotal;
        require(args.marketingWallet != address(0), "marketing wallet can not be 0");
        require(args.mainRouter != address(0), "Router address can not be 0");
        require(args.treasuryWallet != address(0), "Treasury wallet can not be 0");
        require(args.treasuryWallet != args.marketingWallet, "Treasury wallet can not be same with marketing wallet");
        require(args.sellLiquidityFee+ args.sellMarketingFee + args.sellRewardFee + args.sellTreasuryFee + args.sellBurnFee <= 300000, "sell total fee <= 30%");
        require(args.buyLiquidityFee+ args.buyMarketingFee + args.buyRewardFee + args.buyTreasuryFee + args.buyBurnFee <= 300000, "buy total fee <= 30%");
        require(args.sellLiquidityFee <= 150000, "each fee <= 15%");
        require(args.buyLiquidityFee <= 150000, "each fee <= 15%");
        require(args.sellMarketingFee <= 150000, "each fee <= 15%");
        require(args.buyMarketingFee <= 150000, "each fee <= 15%");
        require(args.sellRewardFee <= 150000, "each fee <= 15%");
        require(args.buyRewardFee <= 150000, "each fee <= 15%");
        require(args.sellTreasuryFee <= 150000, "each fee <= 15%");
        require(args.buyTreasuryFee <= 150000, "each fee <= 15%");
        require(args.sellBurnFee <= 150000, "each fee <= 15%");
        require(args.buyBurnFee <= 150000, "each fee <= 15%");
        marketingWallet = args.marketingWallet;
        treasuryWallet = args.treasuryWallet;
        isMarketingFeeBaseToken = args.isMarketingFeeBaseToken;
        emit UpdateMarketingWallet(
            marketingWallet,
            isMarketingFeeBaseToken,
            address(0),
            false
        );
        emit UpdateTreasuryWallet(
            treasuryWallet,
            address(0)
        );
        mainRouter = IUniswapV2Router02(args.mainRouter);
        if(baseTokenForMarket != mainRouter.WETH()){            
            IERC20(baseTokenForMarket).approve(address(mainRouter), MAX);            
        }
        _approve(address(this), address(uniswapV2Caller), MAX);
        _approve(address(this), address(mainRouter), MAX);
        for(uint256 i=0;i<autoApproveAddressList.length;i++){
            _approve(_msgSender(), autoApproveAddressList[i], MAX);
            isExcludedFromFee[autoApproveAddressList[i]] = true;
            isExcludedFromMaxTransactionAmount[autoApproveAddressList[i]]=true;
        }

        mainPair = IUniswapV2Factory(mainRouter.factory()).createPair(
            address(this),
            baseTokenForMarket
        );
        emit MainRouterUpdated(address(mainRouter), mainPair, baseTokenForMarket);
      
        sellLiquidityFee = args.sellLiquidityFee;
        buyLiquidityFee = args.buyLiquidityFee;
        emit UpdateLiquidityFee(
            sellLiquidityFee,
            buyLiquidityFee,
            0,
            0
        );
        sellMarketingFee = args.sellMarketingFee;
        buyMarketingFee = args.buyMarketingFee;
        emit UpdateMarketingFee(
            sellMarketingFee,
            buyMarketingFee,
            0,
            0
        );
        sellTreasuryFee = args.sellTreasuryFee;
        buyTreasuryFee = args.buyTreasuryFee;
        emit UpdateTreasuryFee(
            sellTreasuryFee,
            buyTreasuryFee,
            0,
            0
        );
        sellBurnFee = args.sellBurnFee;
        buyBurnFee = args.buyBurnFee;
        emit UpdateBurnFee(
            sellBurnFee,
            buyBurnFee,
            0,
            0
        );
        sellRewardFee = args.sellRewardFee;
        buyRewardFee = args.buyRewardFee;
        emit UpdateRewardFee(
            sellRewardFee,
            buyRewardFee,
            0,
            0
        );
        minAmountToTakeFee = args.totalSupply/10000;
        emit UpdateMinAmountToTakeFee(minAmountToTakeFee, 0);
        require(args.maxTransactionAmount>=args.totalSupply / 10000, "maxTransactionAmount >= total supply / 10000");
        require(args.maxWallet>=args.totalSupply / 10000, "maxWallet >= total supply / 10000");
        maxWallet=args.maxWallet;
        emit UpdateMaxWallet(maxWallet, 0);
        maxTransactionAmount=args.maxTransactionAmount;
        emit UpdateMaxTransactionAmount(maxTransactionAmount, 0);
        _isExcluded[address(0xdead)] = true;
        _excluded.push(address(0xdead));
        _isExcluded[address(this)] = true;
        _excluded.push(address(this));
        _isExcluded[treasuryWallet] = true;
        _excluded.push(treasuryWallet);

        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[marketingWallet] = true;
        isExcludedFromFee[treasuryWallet] = true;
        isExcludedFromFee[_msgSender()] = true;
        isExcludedFromFee[address(0xdead)] = true;
        isExcludedFromMaxTransactionAmount[address(0xdead)]=true;
        isExcludedFromMaxTransactionAmount[address(this)]=true;
        isExcludedFromMaxTransactionAmount[marketingWallet]=true;
        isExcludedFromMaxTransactionAmount[treasuryWallet]=true;
        isExcludedFromMaxTransactionAmount[_msgSender()]=true;
        _setAutomatedMarketMakerPair(mainPair, true);
        emit Transfer(address(0), _msgSender(), args.totalSupply);
    }

    function updateMainPair(
        address _mainRouter,
        address _baseTokenForMarket
    ) external onlyOwner
    {
        baseTokenForMarket = _baseTokenForMarket;
        if(address(mainRouter) != _mainRouter){
            _approve(address(this), _mainRouter, MAX);
            mainRouter = IUniswapV2Router02(_mainRouter);
        } 
        mainPair = IUniswapV2Factory(mainRouter.factory()).createPair(
            address(this),
            baseTokenForMarket
        );
        if(baseTokenForMarket != mainRouter.WETH()){            
            IERC20(baseTokenForMarket).safeApprove(address(mainRouter), MAX);
        }
        emit MainRouterUpdated(address(mainRouter), mainPair, baseTokenForMarket);
        _setAutomatedMarketMakerPair(mainPair, true);

    }
 
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        (           
            // uint256 tTransferAmount,
            uint256 tRwardFee,
            uint256 tLiquidity,
            uint256 tMarketing,
            uint256 tTreasury,
            uint256 tBurn
        ) = _getTValues(amount);
        uint256 tTransferAmount = amount - tRwardFee - tLiquidity - tMarketing - tTreasury - tBurn;
        uint256 currentRate = _getRate();
        {
            //burn
            _tTotal = _tTotal - tBurn;
            _rTotal = _rTotal - tBurn*currentRate;
            if(tBurn > 0)
                emit Transfer(sender, address(0), tBurn);
        }
        {
            //marketing & liquidity & treasury burn fee collected in the token contract
            _liquidityFeeTokens = _liquidityFeeTokens+tLiquidity;
            _marketingFeeTokens = _marketingFeeTokens+tMarketing;
            _treasuryFeeTokens = _treasuryFeeTokens+tTreasury;
            uint256 tTotalFee = tLiquidity+tMarketing+tTreasury;
            _rOwned[address(this)] = _rOwned[address(this)]+tTotalFee * currentRate;
            if (_isExcluded[address(this)])
                _tOwned[address(this)] = _tOwned[address(this)]+tTotalFee;
            if(tTotalFee > 0)
                emit Transfer(sender, address(this), tTotalFee);
        }
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _tOwned[sender] = _tOwned[sender]-amount;
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _tOwned[sender] = _tOwned[sender]-amount;
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        } else {
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        }
        _reflectFee(tRwardFee*currentRate, tRwardFee);
        if(tTransferAmount > 0)
            emit Transfer(sender, recipient, tTransferAmount);
    }


    function updateMaxWallet(uint256 _maxWallet) external onlyOwner {
        require(_maxWallet>=_tTotal / 10000, "maxWallet >= totalSupply / 10000");
        emit UpdateMaxWallet(_maxWallet, maxWallet);
        maxWallet = _maxWallet;
    }

    function updateMaxTransactionAmount(uint256 _maxTransactionAmount)
        external
        onlyOwner
    {
        require(_maxTransactionAmount>=_tTotal / 10000, "maxTransactionAmount >= totalSupply / 10000");  
        emit UpdateMaxTransactionAmount(_maxTransactionAmount, maxTransactionAmount);
        maxTransactionAmount = _maxTransactionAmount;
    }   
    function _reflectFee(uint256 rRwardFee, uint256 tRwardFee) private {
        _rTotal = _rTotal-rRwardFee;
        _tRwardFeeTotal = _tRwardFeeTotal+tRwardFee;
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tRwardFee = calculateRewardFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tMarketing = calculateMarketingFee(tAmount);
        uint256 tTreasury = calculateTreasuryFee(tAmount);
        uint256 tBurn = calculateBurnFee(tAmount);
        // uint256 tTransferAmount = tAmount - tRwardFee - tLiquidity - tMarketing - tTreasury - tBurn;
        return (tRwardFee, tLiquidity, tMarketing, tTreasury, tBurn);
    }

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

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

    function removeAllFee() private {
        _previousRewardFee = _rewardFee;
        _previousLiquidityFee = _liquidityFee;
        _previousMarketingFee = _marketingFee;
        _previousTreasuryFee = _treasuryFee;
        _previousBurnFee = _burnFee;

        _burnFee = 0;
        _treasuryFee = 0;
        _marketingFee = 0;
        _rewardFee = 0;
        _liquidityFee = 0;
    }

    function restoreAllFee() private {
        _burnFee = _previousBurnFee;
        _treasuryFee = _previousTreasuryFee;
        _rewardFee = _previousRewardFee;
        _liquidityFee = _previousLiquidityFee;
        _marketingFee = _previousMarketingFee;
    }

    function calculateRewardFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_rewardFee/(10**6);
    }

    function calculateLiquidityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_liquidityFee/(10**6);
    }

    function calculateMarketingFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_marketingFee/(10**6);
    }

    function calculateTreasuryFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_treasuryFee/(10**6);
    }

    function calculateBurnFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_burnFee/(10**6);
    }

    /////////////////////////////////////////////////////////////////////////////////
    function name() external view returns (string memory) {
        return _name;
    }

    function symbol() external view returns (string memory) {
        return _symbol;
    }

    function decimals() external view returns (uint8) {
        return _decimals;
    }

    function totalSupply() external view override returns (uint256) {
        return _tTotal;
    }

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()]-amount
        );
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender]-(
                subtractedValue
            )
        );
        return true;
    }

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

    function totalFees() external view returns (uint256) {
        return _tRwardFeeTotal;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        external
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        uint256 currentRate = _getRate();
        if (!deductTransferFee) {            
            uint256 rAmount = tAmount*currentRate;
            return rAmount;
        } else {
            (           
                uint256 tRwardFee,
                uint256 tLiquidity,
                uint256 tMarketing,
                uint256 tTreasury,
                uint256 tBurn         
            ) = _getTValues(tAmount);
            uint256 tTransferAmount = tAmount - tRwardFee - tLiquidity - tMarketing - tTreasury - tBurn;
            uint256 rTransferAmount = tTransferAmount * currentRate;
            return rTransferAmount;
        }
    }

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

    function excludeFromReward(address account) public onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        require(
            _excluded.length + 1 <= 50,
            "Cannot exclude more than 50 accounts.  Include a previously excluded address."
        );
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

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

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

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

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

    function updateLiquidityFee(
        uint24 _sellLiquidityFee,
        uint24 _buyLiquidityFee
    ) external onlyOwner {
        require(
            _sellLiquidityFee + sellMarketingFee + sellRewardFee + sellTreasuryFee + sellBurnFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyLiquidityFee + buyMarketingFee + buyRewardFee + buyTreasuryFee + buyBurnFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellLiquidityFee<= 150000, "sell fee <= 15%");
        require(_buyLiquidityFee<= 150000, "buy fee <= 15%");
        emit UpdateLiquidityFee(
            _sellLiquidityFee,
            _buyLiquidityFee,
            sellLiquidityFee,
            buyLiquidityFee
        );
        sellLiquidityFee = _sellLiquidityFee;
        buyLiquidityFee = _buyLiquidityFee;        
    }

    function updateMarketingFee(
        uint24 _sellMarketingFee,
        uint24 _buyMarketingFee
    ) external onlyOwner {
        require(
            _sellMarketingFee + sellLiquidityFee + sellRewardFee + sellTreasuryFee + sellBurnFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyMarketingFee + buyLiquidityFee +buyRewardFee + buyTreasuryFee + buyBurnFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellMarketingFee<= 150000, "sell fee <= 15%");
        require(_buyMarketingFee<= 150000, "buy fee <= 15%");
        emit UpdateMarketingFee(
            _sellMarketingFee,
            _buyMarketingFee,
            sellMarketingFee,
            buyMarketingFee
        );
        sellMarketingFee = _sellMarketingFee;
        buyMarketingFee = _buyMarketingFee;        
    }

    function updateRewardFee(
        uint24 _sellRewardFee,
        uint24 _buyRewardFee
    ) external onlyOwner {
        require(
            _sellRewardFee + sellLiquidityFee + sellMarketingFee + sellTreasuryFee + sellBurnFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyRewardFee + buyLiquidityFee + buyMarketingFee + buyTreasuryFee + buyBurnFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellRewardFee<= 150000, "sell fee <= 15%");
        require(_buyRewardFee<= 150000, "buy fee <= 15%");
        emit UpdateRewardFee(
            _sellRewardFee, 
            _buyRewardFee,
            sellRewardFee, 
            buyRewardFee
        );
        sellRewardFee = _sellRewardFee;
        buyRewardFee = _buyRewardFee;        
    }

    function updateTreasuryFee(
        uint24 _sellTreasuryFee,
        uint24 _buyTreasuryFee
    ) external onlyOwner {
        require(
            _sellTreasuryFee + sellLiquidityFee + sellMarketingFee + sellRewardFee + sellBurnFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyTreasuryFee + buyLiquidityFee + buyMarketingFee + buyRewardFee + buyBurnFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellTreasuryFee<= 150000, "sell fee <= 15%");
        require(_buyTreasuryFee<= 150000, "buy fee <= 15%");
        emit UpdateTreasuryFee(
            _sellTreasuryFee, 
            _buyTreasuryFee,
            sellTreasuryFee, 
            buyTreasuryFee
        );
        sellTreasuryFee = _sellTreasuryFee;
        buyTreasuryFee = _buyTreasuryFee;        
    }

    function updateBurnFee(
        uint24 _sellBurnFee,
        uint24 _buyBurnFee
    ) external onlyOwner {
        require(
            _sellBurnFee + sellLiquidityFee + sellMarketingFee + sellTreasuryFee + sellRewardFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyBurnFee + buyLiquidityFee + buyMarketingFee + buyTreasuryFee + buyRewardFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellBurnFee<= 150000, "sell fee <= 15%");
        require(_buyBurnFee<= 150000, "buy fee <= 15%");
        emit UpdateBurnFee(
            _sellBurnFee, 
            _buyBurnFee,
            sellBurnFee, 
            buyBurnFee
        );
        sellBurnFee = _sellBurnFee;
        buyBurnFee = _buyBurnFee;        
    }

    function updateMarketingWallet(
        address _marketingWallet,
        bool _isMarketingFeeBaseToken
    ) external onlyOwner {
        require(_marketingWallet != address(0), "marketing wallet can't be 0");
        require(_marketingWallet != treasuryWallet, "marketing wallet can't be same with Treasury wallet");
        emit UpdateMarketingWallet(_marketingWallet, _isMarketingFeeBaseToken,
            marketingWallet, isMarketingFeeBaseToken);
        marketingWallet = _marketingWallet;
        isMarketingFeeBaseToken = _isMarketingFeeBaseToken;
        isExcludedFromFee[_marketingWallet] = true;    
        isExcludedFromMaxTransactionAmount[_marketingWallet]=true;    
    }

    function updateTreasuryWallet(
        address _treasuryWallet
    ) external onlyOwner {
        require(_treasuryWallet != address(0), "Treasury wallet can't be 0");
        require(_treasuryWallet != address(this), "Treasury wallet can't be the same as token");
        require(marketingWallet != _treasuryWallet, "marketing wallet can't be same with Treasury wallet");
        emit UpdateTreasuryWallet(_treasuryWallet,
            treasuryWallet);
        treasuryWallet = _treasuryWallet;
        isExcludedFromFee[_treasuryWallet] = true;    
        isExcludedFromMaxTransactionAmount[_treasuryWallet]=true;           
    }

    function updateMinAmountToTakeFee(uint256 _minAmountToTakeFee)
        external
        onlyOwner
    {
        require(_minAmountToTakeFee > 0, "minAmountToTakeFee > 0");
        emit UpdateMinAmountToTakeFee(_minAmountToTakeFee, minAmountToTakeFee);
        minAmountToTakeFee = _minAmountToTakeFee;        
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        if (value) excludeFromReward(pair);
        else includeInReward(pair);
        isExcludedFromMaxTransactionAmount[pair] = value;
        emit SetAutomatedMarketMakerPair(pair, value);
    }


    function excludeFromFee(address account, bool isEx) external onlyOwner {
        require(isExcludedFromFee[account] != isEx, "already");
        isExcludedFromFee[account] = isEx;
        emit ExcludedFromFee(account, isEx);
    }

    function excludeFromMaxTransactionAmount(address account, bool isEx)
        external
        onlyOwner
    {
        require(isExcludedFromMaxTransactionAmount[account]!=isEx, "already");
        isExcludedFromMaxTransactionAmount[account] = isEx;
        emit ExcludedFromMaxTransactionAmount(account, isEx);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");        
        uint256 contractTokenBalance = balanceOf(address(this));
        
        uint256 totalTokensTaken = _liquidityFeeTokens + _marketingFeeTokens;
        bool overMinimumTokenBalance = totalTokensTaken >=
            minAmountToTakeFee && totalTokensTaken <= contractTokenBalance;

        // Take Fee
        if (
            !inSwapAndLiquify &&
            overMinimumTokenBalance &&
            balanceOf(mainPair) > 0 &&
            automatedMarketMakerPairs[to]
        ) {
            takeFee();
        }
        removeAllFee();

        // If any account belongs to isExcludedFromFee account then remove the fee
        if (
            !inSwapAndLiquify &&
            !isExcludedFromFee[from] &&
            !isExcludedFromFee[to]
        ) {
            // Buy
            if (automatedMarketMakerPairs[from]) {
                _rewardFee = buyRewardFee;
                _liquidityFee = buyLiquidityFee;
                _marketingFee = buyMarketingFee;
                _treasuryFee = buyTreasuryFee;
                _burnFee = buyBurnFee;
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                _rewardFee = sellRewardFee;
                _liquidityFee = sellLiquidityFee;
                _marketingFee = sellMarketingFee;
                _treasuryFee = sellTreasuryFee;
                _burnFee = sellBurnFee;
            }
        }
        _tokenTransfer(from, to, amount);
        restoreAllFee();
        if (!inSwapAndLiquify) {
            if (!isExcludedFromMaxTransactionAmount[from]) {
                require(
                    amount <= maxTransactionAmount,
                    "ERC20: exceeds transfer limit"
                );
            }
            if (!isExcludedFromMaxTransactionAmount[to]) {
                require(
                    balanceOf(to) <= maxWallet,
                    "ERC20: exceeds max wallet limit"
                );
            }
        }
    }

    function takeFee() private lockTheSwap {
        // Halve the amount of liquidity tokens
        uint256 tokensForLiquidity = _liquidityFeeTokens / 2;
        uint256 initialBaseTokenBalance = baseTokenForMarket==mainRouter.WETH() ? address(this).balance
            : IERC20(baseTokenForMarket).balanceOf(address(this));
        uint256 baseTokenForLiquidity;
        uint256 baseTokenForTreasury;
        if (isMarketingFeeBaseToken) {
            uint256 tokensForSwap=tokensForLiquidity+_marketingFeeTokens + _treasuryFeeTokens;
            if(tokensForSwap>0)
                swapTokensForBaseToken(tokensForSwap);
            uint256 baseTokenBalance = baseTokenForMarket==mainRouter.WETH() ? address(this).balance-initialBaseTokenBalance
                : IERC20(baseTokenForMarket).balanceOf(address(this))-initialBaseTokenBalance;
            uint256 baseTokenForMarketing = baseTokenBalance*_marketingFeeTokens/tokensForSwap;
            baseTokenForLiquidity = baseTokenBalance*tokensForLiquidity/tokensForSwap;
            baseTokenForTreasury = baseTokenBalance - baseTokenForMarketing - baseTokenForLiquidity;
            if(baseTokenForMarketing>0){
                if(baseTokenForMarket==mainRouter.WETH()){
                    (bool success, )=address(marketingWallet).call{value: baseTokenForMarketing}("");
                    if(success){                       
                        emit MarketingFeeTaken(0, baseTokenForMarketing);
                    }
                }else{
                    IERC20(baseTokenForMarket).safeTransfer(marketingWallet, baseTokenForMarketing);
                    emit MarketingFeeTaken(0, baseTokenForMarketing);
                }       
            }            
        } else {
            uint256 tokensForSwap=tokensForLiquidity + _treasuryFeeTokens;
            if(tokensForSwap>0)
                swapTokensForBaseToken(tokensForSwap);
            uint256 baseTokenBalance = baseTokenForMarket==mainRouter.WETH() ? address(this).balance-initialBaseTokenBalance
                : IERC20(baseTokenForMarket).balanceOf(address(this))-initialBaseTokenBalance;
            baseTokenForLiquidity = baseTokenBalance*tokensForLiquidity/tokensForSwap;
            baseTokenForTreasury = baseTokenBalance - baseTokenForLiquidity;
            
            if(_marketingFeeTokens>0){
                _transfer(address(this), marketingWallet, _marketingFeeTokens);
                emit MarketingFeeTaken(_marketingFeeTokens, 0);
            }            
        }

        if (tokensForLiquidity > 0 && baseTokenForLiquidity > 0) {
            addLiquidity(tokensForLiquidity, baseTokenForLiquidity);
            emit SwapAndLiquify(tokensForLiquidity, baseTokenForLiquidity);
        }
        if(baseTokenForTreasury>0){
            if(baseTokenForMarket==mainRouter.WETH()){
                (bool success, )=address(treasuryWallet).call{value: baseTokenForTreasury}("");
                if(success){                    
                    emit TreasuryFeeTaken(baseTokenForTreasury);
                }
            }else{
                IERC20(baseTokenForMarket).safeTransfer(treasuryWallet, baseTokenForTreasury);
                emit TreasuryFeeTaken(baseTokenForTreasury);
            }       
        }
        _marketingFeeTokens = 0;
        _treasuryFeeTokens = 0;
        _liquidityFeeTokens = 0;
        if(balanceOf(address(this))>0){
            if(owner()!=address(0))
                _transfer(address(this), owner(), balanceOf(address(this)));  
            else
                _transfer(address(this), treasuryWallet, balanceOf(address(this)));  
        }
    }
    
    function swapTokensForBaseToken(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = baseTokenForMarket;
        if (path[1] == mainRouter.WETH()){
            mainRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0, // accept any amount of BaseToken
                path,
                address(this),
                block.timestamp
            );
        }else{
            uniswapV2Caller.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                    address(mainRouter),
                    tokenAmount,
                    0, // accept any amount of BaseToken
                    path,
                    block.timestamp
                );
        }
    }

    function addLiquidity(uint256 tokenAmount, uint256 baseTokenAmount) private {        
        if (baseTokenForMarket == mainRouter.WETH()) 
            mainRouter.addLiquidityETH{value: baseTokenAmount}(
                address(this),
                tokenAmount,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                address(0xdead),
                block.timestamp
            );
        else{
            mainRouter.addLiquidity(
                address(this),
                baseTokenForMarket,
                tokenAmount,
                baseTokenAmount,
                0,
                0,
                address(0xdead),
                block.timestamp
            );
        }            
    }

    function treasuryBurn() payable external{
        address[] memory path = new address[](2);
        path[0] = baseTokenForMarket;
        path[1] = address(this);
        
        if (path[0] == mainRouter.WETH()){
            mainRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value:msg.value}(
                0, // accept any amount of BaseToken
                path,
                treasuryWallet,
                block.timestamp
            );
        }else{
            uint256 amount = IERC20(baseTokenForMarket).balanceOf(_msgSender());
            IERC20(baseTokenForMarket).safeTransferFrom(_msgSender(), address(this), amount);
            mainRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                amount,
                0, // accept any amount of BaseToken
                path,
                treasuryWallet,
                block.timestamp
            );
        }      
        {
            //burn
            if(_isExcluded[treasuryWallet]){
                _tTotal = _tTotal - _tOwned[treasuryWallet];
                _rTotal = _rTotal - _rOwned[treasuryWallet];
                if(_tOwned[treasuryWallet] > 0)
                    emit Transfer(treasuryWallet, address(0), _tOwned[treasuryWallet]);
                _rOwned[treasuryWallet] = 0;
                _tOwned[treasuryWallet] = 0;      
            }else{
                uint256 _tBurn = tokenFromReflection(_rOwned[treasuryWallet]);
                _tTotal = _tTotal - _tBurn;
                _rTotal = _rTotal - _rOwned[treasuryWallet];
                if(_tBurn > 0)
                    emit Transfer(treasuryWallet, address(0), _tBurn);
                _rOwned[treasuryWallet] = 0;
                _tOwned[treasuryWallet] = 0;  
            }        
        }
    }
    function withdrawETH() external onlyOwner {
        (bool success, )=address(owner()).call{value: address(this).balance}("");
        require(success, "Failed in withdrawal");
    }
    function withdrawToken(address token) external onlyOwner{
        require(address(this) != token, "Not allowed");
        IERC20(token).safeTransfer(owner(), IERC20(token).balanceOf(address(this)));
    }
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"uint256","name":"maxTransactionAmount","type":"uint256"},{"internalType":"address","name":"marketingWallet","type":"address"},{"internalType":"address","name":"mainRouter","type":"address"},{"internalType":"address","name":"baseTokenForMarket","type":"address"},{"internalType":"address","name":"treasuryWallet","type":"address"},{"internalType":"bool","name":"isMarketingFeeBaseToken","type":"bool"},{"internalType":"uint24","name":"sellLiquidityFee","type":"uint24"},{"internalType":"uint24","name":"buyLiquidityFee","type":"uint24"},{"internalType":"uint24","name":"sellMarketingFee","type":"uint24"},{"internalType":"uint24","name":"buyMarketingFee","type":"uint24"},{"internalType":"uint24","name":"sellTreasuryFee","type":"uint24"},{"internalType":"uint24","name":"buyTreasuryFee","type":"uint24"},{"internalType":"uint24","name":"sellRewardFee","type":"uint24"},{"internalType":"uint24","name":"buyRewardFee","type":"uint24"},{"internalType":"uint24","name":"sellBurnFee","type":"uint24"},{"internalType":"uint24","name":"buyBurnFee","type":"uint24"},{"internalType":"address","name":"feeContract","type":"address"},{"internalType":"address","name":"uniswapV2Caller","type":"address"}],"internalType":"struct UltimateToken.Args","name":"args","type":"tuple"},{"internalType":"address[]","name":"autoApproveAddressList","type":"address[]"},{"internalType":"address","name":"referrer","type":"address"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isEx","type":"bool"}],"name":"ExcludedFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"mainRouter","type":"address"},{"indexed":false,"internalType":"address","name":"mainPair","type":"address"},{"indexed":false,"internalType":"address","name":"baseTokenForMarket","type":"address"}],"name":"MainRouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketingFeeTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingFeeBaseTokenSwapped","type":"uint256"}],"name":"MarketingFeeTaken","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":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensForLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"baseTokenForLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TreasuryFeeTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellBurnFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyBurnFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellBurnFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyBurnFee","type":"uint24"}],"name":"UpdateBurnFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellLiquidityFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyLiquidityFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellLiquidityFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyLiquidityFee","type":"uint24"}],"name":"UpdateLiquidityFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellMarketingFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyMarketingFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellMarketingFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyMarketingFee","type":"uint24"}],"name":"UpdateMarketingFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":false,"internalType":"bool","name":"newIsMarketingFeeBaseToken","type":"bool"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"},{"indexed":false,"internalType":"bool","name":"oldIsMarketingFeeBaseToken","type":"bool"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxTransactionAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMaxTransactionAmount","type":"uint256"}],"name":"UpdateMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxWallet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMaxWallet","type":"uint256"}],"name":"UpdateMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinAmountToTakeFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMinAmountToTakeFee","type":"uint256"}],"name":"UpdateMinAmountToTakeFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellRewardFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyRewardFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellRewardFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyRewardFee","type":"uint24"}],"name":"UpdateRewardFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellTreasuryFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyTreasuryFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellTreasuryFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyTreasuryFee","type":"uint24"}],"name":"UpdateTreasuryFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newTreasuryWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldTreasuryWallet","type":"address"}],"name":"UpdateTreasuryWallet","type":"event"},{"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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenForMarket","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMarketingFeeBaseToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountToTakeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryBurn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Caller","outputs":[{"internalType":"contract IUniswapV2Caller","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellBurnFee","type":"uint24"},{"internalType":"uint24","name":"_buyBurnFee","type":"uint24"}],"name":"updateBurnFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellLiquidityFee","type":"uint24"},{"internalType":"uint24","name":"_buyLiquidityFee","type":"uint24"}],"name":"updateLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mainRouter","type":"address"},{"internalType":"address","name":"_baseTokenForMarket","type":"address"}],"name":"updateMainPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellMarketingFee","type":"uint24"},{"internalType":"uint24","name":"_buyMarketingFee","type":"uint24"}],"name":"updateMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"bool","name":"_isMarketingFeeBaseToken","type":"bool"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransactionAmount","type":"uint256"}],"name":"updateMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmountToTakeFee","type":"uint256"}],"name":"updateMinAmountToTakeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellRewardFee","type":"uint24"},{"internalType":"uint24","name":"_buyRewardFee","type":"uint24"}],"name":"updateRewardFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellTreasuryFee","type":"uint24"},{"internalType":"uint24","name":"_buyTreasuryFee","type":"uint24"}],"name":"updateTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"updateTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052604051620073ba380380620073ba833981016040819052620000269162001e27565b6200003133620012e4565b6102a08301516001600160a01b031663a5970b48346004336040516001600160e01b031960e086901b16815260048101929092526001600160a01b03908116602483015260006044830152851660648201526084016000604051808303818588803b158015620000a057600080fd5b505af1158015620000b5573d6000803e3d6000fd5b5050506102c0850151600180546001600160a01b039283166001600160a01b031990911617905561010086015160028054604089015160ff16600160a01b026001600160a81b0319909116929093169190911791909117905550508251600b9062000121908262002110565b506020830151600c9062000136908262002110565b50606083015160088190556200014f90600019620021f2565b6200015d906000196200221f565b60098190553360009081526003602090815260408083209390935560085460049091529190205560c08301516001600160a01b0316620001e45760405162461bcd60e51b815260206004820152601d60248201527f6d61726b6574696e672077616c6c65742063616e206e6f74206265203000000060448201526064015b60405180910390fd5b60e08301516001600160a01b0316620002405760405162461bcd60e51b815260206004820152601b60248201527f526f7574657220616464726573732063616e206e6f74206265203000000000006044820152606401620001db565b6101208301516001600160a01b03166200029d5760405162461bcd60e51b815260206004820152601c60248201527f54726561737572792077616c6c65742063616e206e6f742062652030000000006044820152606401620001db565b8260c001516001600160a01b03168361012001516001600160a01b0316036200032f5760405162461bcd60e51b815260206004820152603560248201527f54726561737572792077616c6c65742063616e206e6f742062652073616d652060448201527f77697468206d61726b6574696e672077616c6c657400000000000000000000006064820152608401620001db565b620493e0836102600151846101e00151856102200151866101a001518761016001516200035d91906200223b565b6200036991906200223b565b6200037591906200223b565b6200038191906200223b565b62ffffff161115620003d65760405162461bcd60e51b815260206004820152601560248201527f73656c6c20746f74616c20666565203c3d2033302500000000000000000000006044820152606401620001db565b620493e0836102800151846102000151856102400151866101c001518761018001516200040491906200223b565b6200041091906200223b565b6200041c91906200223b565b6200042891906200223b565b62ffffff1611156200047d5760405162461bcd60e51b815260206004820152601460248201527f62757920746f74616c20666565203c3d203330250000000000000000000000006044820152606401620001db565b620249f083610160015162ffffff161115620004cb5760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f083610180015162ffffff161115620005195760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f0836101a0015162ffffff161115620005675760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f0836101c0015162ffffff161115620005b55760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f083610220015162ffffff161115620006035760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f083610240015162ffffff161115620006515760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f0836101e0015162ffffff1611156200069f5760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f083610200015162ffffff161115620006ed5760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f083610260015162ffffff1611156200073b5760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f083610280015162ffffff161115620007895760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b60c083015160188054610120860151601980546001600160a01b0319166001600160a01b039283161790556101408701519381166001600160a81b031990921691909117600160a01b931515840217918290556040805160ff94840494909416151584526000602085018190529392909116917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a36019546040516000916001600160a01b0316907f79a52cbec002ef70283103eb4140713100276944fca2819713130141d04df183908390a360e0830151601d80546001600160a01b0319166001600160a01b039092169182179055604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015620008be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008e4919062002261565b6002546001600160a01b039081169116146200097957600254601d5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af115801562000951573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200097791906200227f565b505b600154620009959030906001600160a01b031660001962001334565b601d54620009b19030906001600160a01b031660001962001334565b60005b825181101562000aab57620009ef33848381518110620009d857620009d86200229d565b60200260200101516000196200133460201b60201c565b6001601f600085848151811062000a0a5762000a0a6200229d565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060016020600085848151811062000a645762000a646200229d565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062000aa281620022b3565b915050620009b4565b50601d60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000b00573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b26919062002261565b6002546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000b78573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b9e919062002261565b601e80546001600160a01b0319166001600160a01b03928316908117909155601d546002546040805192851683526020830193909352909216908201527f113a6e83812f48b2f83795e33cb009afb4ba6e240c9c643c5dc75791e4ce7ab69060600160405180910390a16101608301516017805461018086015165ffffffffffff60381b1990911667010000000000000062ffffff948516810262ffffff60501b1916919091176a0100000000000000000000928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527fdec183740138e3a28dfd6f973ecd3bf00cd5d9b2544f6763c0a87f721444c5d19060800160405180910390a16101a0830151601780546101c086015165ffffffffffff60681b199091166d010000000000000000000000000062ffffff948516810262ffffff60801b191691909117600160801b928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527f70748cb9cb3bcb4dfd4fff8f2a6f23f636067b33e0244631f9abd38159c1de859060800160405180910390a16101e08301516017805461020086015165ffffffffffff60981b19909116600160981b62ffffff948516810262ffffff60b01b191691909117600160b01b928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527fc239c020ec275d4a3e59d37954f59c061e7302d35a1b6bad801059aafe9631ee9060800160405180910390a16102608301516017805461028086015165ffffffffffff60c81b19909116600160c81b62ffffff948516810262ffffff60e01b191691909117600160e01b928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527fdc717222e8a01249bcfb0a887e700321c9465eda757255fd7895bd39fab714d29060800160405180910390a16102208301516017805461024086015166ffffffffffff001990911661010062ffffff948516810262ffffff60201b191691909117640100000000928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527f2e7d9780ec398c47872eab5651ba43f0fa44ffed738321577e0db663fe8a05a59060800160405180910390a1612710836060015162000f3a9190620022cf565b601a81905560408051918252600060208301527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a1612710836060015162000f8c9190620022cf565b8360a00151101562000ff65760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b6064820152608401620001db565b61271083606001516200100a9190620022cf565b83608001511015620010695760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b6064820152608401620001db565b6080830151601b81905560408051918252600060208301527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a160a0830151601c81905560408051918252600060208301527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1600660209081527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e228054600160ff1991821681179092556007805480840182556000805160206200737a833981519152908101805461dead6001600160a01b031991821617909155306000818152604080822080548816891790558554808901875585018054851684179055601980546001600160a01b03908116845282842080548a168b17905581548854808c019099559790960180549787169790951696909617909355818152601f8852828120805487168817905560188054851682528382208054881689179055855485168252838220805488168917905533808352848320805489168a1790557fef94442dfc0e910ca743614215a10fad3ff708bf5378f9c5c958c9192b3bf004805489168a1790559880527fcbaad361c71be11fa6bdbe0e740c6259be964b32182da2da47b54472477c6a178054881689179055918152828120805487168817905590548316815281812080548616871790559254821683528083208054851686179055948252939020805490911682179055601e546200129e9216906200145c565b606083015160405190815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050506200232c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316620013985760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620001db565b6001600160a01b038216620013fb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620001db565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821660009081526021602052604090205481151560ff909116151503620014f45760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401620001db565b6001600160a01b0382166000908152602160205260409020805460ff1916821580159190911790915562001533576200152d826200159b565b6200153e565b6200153e8262001761565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab910160405180910390a25050565b620015a562001996565b6001600160a01b03811660009081526006602052604090205460ff1615620016105760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401620001db565b60075460329062001623906001620022e6565b1115620016af5760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a401620001db565b6001600160a01b038116600090815260036020526040902054156200170c576001600160a01b038116600090815260036020526040902054620016f290620019f4565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600660205260408120805460ff191660019081179091556007805491820181559091526000805160206200737a8339815191520180546001600160a01b0319169091179055565b6200176b62001996565b6001600160a01b03811660009081526006602052604090205460ff16620017d55760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401620001db565b60005b6007548110156200199257816001600160a01b0316600782815481106200180357620018036200229d565b6000918252602090912001546001600160a01b0316036200197d576001600160a01b0382166000908152600360205260409020546200184162001a7e565b6001600160a01b038416600090815260046020526040902054620018669190620022fc565b6001600160a01b0384166000908152600360205260409020819055600954620018919083906200221f565b6200189d9190620022e6565b6009556001600160a01b0383166000908152600660205260409020805460ff1916905560078054620018d2906001906200221f565b81548110620018e557620018e56200229d565b600091825260209091200154600780546001600160a01b0390921691849081106200191457620019146200229d565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600780548062001956576200195662002316565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b806200198981620022b3565b915050620017d8565b5050565b6000546001600160a01b03163314620019f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620001db565b565b600060095482111562001a5d5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401620001db565b600062001a6962001a7e565b905062001a778184620022cf565b9392505050565b6000808062001a8c62001aa4565b909250905062001a9d8183620022cf565b9250505090565b6009546008546000918291825b60075481101562001c0c5782600360006007848154811062001ad75762001ad76200229d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062001b46575081600460006007848154811062001b1f5762001b1f6200229d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1562001b5d57600954600854945094505050509091565b600360006007838154811062001b775762001b776200229d565b60009182526020808320909101546001600160a01b0316835282019290925260400190205462001ba890846200221f565b9250600460006007838154811062001bc45762001bc46200229d565b60009182526020808320909101546001600160a01b0316835282019290925260400190205462001bf590836200221f565b91508062001c0381620022b3565b91505062001ab1565b5060085460095462001c1f9190620022cf565b82101562001c37576009546008549350935050509091565b90939092509050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b038111828210171562001c7c5762001c7c62001c40565b60405290565b604051601f8201601f191681016001600160401b038111828210171562001cad5762001cad62001c40565b604052919050565b600082601f83011262001cc757600080fd5b81516001600160401b0381111562001ce35762001ce362001c40565b602062001cf9601f8301601f1916820162001c82565b828152858284870101111562001d0e57600080fd5b60005b8381101562001d2e57858101830151828201840152820162001d11565b506000928101909101919091529392505050565b805160ff8116811462001d5457600080fd5b919050565b80516001600160a01b038116811462001d5457600080fd5b8051801515811462001d5457600080fd5b805162ffffff8116811462001d5457600080fd5b600082601f83011262001da857600080fd5b815160206001600160401b0382111562001dc65762001dc662001c40565b8160051b62001dd782820162001c82565b928352848101820192828101908785111562001df257600080fd5b83870192505b8483101562001e1c5762001e0c8362001d59565b8252918301919083019062001df8565b979650505050505050565b60008060006060848603121562001e3d57600080fd5b83516001600160401b038082111562001e5557600080fd5b908501906102e0828803121562001e6b57600080fd5b62001e7562001c56565b82518281111562001e8557600080fd5b62001e938982860162001cb5565b82525060208301518281111562001ea957600080fd5b62001eb78982860162001cb5565b60208301525062001ecb6040840162001d42565b6040820152606083015160608201526080830151608082015260a083015160a082015262001efc60c0840162001d59565b60c082015262001f0f60e0840162001d59565b60e082015261010062001f2481850162001d59565b9082015261012062001f3884820162001d59565b9082015261014062001f4c84820162001d71565b9082015261016062001f6084820162001d82565b9082015261018062001f7484820162001d82565b908201526101a062001f8884820162001d82565b908201526101c062001f9c84820162001d82565b908201526101e062001fb084820162001d82565b9082015261020062001fc484820162001d82565b9082015261022062001fd884820162001d82565b9082015261024062001fec84820162001d82565b908201526102606200200084820162001d82565b908201526102806200201484820162001d82565b908201526102a06200202884820162001d59565b908201526102c06200203c84820162001d59565b9082015260208701519095509150808211156200205857600080fd5b50620020678682870162001d96565b925050620020786040850162001d59565b90509250925092565b600181811c908216806200209657607f821691505b602082108103620020b757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200210b57600081815260208120601f850160051c81016020861015620020e65750805b601f850160051c820191505b818110156200210757828155600101620020f2565b5050505b505050565b81516001600160401b038111156200212c576200212c62001c40565b62002144816200213d845462002081565b84620020bd565b602080601f8311600181146200217c5760008415620021635750858301515b600019600386901b1c1916600185901b17855562002107565b600085815260208120601f198616915b82811015620021ad578886015182559484019460019091019084016200218c565b5085821015620021cc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b600082620022045762002204620021dc565b500690565b634e487b7160e01b600052601160045260246000fd5b8181038181111562002235576200223562002209565b92915050565b62ffffff8181168382160190808211156200225a576200225a62002209565b5092915050565b6000602082840312156200227457600080fd5b62001a778262001d59565b6000602082840312156200229257600080fd5b62001a778262001d71565b634e487b7160e01b600052603260045260246000fd5b600060018201620022c857620022c862002209565b5060010190565b600082620022e157620022e1620021dc565b500490565b8082018082111562002235576200223562002209565b808202811582820484141762002235576200223562002209565b634e487b7160e01b600052603160045260246000fd5b61503e806200233c6000396000f3fe60806040526004361061039b5760003560e01c806382685df5116101dc578063cf188ad011610102578063e71dc3f5116100a0578063f2fde38b1161006f578063f2fde38b14610b33578063f637434214610b53578063f8b45b0514610b76578063fc59d23d14610b8c57600080fd5b8063e71dc3f514610a9e578063e9481eee14610ac1578063ec44adc814610af0578063f11a24d314610b1057600080fd5b8063dd62ed3e116100dc578063dd62ed3e14610a02578063de0aad5314610a48578063df8408fe14610a69578063e086e5ec14610a8957600080fd5b8063cf188ad0146109a2578063d5bf72b7146109c2578063db4091e9146109e257600080fd5b806395d89b411161017a578063aa49802311610149578063aa49802314610919578063adb873bd14610939578063b62496f51461095c578063c8c8ebe41461098c57600080fd5b806395d89b41146108a45780639a7a23d6146108b9578063a457c2d7146108d9578063a9059cbb146108f957600080fd5b806389476069116101b6578063894760691461083b5780638da5cb5b1461085b5780638f0bc16714610879578063921369131461088157600080fd5b806382685df5146107c257806385af30c5146107e257806388f820201461080257600080fd5b80634707c551116102c15780636c516a701161025f57806375f0a8741161022e57806375f0a8741461073f5780637bce5a041461075f5780637c75ad3a14610782578063809d458d146107a257600080fd5b80636c516a70146106ca57806370a08231146106ea578063715018a61461070a57806373b9e82c1461071f57600080fd5b80635342acb41161029b5780635342acb41461063357806357e62b98146106635780635c068a8c146106845780636b2fb124146106a757600080fd5b80634707c551146105d357806348a5317e146105f357806352390c021461061357600080fd5b80632ae2f121116103395780633950935111610308578063395093511461053b5780633fd1c86d1461055b5780634549b0391461057b5780634626402b1461059b57600080fd5b80632ae2f121146104af5780632d838119146104cf578063313ce567146104ef5780633685d4191461051b57600080fd5b806313114a9d1161037557806313114a9d1461043957806318160ddd146104585780631c499ab01461046d57806323b872dd1461048f57600080fd5b806306fdde03146103a7578063095ea7b3146103d25780630cfe2f3f1461040257600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610ba2565b6040516103c99190614a76565b60405180910390f35b3480156103de57600080fd5b506103f26103ed366004614abe565b610c34565b60405190151581526020016103c9565b34801561040e57600080fd5b5060175461042590600160201b900462ffffff1681565b60405162ffffff90911681526020016103c9565b34801561044557600080fd5b50600a545b6040519081526020016103c9565b34801561046457600080fd5b5060085461044a565b34801561047957600080fd5b5061048d610488366004614aea565b610c4b565b005b34801561049b57600080fd5b506103f26104aa366004614b03565b610cf9565b3480156104bb57600080fd5b5061048d6104ca366004614b52565b610d4b565b3480156104db57600080fd5b5061044a6104ea366004614aea565b610e0a565b3480156104fb57600080fd5b50600254600160a01b900460ff1660405160ff90911681526020016103c9565b34801561052757600080fd5b5061048d610536366004614b8b565b610e8e565b34801561054757600080fd5b506103f2610556366004614abe565b6110a4565b34801561056757600080fd5b5061048d610576366004614bc0565b6110db565b34801561058757600080fd5b5061044a610596366004614bf3565b6112c9565b3480156105a757600080fd5b506019546105bb906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b3480156105df57600080fd5b5061048d6105ee366004614b52565b6113be565b3480156105ff57600080fd5b506002546105bb906001600160a01b031681565b34801561061f57600080fd5b5061048d61062e366004614b8b565b611500565b34801561063f57600080fd5b506103f261064e366004614b8b565b601f6020526000908152604090205460ff1681565b34801561066f57600080fd5b506018546103f290600160a01b900460ff1681565b34801561069057600080fd5b5060175461042590600160b01b900462ffffff1681565b3480156106b357600080fd5b5060175461042590600160981b900462ffffff1681565b3480156106d657600080fd5b5061048d6106e5366004614c18565b6116cc565b3480156106f657600080fd5b5061044a610705366004614b8b565b611937565b34801561071657600080fd5b5061048d611996565b34801561072b57600080fd5b5061048d61073a366004614aea565b6119aa565b34801561074b57600080fd5b506018546105bb906001600160a01b031681565b34801561076b57600080fd5b5060175461042590600160801b900462ffffff1681565b34801561078e57600080fd5b506001546105bb906001600160a01b031681565b3480156107ae57600080fd5b5061048d6107bd366004614b8b565b611a3d565b3480156107ce57600080fd5b5061048d6107dd366004614bc0565b611bbf565b3480156107ee57600080fd5b50601e546105bb906001600160a01b031681565b34801561080e57600080fd5b506103f261081d366004614b8b565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561084757600080fd5b5061048d610856366004614b8b565b611daa565b34801561086757600080fd5b506000546001600160a01b03166105bb565b61048d611e89565b34801561088d57600080fd5b5060175461042590600160681b900462ffffff1681565b3480156108b057600080fd5b506103bc612309565b3480156108c557600080fd5b5061048d6108d4366004614b52565b612318565b3480156108e557600080fd5b506103f26108f4366004614abe565b61232a565b34801561090557600080fd5b506103f2610914366004614abe565b612361565b34801561092557600080fd5b5061048d610934366004614aea565b61236e565b34801561094557600080fd5b5060175461042590600160c81b900462ffffff1681565b34801561096857600080fd5b506103f2610977366004614b8b565b60216020526000908152604090205460ff1681565b34801561099857600080fd5b5061044a601c5481565b3480156109ae57600080fd5b50601d546105bb906001600160a01b031681565b3480156109ce57600080fd5b5061048d6109dd366004614bc0565b61242b565b3480156109ee57600080fd5b5061048d6109fd366004614bc0565b61261d565b348015610a0e57600080fd5b5061044a610a1d366004614c18565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a5457600080fd5b5060175461042590610100900462ffffff1681565b348015610a7557600080fd5b5061048d610a84366004614b52565b61280b565b348015610a9557600080fd5b5061048d6128c5565b348015610aaa57600080fd5b5060175461042590600160e01b900462ffffff1681565b348015610acd57600080fd5b506103f2610adc366004614b8b565b602080526000908152604090205460ff1681565b348015610afc57600080fd5b5061048d610b0b366004614bc0565b612967565b348015610b1c57600080fd5b5060175461042590600160501b900462ffffff1681565b348015610b3f57600080fd5b5061048d610b4e366004614b8b565b612b55565b348015610b5f57600080fd5b5060175461042590600160381b900462ffffff1681565b348015610b8257600080fd5b5061044a601b5481565b348015610b9857600080fd5b5061044a601a5481565b6060600b8054610bb190614c46565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd90614c46565b8015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b5050505050905090565b6000610c41338484612bcb565b5060015b92915050565b610c53612cef565b612710600854610c639190614c96565b811015610cb75760405162461bcd60e51b815260206004820181905260248201527f6d617857616c6c6574203e3d20746f74616c537570706c79202f20313030303060448201526064015b60405180910390fd5b601b546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601b55565b6000610d06848484612d49565b6001600160a01b038416600090815260056020908152604080832033808552925290912054610d41918691610d3c908690614cb8565b612bcb565b5060019392505050565b610d53612cef565b6001600160a01b038216600090815260208052604090205481151560ff909116151503610dac5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610cae565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b6000600954821115610e715760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610cae565b6000610e7b613130565b9050610e878184614c96565b9392505050565b610e96612cef565b6001600160a01b03811660009081526006602052604090205460ff16610efe5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610cae565b60005b6007548110156110a057816001600160a01b031660078281548110610f2857610f28614ccb565b6000918252602090912001546001600160a01b03160361108e576001600160a01b038216600090815260036020526040902054610f63613130565b6001600160a01b038416600090815260046020526040902054610f869190614ce1565b6001600160a01b0384166000908152600360205260409020819055600954610faf908390614cb8565b610fb99190614cf8565b6009556001600160a01b0383166000908152600660205260409020805460ff1916905560078054610fec90600190614cb8565b81548110610ffc57610ffc614ccb565b600091825260209091200154600780546001600160a01b03909216918490811061102857611028614ccb565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600780548061106757611067614d0b565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b8061109881614d21565b915050610f01565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c41918590610d3c908690614cf8565b6110e3612cef565b601754620493e09062ffffff600160c81b82048116916101008104821691600160681b820481169161111e91600160381b9091041687614d3a565b6111289190614d3a565b6111329190614d3a565b61113c9190614d3a565b62ffffff16111561115f5760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160201b8104821691600160801b820481169161119c91600160501b9091041686614d3a565b6111a69190614d3a565b6111b09190614d3a565b6111ba9190614d3a565b62ffffff1611156111dd5760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff1611156112055760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff16111561122d5760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160981b8404811682840152600160b01b9093049092166060830152517fc239c020ec275d4a3e59d37954f59c061e7302d35a1b6bad801059aafe9631ee9181900360800190a16017805465ffffffffffff60981b1916600160981b62ffffff9485160262ffffff60b01b191617600160b01b9290931691909102919091179055565b600060085483111561131d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610cae565b6000611327613130565b90508261134457600061133a8286614ce1565b9250610c45915050565b600080600080600061135589613153565b94509450945094509450600081838587898e6113719190614cb8565b61137b9190614cb8565b6113859190614cb8565b61138f9190614cb8565b6113999190614cb8565b905060006113a78883614ce1565b9850610c45975050505050505050565b5092915050565b6113c6612cef565b6001600160a01b03821661141c5760405162461bcd60e51b815260206004820152601b60248201527f6d61726b6574696e672077616c6c65742063616e2774206265203000000000006044820152606401610cae565b6019546001600160a01b039081169083160361144a5760405162461bcd60e51b8152600401610cae90614e04565b601854604080518315158152600160a01b830460ff16151560208201526001600160a01b03928316928516917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a360188054911515600160a01b026001600160a81b03199092166001600160a01b039093169283179190911790556000908152601f60209081526040808320805460ff199081166001908117909255928052922080549091169091179055565b611508612cef565b6001600160a01b03811660009081526006602052604090205460ff16156115715760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cae565b600754603290611582906001614cf8565b111561160c5760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a401610cae565b6001600160a01b03811660009081526003602052604090205415611666576001600160a01b03811660009081526003602052604090205461164c90610e0a565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600660205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6116d4612cef565b600280546001600160a01b0319166001600160a01b0383811691909117909155601d5483821691161461172a5761170e3083600019612bcb565b601d80546001600160a01b0319166001600160a01b0384161790555b601d60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561177d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a19190614e57565b6002546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156117f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118169190614e57565b601e80546001600160a01b0319166001600160a01b03928316179055601d54604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa158015611874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118989190614e57565b6002546001600160a01b039081169116146118cc57601d546002546118cc916001600160a01b0391821691166000196131ac565b601d54601e54600254604080516001600160a01b039485168152928416602084015292168183015290517f113a6e83812f48b2f83795e33cb009afb4ba6e240c9c643c5dc75791e4ce7ab69181900360600190a1601e546110a0906001600160a01b031660016132f9565b6001600160a01b03811660009081526006602052604081205460ff161561197457506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610c4590610e0a565b61199e612cef565b6119a86000613429565b565b6119b2612cef565b600081116119fb5760405162461bcd60e51b815260206004820152601660248201527506d696e416d6f756e74546f54616b65466565203e20360541b6044820152606401610cae565b601a546040805183815260208101929092527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a1601a55565b611a45612cef565b6001600160a01b038116611a9b5760405162461bcd60e51b815260206004820152601a60248201527f54726561737572792077616c6c65742063616e277420626520300000000000006044820152606401610cae565b306001600160a01b03821603611b065760405162461bcd60e51b815260206004820152602a60248201527f54726561737572792077616c6c65742063616e2774206265207468652073616d604482015269329030b9903a37b5b2b760b11b6064820152608401610cae565b6018546001600160a01b03808316911603611b335760405162461bcd60e51b8152600401610cae90614e04565b6019546040516001600160a01b03918216918316907f79a52cbec002ef70283103eb4140713100276944fca2819713130141d04df18390600090a3601980546001600160a01b039092166001600160a01b0319909216821790556000908152601f60209081526040808320805460ff199081166001908117909255928052922080549091169091179055565b611bc7612cef565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691600160681b8204811691611c0491600160381b9091041687614d3a565b611c0e9190614d3a565b611c189190614d3a565b611c229190614d3a565b62ffffff161115611c455760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160801b8204811691611c8291600160501b9091041686614d3a565b611c8c9190614d3a565b611c969190614d3a565b611ca09190614d3a565b62ffffff161115611cc35760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff161115611ceb5760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff161115611d135760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff858116825284811660208301526101008404811682840152600160201b9093049092166060830152517f2e7d9780ec398c47872eab5651ba43f0fa44ffed738321577e0db663fe8a05a59181900360800190a16017805466ffffffffffff00191661010062ffffff9485160266ffffff00000000191617600160201b9290931691909102919091179055565b611db2612cef565b6001600160a01b0381163003611df85760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610cae565b611e86611e0d6000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190614e74565b6001600160a01b0384169190613479565b50565b604080516002808252606082018352600092602083019080368337505060025482519293506001600160a01b031691839150600090611eca57611eca614ccb565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611efe57611efe614ccb565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7b9190614e57565b6001600160a01b031681600081518110611f9757611f97614ccb565b60200260200101516001600160a01b03160361202157601d5460195460405163b6f9de9560e01b81526001600160a01b039283169263b6f9de95923492611fea9260009288929116904290600401614ed1565b6000604051808303818588803b15801561200357600080fd5b505af1158015612017573d6000803e3d6000fd5b5050505050612129565b6002546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561207a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209e9190614e74565b90506120b8336002546001600160a01b03169030846134a9565b601d54601954604051635c11d79560e01b81526001600160a01b0392831692635c11d795926120f592869260009289929116904290600401614f06565b600060405180830381600087803b15801561210f57600080fd5b505af1158015612123573d6000803e3d6000fd5b50505050505b6019546001600160a01b031660009081526006602052604090205460ff1615612238576019546001600160a01b03166000908152600460205260409020546008546121749190614cb8565b6008556019546001600160a01b031660009081526003602052604090205460095461219f9190614cb8565b6009556019546001600160a01b031660009081526004602052604090205415612202576019546001600160a01b03166000818152600460209081526040808320549051908152919291600080516020614fe9833981519152910160405180910390a35b601980546001600160a01b0390811660009081526003602090815260408083208390559354909216815260049091529081205550565b6019546001600160a01b031660009081526003602052604081205461225c90610e0a565b90508060085461226c9190614cb8565b6008556019546001600160a01b03166000908152600360205260409020546009546122979190614cb8565b60095580156122d2576019546040518281526000916001600160a01b031690600080516020614fe98339815191529060200160405180910390a35b50601980546001600160a01b0390811660009081526003602090815260408083208390559354909216815260049091529081205550565b6060600c8054610bb190614c46565b612320612cef565b6110a082826132f9565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c41918590610d3c908690614cb8565b6000610c41338484612d49565b612376612cef565b6127106008546123869190614c96565b8110156123e95760405162461bcd60e51b815260206004820152602b60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c53757060448201526a0706c79202f2031303030360ac1b6064820152608401610cae565b601c546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1601c55565b612433612cef565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691610100820481169161246e91600160681b9091041687614d3a565b6124789190614d3a565b6124829190614d3a565b61248c9190614d3a565b62ffffff1611156124af5760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160201b82048116916124ec91600160801b9091041686614d3a565b6124f69190614d3a565b6125009190614d3a565b61250a9190614d3a565b62ffffff16111561252d5760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff1611156125555760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff16111561257d5760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160381b8404811682840152600160501b9093049092166060830152517fdec183740138e3a28dfd6f973ecd3bf00cd5d9b2544f6763c0a87f721444c5d19181900360800190a1601780546cffffffffffff000000000000001916600160381b62ffffff9485160262ffffff60501b191617600160501b9290931691909102919091179055565b612625612cef565b601754620493e09062ffffff6101008204811691600160981b8104821691600160681b820481169161266091600160381b9091041687614d3a565b61266a9190614d3a565b6126749190614d3a565b61267e9190614d3a565b62ffffff1611156126a15760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160201b8204811691600160b01b8104821691600160801b82048116916126de91600160501b9091041686614d3a565b6126e89190614d3a565b6126f29190614d3a565b6126fc9190614d3a565b62ffffff16111561271f5760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff1611156127475760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff16111561276f5760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160c81b8404811682840152600160e01b9093049092166060830152517fdc717222e8a01249bcfb0a887e700321c9465eda757255fd7895bd39fab714d29181900360800190a16017805465ffffffffffff60c81b1916600160c81b62ffffff9485160262ffffff60e01b191617600160e01b9290931691909102919091179055565b612813612cef565b6001600160a01b0382166000908152601f602052604090205481151560ff90911615150361286d5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610cae565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f2d43abd87b27cee7b0aa8c6f7e0b4a3247b683262a83cbc2318b0df398a49aa99101610dfe565b6128cd612cef565b600080546040516001600160a01b039091169047908381818185875af1925050503d806000811461291a576040519150601f19603f3d011682016040523d82523d6000602084013e61291f565b606091505b5050905080611e865760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b6044820152606401610cae565b61296f612cef565b601754620493e09062ffffff600160c81b8204811691600160981b810482169161010082048116916129aa91600160381b9091041687614d3a565b6129b49190614d3a565b6129be9190614d3a565b6129c89190614d3a565b62ffffff1611156129eb5760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160201b8204811691612a2891600160501b9091041686614d3a565b612a329190614d3a565b612a3c9190614d3a565b612a469190614d3a565b62ffffff161115612a695760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff161115612a915760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff161115612ab95760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160681b8404811682840152600160801b9093049092166060830152517f70748cb9cb3bcb4dfd4fff8f2a6f23f636067b33e0244631f9abd38159c1de859181900360800190a16017805465ffffffffffff60681b1916600160681b62ffffff9485160262ffffff60801b191617600160801b9290931691909102919091179055565b612b5d612cef565b6001600160a01b038116612bc25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cae565b611e8681613429565b6001600160a01b038316612c2d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cae565b6001600160a01b038216612c8e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cae565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031633146119a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cae565b6001600160a01b038316612dad5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cae565b6001600160a01b038216612e0f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cae565b6000612e1a30611937565b90506000602354602254612e2e9190614cf8565b90506000601a548210158015612e445750828211155b60175490915060ff16158015612e575750805b8015612e785750601e54600090612e76906001600160a01b0316611937565b115b8015612e9c57506001600160a01b03851660009081526021602052604090205460ff165b15612ea957612ea96134e7565b612ee4600d8054600e55600f805460105560118054601255601380546014556015805460165560009081905590819055908190559182905555565b60175460ff16158015612f1057506001600160a01b0386166000908152601f602052604090205460ff16155b8015612f3557506001600160a01b0385166000908152601f602052604090205460ff16155b15613006576001600160a01b03861660009081526021602052604090205460ff1615612fa35760175462ffffff600160201b82048116600d55600160501b82048116600f55600160801b82048116601155600160b01b82048116601355600160e01b90910416601555613006565b6001600160a01b03851660009081526021602052604090205460ff16156130065760175462ffffff61010082048116600d55600160381b82048116600f55600160681b82048116601155600160981b82048116601355600160c81b909104166015555b613011868686613d40565b613034601654601555601454601355600e54600d55601054600f55601254601155565b60175460ff16613128576001600160a01b038616600090815260208052604090205460ff166130af57601c548411156130af5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d69740000006044820152606401610cae565b6001600160a01b038516600090815260208052604090205460ff1661312857601b546130da86611937565b11156131285760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d6974006044820152606401610cae565b505050505050565b600080600061313d614255565b909250905061314c8183614c96565b9250505090565b600080600080600080613165876143d8565b90506000613172886143f6565b9050600061317f8961440a565b9050600061318c8a61441e565b905060006131998b614432565b949b939a50919850965091945092505050565b8015806132265750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613200573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132249190614e74565b155b6132915760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610cae565b6040516001600160a01b0383166024820152604481018290526132f490849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614446565b505050565b6001600160a01b03821660009081526021602052604090205481151560ff90911615150361338f5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610cae565b6001600160a01b0382166000908152602160205260409020805460ff191682158015919091179091556133ca576133c582611500565b6133d3565b6133d382610e8e565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab9101610dfe565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0383166024820152604481018290526132f490849063a9059cbb60e01b906064016132bd565b6040516001600160a01b03808516602483015283166044820152606481018290526134e19085906323b872dd60e01b906084016132bd565b50505050565b6017805460ff1916600117905560225460009061350690600290614c96565b90506000601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561355d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135819190614e57565b6002546001600160a01b03908116911614613607576002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156135de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136029190614e74565b613609565b475b9050600080601860149054906101000a900460ff1615613935576000602454602354866136369190614cf8565b6136409190614cf8565b90508015613651576136518161451b565b601d54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa15801561369b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136bf9190614e57565b6002546001600160a01b0390811691161461374f576002546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa15801561371c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137409190614e74565b61374a9190614cb8565b613759565b6137598547614cb8565b90506000826023548361376c9190614ce1565b6137769190614c96565b9050826137838884614ce1565b61378d9190614c96565b94508461379a8284614cb8565b6137a49190614cb8565b9350801561392d57601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138239190614e57565b6002546001600160a01b039182169116036138d5576018546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613885576040519150601f19603f3d011682016040523d82523d6000602084013e61388a565b606091505b5050905080156138cf576040805160008152602081018490527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b5061392d565b6018546002546138f2916001600160a01b03918216911683613479565b6040805160008152602081018390527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b505050613ae9565b6000602454856139459190614cf8565b90508015613956576139568161451b565b601d54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156139a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139c49190614e57565b6002546001600160a01b03908116911614613a54576002546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa158015613a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a459190614e74565b613a4f9190614cb8565b613a5e565b613a5e8547614cb8565b905081613a6b8783614ce1565b613a759190614c96565b9350613a818482614cb8565b60235490935015613ae657601854602354613aa99130916001600160a01b0390911690612d49565b60235460408051918252600060208301527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50505b600084118015613af95750600082115b15613b4257613b0884836146d4565b60408051858152602081018490527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a15b8015613cbb57601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbf9190614e57565b6002546001600160a01b03918216911603613c6a576019546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613c21576040519150601f19603f3d011682016040523d82523d6000602084013e613c26565b606091505b505090508015613c64576040518281527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b50613cbb565b601954600254613c87916001600160a01b03918216911683613479565b6040518181527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b6000602381905560248190556022819055613cd530611937565b1115613d30576000546001600160a01b031615613d1557613d1030613d026000546001600160a01b031690565b613d0b30611937565b612d49565b613d30565b601954613d309030906001600160a01b0316613d0b82611937565b50506017805460ff191690555050565b6000806000806000613d5186613153565b94509450945094509450600081838587898b613d6d9190614cb8565b613d779190614cb8565b613d819190614cb8565b613d8b9190614cb8565b613d959190614cb8565b90506000613da1613130565b905082600854613db19190614cb8565b600855613dbe8184614ce1565b600954613dcb9190614cb8565b6009558215613e04576040518381526000906001600160a01b038c1690600080516020614fe98339815191529060200160405180910390a35b85602254613e129190614cf8565b602255602354613e23908690614cf8565b602355602454613e34908590614cf8565b602455600084613e448789614cf8565b613e4e9190614cf8565b9050613e5a8282614ce1565b30600090815260036020526040902054613e749190614cf8565b3060009081526003602090815260408083209390935560069052205460ff1615613ec45730600090815260046020526040902054613eb3908290614cf8565b306000908152600460205260409020555b8015613ef95760405181815230906001600160a01b038d1690600080516020614fe98339815191529060200160405180910390a35b506001600160a01b038a1660009081526006602052604090205460ff168015613f3b57506001600160a01b03891660009081526006602052604090205460ff16155b1561400e576001600160a01b038a16600090815260046020526040902054613f64908990614cb8565b6001600160a01b038b16600090815260046020526040902055613f878189614ce1565b6001600160a01b038b16600090815260036020526040902054613faa9190614cb8565b6001600160a01b038b16600090815260036020526040902055613fcd8183614ce1565b6001600160a01b038a16600090815260036020526040902054613ff09190614cf8565b6001600160a01b038a166000908152600360205260409020556141f4565b6001600160a01b038a1660009081526006602052604090205460ff1615801561404f57506001600160a01b03891660009081526006602052604090205460ff165b156140db5761405e8189614ce1565b6001600160a01b038b166000908152600360205260409020546140819190614cb8565b6001600160a01b03808c16600090815260036020908152604080832094909455918c168152600490915220546140b8908390614cf8565b6001600160a01b038a16600090815260046020526040902055613fcd8183614ce1565b6001600160a01b038a1660009081526006602052604090205460ff16801561411b57506001600160a01b03891660009081526006602052604090205460ff165b15614167576001600160a01b038a16600090815260046020526040902054614144908990614cb8565b6001600160a01b038b1660009081526004602052604090205561405e8189614ce1565b6141718189614ce1565b6001600160a01b038b166000908152600360205260409020546141949190614cb8565b6001600160a01b038b166000908152600360205260409020556141b78183614ce1565b6001600160a01b038a166000908152600360205260409020546141da9190614cf8565b6001600160a01b038a166000908152600360205260409020555b6142076142018289614ce1565b8861489c565b811561424957886001600160a01b03168a6001600160a01b0316600080516020614fe98339815191528460405161424091815260200190565b60405180910390a35b50505050505050505050565b6009546008546000918291825b6007548110156143a75782600360006007848154811061428457614284614ccb565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806142ef57508160046000600784815481106142c8576142c8614ccb565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561430557600954600854945094505050509091565b600360006007838154811061431c5761431c614ccb565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461434b9084614cb8565b9250600460006007838154811061436457614364614ccb565b60009182526020808320909101546001600160a01b031683528201929092526040019020546143939083614cb8565b91508061439f81614d21565b915050614262565b506008546009546143b89190614c96565b8210156143cf576009546008549350935050509091565b90939092509050565b6000620f4240600d54836143ec9190614ce1565b610c459190614c96565b6000620f4240600f54836143ec9190614ce1565b6000620f4240601154836143ec9190614ce1565b6000620f4240601354836143ec9190614ce1565b6000620f4240601554836143ec9190614ce1565b600061449b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148c29092919063ffffffff16565b90508051600014806144bc5750808060200190518101906144bc9190614f42565b6132f45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cae565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061455057614550614ccb565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061458157614581614ccb565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156145da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145fe9190614e57565b6001600160a01b03168160018151811061461a5761461a614ccb565b60200260200101516001600160a01b03160361469757601d5460405163791ac94760e01b81526001600160a01b039091169063791ac94790614669908590600090869030904290600401614f06565b600060405180830381600087803b15801561468357600080fd5b505af1158015613128573d6000803e3d6000fd5b600154601d54604051637274ca1b60e11b81526001600160a01b039283169263e4e994369261466992911690869060009087904290600401614f5f565b601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061474b9190614e57565b6002546001600160a01b039182169116036147fa57601d5460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156147ce573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906147f39190614f9e565b5050505050565b601d5460025460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af1158015614878573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147f39190614f9e565b816009546148aa9190614cb8565b600955600a546148bb908290614cf8565b600a555050565b60606148d184846000856148d9565b949350505050565b60608247101561493a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610cae565b600080866001600160a01b031685876040516149569190614fcc565b60006040518083038185875af1925050503d8060008114614993576040519150601f19603f3d011682016040523d82523d6000602084013e614998565b606091505b50915091506149a9878383876149b4565b979650505050505050565b60608315614a23578251600003614a1c576001600160a01b0385163b614a1c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cae565b50816148d1565b6148d18383815115614a385781518083602001fd5b8060405162461bcd60e51b8152600401610cae9190614a76565b60005b83811015614a6d578181015183820152602001614a55565b50506000910152565b6020815260008251806020840152614a95816040850160208701614a52565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611e8657600080fd5b60008060408385031215614ad157600080fd5b8235614adc81614aa9565b946020939093013593505050565b600060208284031215614afc57600080fd5b5035919050565b600080600060608486031215614b1857600080fd5b8335614b2381614aa9565b92506020840135614b3381614aa9565b929592945050506040919091013590565b8015158114611e8657600080fd5b60008060408385031215614b6557600080fd5b8235614b7081614aa9565b91506020830135614b8081614b44565b809150509250929050565b600060208284031215614b9d57600080fd5b8135610e8781614aa9565b803562ffffff81168114614bbb57600080fd5b919050565b60008060408385031215614bd357600080fd5b614bdc83614ba8565b9150614bea60208401614ba8565b90509250929050565b60008060408385031215614c0657600080fd5b823591506020830135614b8081614b44565b60008060408385031215614c2b57600080fd5b8235614c3681614aa9565b91506020830135614b8081614aa9565b600181811c90821680614c5a57607f821691505b602082108103614c7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082614cb357634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c4557610c45614c80565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610c4557610c45614c80565b80820180821115610c4557610c45614c80565b634e487b7160e01b600052603160045260246000fd5b600060018201614d3357614d33614c80565b5060010190565b62ffffff8181168382160190808211156113b7576113b7614c80565b60208082526015908201527473656c6c20746f74616c20666565203c3d2033302560581b604082015260600190565b60208082526014908201527362757920746f74616c20666565203c3d2033302560601b604082015260600190565b6020808252600f908201526e73656c6c20666565203c3d2031352560881b604082015260600190565b6020808252600e908201526d62757920666565203c3d2031352560901b604082015260600190565b60208082526033908201527f6d61726b6574696e672077616c6c65742063616e27742062652073616d6520776040820152721a5d1a08151c99585cdd5c9e481dd85b1b195d606a1b606082015260800190565b600060208284031215614e6957600080fd5b8151610e8781614aa9565b600060208284031215614e8657600080fd5b5051919050565b600081518084526020808501945080840160005b83811015614ec65781516001600160a01b031687529582019590820190600101614ea1565b509495945050505050565b848152608060208201526000614eea6080830186614e8d565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000614f2560a0830186614e8d565b6001600160a01b0394909416606083015250608001529392505050565b600060208284031215614f5457600080fd5b8151610e8781614b44565b60018060a01b038616815284602082015283604082015260a060608201526000614f8c60a0830185614e8d565b90508260808301529695505050505050565b600080600060608486031215614fb357600080fd5b8351925060208401519150604084015190509250925092565b60008251614fde818460208701614a52565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220394381c3913f18d5a2782a2384120dcf856d803aa2e8b1156da8da472c4cc7ac64736f6c63430008130033a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6886561636820666565203c3d203135250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000026e0a31af79fa08f00000000000000000000000000000000000000000000000026e0a31af79fa08f00000000000000000000000000000000000000000000000026e0a31af79fa08f000000000000000000000000000000c7d1c5433dfc880520afc6ad534bbf9ad8dec0b20000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d86cf748548aaddebb681df2fe9123770d3f0a8200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0dcc752af9be6a07a67934471d7cd901a6094e60000000000000000000000001ccfe8c40ef259566433716002e379dfffbf5a3e000000000000000000000000000000000000000000000000000000000000000b5472756d70734669676874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5472756d707346696768740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f041690d9cbe398d3d51f25c87902c1403affe66

Deployed Bytecode

0x60806040526004361061039b5760003560e01c806382685df5116101dc578063cf188ad011610102578063e71dc3f5116100a0578063f2fde38b1161006f578063f2fde38b14610b33578063f637434214610b53578063f8b45b0514610b76578063fc59d23d14610b8c57600080fd5b8063e71dc3f514610a9e578063e9481eee14610ac1578063ec44adc814610af0578063f11a24d314610b1057600080fd5b8063dd62ed3e116100dc578063dd62ed3e14610a02578063de0aad5314610a48578063df8408fe14610a69578063e086e5ec14610a8957600080fd5b8063cf188ad0146109a2578063d5bf72b7146109c2578063db4091e9146109e257600080fd5b806395d89b411161017a578063aa49802311610149578063aa49802314610919578063adb873bd14610939578063b62496f51461095c578063c8c8ebe41461098c57600080fd5b806395d89b41146108a45780639a7a23d6146108b9578063a457c2d7146108d9578063a9059cbb146108f957600080fd5b806389476069116101b6578063894760691461083b5780638da5cb5b1461085b5780638f0bc16714610879578063921369131461088157600080fd5b806382685df5146107c257806385af30c5146107e257806388f820201461080257600080fd5b80634707c551116102c15780636c516a701161025f57806375f0a8741161022e57806375f0a8741461073f5780637bce5a041461075f5780637c75ad3a14610782578063809d458d146107a257600080fd5b80636c516a70146106ca57806370a08231146106ea578063715018a61461070a57806373b9e82c1461071f57600080fd5b80635342acb41161029b5780635342acb41461063357806357e62b98146106635780635c068a8c146106845780636b2fb124146106a757600080fd5b80634707c551146105d357806348a5317e146105f357806352390c021461061357600080fd5b80632ae2f121116103395780633950935111610308578063395093511461053b5780633fd1c86d1461055b5780634549b0391461057b5780634626402b1461059b57600080fd5b80632ae2f121146104af5780632d838119146104cf578063313ce567146104ef5780633685d4191461051b57600080fd5b806313114a9d1161037557806313114a9d1461043957806318160ddd146104585780631c499ab01461046d57806323b872dd1461048f57600080fd5b806306fdde03146103a7578063095ea7b3146103d25780630cfe2f3f1461040257600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610ba2565b6040516103c99190614a76565b60405180910390f35b3480156103de57600080fd5b506103f26103ed366004614abe565b610c34565b60405190151581526020016103c9565b34801561040e57600080fd5b5060175461042590600160201b900462ffffff1681565b60405162ffffff90911681526020016103c9565b34801561044557600080fd5b50600a545b6040519081526020016103c9565b34801561046457600080fd5b5060085461044a565b34801561047957600080fd5b5061048d610488366004614aea565b610c4b565b005b34801561049b57600080fd5b506103f26104aa366004614b03565b610cf9565b3480156104bb57600080fd5b5061048d6104ca366004614b52565b610d4b565b3480156104db57600080fd5b5061044a6104ea366004614aea565b610e0a565b3480156104fb57600080fd5b50600254600160a01b900460ff1660405160ff90911681526020016103c9565b34801561052757600080fd5b5061048d610536366004614b8b565b610e8e565b34801561054757600080fd5b506103f2610556366004614abe565b6110a4565b34801561056757600080fd5b5061048d610576366004614bc0565b6110db565b34801561058757600080fd5b5061044a610596366004614bf3565b6112c9565b3480156105a757600080fd5b506019546105bb906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b3480156105df57600080fd5b5061048d6105ee366004614b52565b6113be565b3480156105ff57600080fd5b506002546105bb906001600160a01b031681565b34801561061f57600080fd5b5061048d61062e366004614b8b565b611500565b34801561063f57600080fd5b506103f261064e366004614b8b565b601f6020526000908152604090205460ff1681565b34801561066f57600080fd5b506018546103f290600160a01b900460ff1681565b34801561069057600080fd5b5060175461042590600160b01b900462ffffff1681565b3480156106b357600080fd5b5060175461042590600160981b900462ffffff1681565b3480156106d657600080fd5b5061048d6106e5366004614c18565b6116cc565b3480156106f657600080fd5b5061044a610705366004614b8b565b611937565b34801561071657600080fd5b5061048d611996565b34801561072b57600080fd5b5061048d61073a366004614aea565b6119aa565b34801561074b57600080fd5b506018546105bb906001600160a01b031681565b34801561076b57600080fd5b5060175461042590600160801b900462ffffff1681565b34801561078e57600080fd5b506001546105bb906001600160a01b031681565b3480156107ae57600080fd5b5061048d6107bd366004614b8b565b611a3d565b3480156107ce57600080fd5b5061048d6107dd366004614bc0565b611bbf565b3480156107ee57600080fd5b50601e546105bb906001600160a01b031681565b34801561080e57600080fd5b506103f261081d366004614b8b565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561084757600080fd5b5061048d610856366004614b8b565b611daa565b34801561086757600080fd5b506000546001600160a01b03166105bb565b61048d611e89565b34801561088d57600080fd5b5060175461042590600160681b900462ffffff1681565b3480156108b057600080fd5b506103bc612309565b3480156108c557600080fd5b5061048d6108d4366004614b52565b612318565b3480156108e557600080fd5b506103f26108f4366004614abe565b61232a565b34801561090557600080fd5b506103f2610914366004614abe565b612361565b34801561092557600080fd5b5061048d610934366004614aea565b61236e565b34801561094557600080fd5b5060175461042590600160c81b900462ffffff1681565b34801561096857600080fd5b506103f2610977366004614b8b565b60216020526000908152604090205460ff1681565b34801561099857600080fd5b5061044a601c5481565b3480156109ae57600080fd5b50601d546105bb906001600160a01b031681565b3480156109ce57600080fd5b5061048d6109dd366004614bc0565b61242b565b3480156109ee57600080fd5b5061048d6109fd366004614bc0565b61261d565b348015610a0e57600080fd5b5061044a610a1d366004614c18565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a5457600080fd5b5060175461042590610100900462ffffff1681565b348015610a7557600080fd5b5061048d610a84366004614b52565b61280b565b348015610a9557600080fd5b5061048d6128c5565b348015610aaa57600080fd5b5060175461042590600160e01b900462ffffff1681565b348015610acd57600080fd5b506103f2610adc366004614b8b565b602080526000908152604090205460ff1681565b348015610afc57600080fd5b5061048d610b0b366004614bc0565b612967565b348015610b1c57600080fd5b5060175461042590600160501b900462ffffff1681565b348015610b3f57600080fd5b5061048d610b4e366004614b8b565b612b55565b348015610b5f57600080fd5b5060175461042590600160381b900462ffffff1681565b348015610b8257600080fd5b5061044a601b5481565b348015610b9857600080fd5b5061044a601a5481565b6060600b8054610bb190614c46565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd90614c46565b8015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b5050505050905090565b6000610c41338484612bcb565b5060015b92915050565b610c53612cef565b612710600854610c639190614c96565b811015610cb75760405162461bcd60e51b815260206004820181905260248201527f6d617857616c6c6574203e3d20746f74616c537570706c79202f20313030303060448201526064015b60405180910390fd5b601b546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601b55565b6000610d06848484612d49565b6001600160a01b038416600090815260056020908152604080832033808552925290912054610d41918691610d3c908690614cb8565b612bcb565b5060019392505050565b610d53612cef565b6001600160a01b038216600090815260208052604090205481151560ff909116151503610dac5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610cae565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b6000600954821115610e715760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610cae565b6000610e7b613130565b9050610e878184614c96565b9392505050565b610e96612cef565b6001600160a01b03811660009081526006602052604090205460ff16610efe5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610cae565b60005b6007548110156110a057816001600160a01b031660078281548110610f2857610f28614ccb565b6000918252602090912001546001600160a01b03160361108e576001600160a01b038216600090815260036020526040902054610f63613130565b6001600160a01b038416600090815260046020526040902054610f869190614ce1565b6001600160a01b0384166000908152600360205260409020819055600954610faf908390614cb8565b610fb99190614cf8565b6009556001600160a01b0383166000908152600660205260409020805460ff1916905560078054610fec90600190614cb8565b81548110610ffc57610ffc614ccb565b600091825260209091200154600780546001600160a01b03909216918490811061102857611028614ccb565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600780548061106757611067614d0b565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b8061109881614d21565b915050610f01565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c41918590610d3c908690614cf8565b6110e3612cef565b601754620493e09062ffffff600160c81b82048116916101008104821691600160681b820481169161111e91600160381b9091041687614d3a565b6111289190614d3a565b6111329190614d3a565b61113c9190614d3a565b62ffffff16111561115f5760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160201b8104821691600160801b820481169161119c91600160501b9091041686614d3a565b6111a69190614d3a565b6111b09190614d3a565b6111ba9190614d3a565b62ffffff1611156111dd5760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff1611156112055760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff16111561122d5760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160981b8404811682840152600160b01b9093049092166060830152517fc239c020ec275d4a3e59d37954f59c061e7302d35a1b6bad801059aafe9631ee9181900360800190a16017805465ffffffffffff60981b1916600160981b62ffffff9485160262ffffff60b01b191617600160b01b9290931691909102919091179055565b600060085483111561131d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610cae565b6000611327613130565b90508261134457600061133a8286614ce1565b9250610c45915050565b600080600080600061135589613153565b94509450945094509450600081838587898e6113719190614cb8565b61137b9190614cb8565b6113859190614cb8565b61138f9190614cb8565b6113999190614cb8565b905060006113a78883614ce1565b9850610c45975050505050505050565b5092915050565b6113c6612cef565b6001600160a01b03821661141c5760405162461bcd60e51b815260206004820152601b60248201527f6d61726b6574696e672077616c6c65742063616e2774206265203000000000006044820152606401610cae565b6019546001600160a01b039081169083160361144a5760405162461bcd60e51b8152600401610cae90614e04565b601854604080518315158152600160a01b830460ff16151560208201526001600160a01b03928316928516917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a360188054911515600160a01b026001600160a81b03199092166001600160a01b039093169283179190911790556000908152601f60209081526040808320805460ff199081166001908117909255928052922080549091169091179055565b611508612cef565b6001600160a01b03811660009081526006602052604090205460ff16156115715760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cae565b600754603290611582906001614cf8565b111561160c5760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a401610cae565b6001600160a01b03811660009081526003602052604090205415611666576001600160a01b03811660009081526003602052604090205461164c90610e0a565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600660205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6116d4612cef565b600280546001600160a01b0319166001600160a01b0383811691909117909155601d5483821691161461172a5761170e3083600019612bcb565b601d80546001600160a01b0319166001600160a01b0384161790555b601d60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561177d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a19190614e57565b6002546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156117f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118169190614e57565b601e80546001600160a01b0319166001600160a01b03928316179055601d54604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa158015611874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118989190614e57565b6002546001600160a01b039081169116146118cc57601d546002546118cc916001600160a01b0391821691166000196131ac565b601d54601e54600254604080516001600160a01b039485168152928416602084015292168183015290517f113a6e83812f48b2f83795e33cb009afb4ba6e240c9c643c5dc75791e4ce7ab69181900360600190a1601e546110a0906001600160a01b031660016132f9565b6001600160a01b03811660009081526006602052604081205460ff161561197457506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610c4590610e0a565b61199e612cef565b6119a86000613429565b565b6119b2612cef565b600081116119fb5760405162461bcd60e51b815260206004820152601660248201527506d696e416d6f756e74546f54616b65466565203e20360541b6044820152606401610cae565b601a546040805183815260208101929092527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a1601a55565b611a45612cef565b6001600160a01b038116611a9b5760405162461bcd60e51b815260206004820152601a60248201527f54726561737572792077616c6c65742063616e277420626520300000000000006044820152606401610cae565b306001600160a01b03821603611b065760405162461bcd60e51b815260206004820152602a60248201527f54726561737572792077616c6c65742063616e2774206265207468652073616d604482015269329030b9903a37b5b2b760b11b6064820152608401610cae565b6018546001600160a01b03808316911603611b335760405162461bcd60e51b8152600401610cae90614e04565b6019546040516001600160a01b03918216918316907f79a52cbec002ef70283103eb4140713100276944fca2819713130141d04df18390600090a3601980546001600160a01b039092166001600160a01b0319909216821790556000908152601f60209081526040808320805460ff199081166001908117909255928052922080549091169091179055565b611bc7612cef565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691600160681b8204811691611c0491600160381b9091041687614d3a565b611c0e9190614d3a565b611c189190614d3a565b611c229190614d3a565b62ffffff161115611c455760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160801b8204811691611c8291600160501b9091041686614d3a565b611c8c9190614d3a565b611c969190614d3a565b611ca09190614d3a565b62ffffff161115611cc35760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff161115611ceb5760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff161115611d135760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff858116825284811660208301526101008404811682840152600160201b9093049092166060830152517f2e7d9780ec398c47872eab5651ba43f0fa44ffed738321577e0db663fe8a05a59181900360800190a16017805466ffffffffffff00191661010062ffffff9485160266ffffff00000000191617600160201b9290931691909102919091179055565b611db2612cef565b6001600160a01b0381163003611df85760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610cae565b611e86611e0d6000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190614e74565b6001600160a01b0384169190613479565b50565b604080516002808252606082018352600092602083019080368337505060025482519293506001600160a01b031691839150600090611eca57611eca614ccb565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611efe57611efe614ccb565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7b9190614e57565b6001600160a01b031681600081518110611f9757611f97614ccb565b60200260200101516001600160a01b03160361202157601d5460195460405163b6f9de9560e01b81526001600160a01b039283169263b6f9de95923492611fea9260009288929116904290600401614ed1565b6000604051808303818588803b15801561200357600080fd5b505af1158015612017573d6000803e3d6000fd5b5050505050612129565b6002546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561207a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209e9190614e74565b90506120b8336002546001600160a01b03169030846134a9565b601d54601954604051635c11d79560e01b81526001600160a01b0392831692635c11d795926120f592869260009289929116904290600401614f06565b600060405180830381600087803b15801561210f57600080fd5b505af1158015612123573d6000803e3d6000fd5b50505050505b6019546001600160a01b031660009081526006602052604090205460ff1615612238576019546001600160a01b03166000908152600460205260409020546008546121749190614cb8565b6008556019546001600160a01b031660009081526003602052604090205460095461219f9190614cb8565b6009556019546001600160a01b031660009081526004602052604090205415612202576019546001600160a01b03166000818152600460209081526040808320549051908152919291600080516020614fe9833981519152910160405180910390a35b601980546001600160a01b0390811660009081526003602090815260408083208390559354909216815260049091529081205550565b6019546001600160a01b031660009081526003602052604081205461225c90610e0a565b90508060085461226c9190614cb8565b6008556019546001600160a01b03166000908152600360205260409020546009546122979190614cb8565b60095580156122d2576019546040518281526000916001600160a01b031690600080516020614fe98339815191529060200160405180910390a35b50601980546001600160a01b0390811660009081526003602090815260408083208390559354909216815260049091529081205550565b6060600c8054610bb190614c46565b612320612cef565b6110a082826132f9565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c41918590610d3c908690614cb8565b6000610c41338484612d49565b612376612cef565b6127106008546123869190614c96565b8110156123e95760405162461bcd60e51b815260206004820152602b60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c53757060448201526a0706c79202f2031303030360ac1b6064820152608401610cae565b601c546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1601c55565b612433612cef565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691610100820481169161246e91600160681b9091041687614d3a565b6124789190614d3a565b6124829190614d3a565b61248c9190614d3a565b62ffffff1611156124af5760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160201b82048116916124ec91600160801b9091041686614d3a565b6124f69190614d3a565b6125009190614d3a565b61250a9190614d3a565b62ffffff16111561252d5760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff1611156125555760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff16111561257d5760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160381b8404811682840152600160501b9093049092166060830152517fdec183740138e3a28dfd6f973ecd3bf00cd5d9b2544f6763c0a87f721444c5d19181900360800190a1601780546cffffffffffff000000000000001916600160381b62ffffff9485160262ffffff60501b191617600160501b9290931691909102919091179055565b612625612cef565b601754620493e09062ffffff6101008204811691600160981b8104821691600160681b820481169161266091600160381b9091041687614d3a565b61266a9190614d3a565b6126749190614d3a565b61267e9190614d3a565b62ffffff1611156126a15760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160201b8204811691600160b01b8104821691600160801b82048116916126de91600160501b9091041686614d3a565b6126e89190614d3a565b6126f29190614d3a565b6126fc9190614d3a565b62ffffff16111561271f5760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff1611156127475760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff16111561276f5760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160c81b8404811682840152600160e01b9093049092166060830152517fdc717222e8a01249bcfb0a887e700321c9465eda757255fd7895bd39fab714d29181900360800190a16017805465ffffffffffff60c81b1916600160c81b62ffffff9485160262ffffff60e01b191617600160e01b9290931691909102919091179055565b612813612cef565b6001600160a01b0382166000908152601f602052604090205481151560ff90911615150361286d5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610cae565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f2d43abd87b27cee7b0aa8c6f7e0b4a3247b683262a83cbc2318b0df398a49aa99101610dfe565b6128cd612cef565b600080546040516001600160a01b039091169047908381818185875af1925050503d806000811461291a576040519150601f19603f3d011682016040523d82523d6000602084013e61291f565b606091505b5050905080611e865760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b6044820152606401610cae565b61296f612cef565b601754620493e09062ffffff600160c81b8204811691600160981b810482169161010082048116916129aa91600160381b9091041687614d3a565b6129b49190614d3a565b6129be9190614d3a565b6129c89190614d3a565b62ffffff1611156129eb5760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160201b8204811691612a2891600160501b9091041686614d3a565b612a329190614d3a565b612a3c9190614d3a565b612a469190614d3a565b62ffffff161115612a695760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff161115612a915760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff161115612ab95760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160681b8404811682840152600160801b9093049092166060830152517f70748cb9cb3bcb4dfd4fff8f2a6f23f636067b33e0244631f9abd38159c1de859181900360800190a16017805465ffffffffffff60681b1916600160681b62ffffff9485160262ffffff60801b191617600160801b9290931691909102919091179055565b612b5d612cef565b6001600160a01b038116612bc25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cae565b611e8681613429565b6001600160a01b038316612c2d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cae565b6001600160a01b038216612c8e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cae565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031633146119a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cae565b6001600160a01b038316612dad5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cae565b6001600160a01b038216612e0f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cae565b6000612e1a30611937565b90506000602354602254612e2e9190614cf8565b90506000601a548210158015612e445750828211155b60175490915060ff16158015612e575750805b8015612e785750601e54600090612e76906001600160a01b0316611937565b115b8015612e9c57506001600160a01b03851660009081526021602052604090205460ff165b15612ea957612ea96134e7565b612ee4600d8054600e55600f805460105560118054601255601380546014556015805460165560009081905590819055908190559182905555565b60175460ff16158015612f1057506001600160a01b0386166000908152601f602052604090205460ff16155b8015612f3557506001600160a01b0385166000908152601f602052604090205460ff16155b15613006576001600160a01b03861660009081526021602052604090205460ff1615612fa35760175462ffffff600160201b82048116600d55600160501b82048116600f55600160801b82048116601155600160b01b82048116601355600160e01b90910416601555613006565b6001600160a01b03851660009081526021602052604090205460ff16156130065760175462ffffff61010082048116600d55600160381b82048116600f55600160681b82048116601155600160981b82048116601355600160c81b909104166015555b613011868686613d40565b613034601654601555601454601355600e54600d55601054600f55601254601155565b60175460ff16613128576001600160a01b038616600090815260208052604090205460ff166130af57601c548411156130af5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d69740000006044820152606401610cae565b6001600160a01b038516600090815260208052604090205460ff1661312857601b546130da86611937565b11156131285760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d6974006044820152606401610cae565b505050505050565b600080600061313d614255565b909250905061314c8183614c96565b9250505090565b600080600080600080613165876143d8565b90506000613172886143f6565b9050600061317f8961440a565b9050600061318c8a61441e565b905060006131998b614432565b949b939a50919850965091945092505050565b8015806132265750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613200573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132249190614e74565b155b6132915760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610cae565b6040516001600160a01b0383166024820152604481018290526132f490849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614446565b505050565b6001600160a01b03821660009081526021602052604090205481151560ff90911615150361338f5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610cae565b6001600160a01b0382166000908152602160205260409020805460ff191682158015919091179091556133ca576133c582611500565b6133d3565b6133d382610e8e565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab9101610dfe565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0383166024820152604481018290526132f490849063a9059cbb60e01b906064016132bd565b6040516001600160a01b03808516602483015283166044820152606481018290526134e19085906323b872dd60e01b906084016132bd565b50505050565b6017805460ff1916600117905560225460009061350690600290614c96565b90506000601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561355d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135819190614e57565b6002546001600160a01b03908116911614613607576002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156135de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136029190614e74565b613609565b475b9050600080601860149054906101000a900460ff1615613935576000602454602354866136369190614cf8565b6136409190614cf8565b90508015613651576136518161451b565b601d54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa15801561369b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136bf9190614e57565b6002546001600160a01b0390811691161461374f576002546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa15801561371c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137409190614e74565b61374a9190614cb8565b613759565b6137598547614cb8565b90506000826023548361376c9190614ce1565b6137769190614c96565b9050826137838884614ce1565b61378d9190614c96565b94508461379a8284614cb8565b6137a49190614cb8565b9350801561392d57601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138239190614e57565b6002546001600160a01b039182169116036138d5576018546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613885576040519150601f19603f3d011682016040523d82523d6000602084013e61388a565b606091505b5050905080156138cf576040805160008152602081018490527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b5061392d565b6018546002546138f2916001600160a01b03918216911683613479565b6040805160008152602081018390527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b505050613ae9565b6000602454856139459190614cf8565b90508015613956576139568161451b565b601d54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156139a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139c49190614e57565b6002546001600160a01b03908116911614613a54576002546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa158015613a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a459190614e74565b613a4f9190614cb8565b613a5e565b613a5e8547614cb8565b905081613a6b8783614ce1565b613a759190614c96565b9350613a818482614cb8565b60235490935015613ae657601854602354613aa99130916001600160a01b0390911690612d49565b60235460408051918252600060208301527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50505b600084118015613af95750600082115b15613b4257613b0884836146d4565b60408051858152602081018490527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a15b8015613cbb57601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbf9190614e57565b6002546001600160a01b03918216911603613c6a576019546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613c21576040519150601f19603f3d011682016040523d82523d6000602084013e613c26565b606091505b505090508015613c64576040518281527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b50613cbb565b601954600254613c87916001600160a01b03918216911683613479565b6040518181527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b6000602381905560248190556022819055613cd530611937565b1115613d30576000546001600160a01b031615613d1557613d1030613d026000546001600160a01b031690565b613d0b30611937565b612d49565b613d30565b601954613d309030906001600160a01b0316613d0b82611937565b50506017805460ff191690555050565b6000806000806000613d5186613153565b94509450945094509450600081838587898b613d6d9190614cb8565b613d779190614cb8565b613d819190614cb8565b613d8b9190614cb8565b613d959190614cb8565b90506000613da1613130565b905082600854613db19190614cb8565b600855613dbe8184614ce1565b600954613dcb9190614cb8565b6009558215613e04576040518381526000906001600160a01b038c1690600080516020614fe98339815191529060200160405180910390a35b85602254613e129190614cf8565b602255602354613e23908690614cf8565b602355602454613e34908590614cf8565b602455600084613e448789614cf8565b613e4e9190614cf8565b9050613e5a8282614ce1565b30600090815260036020526040902054613e749190614cf8565b3060009081526003602090815260408083209390935560069052205460ff1615613ec45730600090815260046020526040902054613eb3908290614cf8565b306000908152600460205260409020555b8015613ef95760405181815230906001600160a01b038d1690600080516020614fe98339815191529060200160405180910390a35b506001600160a01b038a1660009081526006602052604090205460ff168015613f3b57506001600160a01b03891660009081526006602052604090205460ff16155b1561400e576001600160a01b038a16600090815260046020526040902054613f64908990614cb8565b6001600160a01b038b16600090815260046020526040902055613f878189614ce1565b6001600160a01b038b16600090815260036020526040902054613faa9190614cb8565b6001600160a01b038b16600090815260036020526040902055613fcd8183614ce1565b6001600160a01b038a16600090815260036020526040902054613ff09190614cf8565b6001600160a01b038a166000908152600360205260409020556141f4565b6001600160a01b038a1660009081526006602052604090205460ff1615801561404f57506001600160a01b03891660009081526006602052604090205460ff165b156140db5761405e8189614ce1565b6001600160a01b038b166000908152600360205260409020546140819190614cb8565b6001600160a01b03808c16600090815260036020908152604080832094909455918c168152600490915220546140b8908390614cf8565b6001600160a01b038a16600090815260046020526040902055613fcd8183614ce1565b6001600160a01b038a1660009081526006602052604090205460ff16801561411b57506001600160a01b03891660009081526006602052604090205460ff165b15614167576001600160a01b038a16600090815260046020526040902054614144908990614cb8565b6001600160a01b038b1660009081526004602052604090205561405e8189614ce1565b6141718189614ce1565b6001600160a01b038b166000908152600360205260409020546141949190614cb8565b6001600160a01b038b166000908152600360205260409020556141b78183614ce1565b6001600160a01b038a166000908152600360205260409020546141da9190614cf8565b6001600160a01b038a166000908152600360205260409020555b6142076142018289614ce1565b8861489c565b811561424957886001600160a01b03168a6001600160a01b0316600080516020614fe98339815191528460405161424091815260200190565b60405180910390a35b50505050505050505050565b6009546008546000918291825b6007548110156143a75782600360006007848154811061428457614284614ccb565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806142ef57508160046000600784815481106142c8576142c8614ccb565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561430557600954600854945094505050509091565b600360006007838154811061431c5761431c614ccb565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461434b9084614cb8565b9250600460006007838154811061436457614364614ccb565b60009182526020808320909101546001600160a01b031683528201929092526040019020546143939083614cb8565b91508061439f81614d21565b915050614262565b506008546009546143b89190614c96565b8210156143cf576009546008549350935050509091565b90939092509050565b6000620f4240600d54836143ec9190614ce1565b610c459190614c96565b6000620f4240600f54836143ec9190614ce1565b6000620f4240601154836143ec9190614ce1565b6000620f4240601354836143ec9190614ce1565b6000620f4240601554836143ec9190614ce1565b600061449b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148c29092919063ffffffff16565b90508051600014806144bc5750808060200190518101906144bc9190614f42565b6132f45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cae565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061455057614550614ccb565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061458157614581614ccb565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156145da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145fe9190614e57565b6001600160a01b03168160018151811061461a5761461a614ccb565b60200260200101516001600160a01b03160361469757601d5460405163791ac94760e01b81526001600160a01b039091169063791ac94790614669908590600090869030904290600401614f06565b600060405180830381600087803b15801561468357600080fd5b505af1158015613128573d6000803e3d6000fd5b600154601d54604051637274ca1b60e11b81526001600160a01b039283169263e4e994369261466992911690869060009087904290600401614f5f565b601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061474b9190614e57565b6002546001600160a01b039182169116036147fa57601d5460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156147ce573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906147f39190614f9e565b5050505050565b601d5460025460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af1158015614878573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147f39190614f9e565b816009546148aa9190614cb8565b600955600a546148bb908290614cf8565b600a555050565b60606148d184846000856148d9565b949350505050565b60608247101561493a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610cae565b600080866001600160a01b031685876040516149569190614fcc565b60006040518083038185875af1925050503d8060008114614993576040519150601f19603f3d011682016040523d82523d6000602084013e614998565b606091505b50915091506149a9878383876149b4565b979650505050505050565b60608315614a23578251600003614a1c576001600160a01b0385163b614a1c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cae565b50816148d1565b6148d18383815115614a385781518083602001fd5b8060405162461bcd60e51b8152600401610cae9190614a76565b60005b83811015614a6d578181015183820152602001614a55565b50506000910152565b6020815260008251806020840152614a95816040850160208701614a52565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611e8657600080fd5b60008060408385031215614ad157600080fd5b8235614adc81614aa9565b946020939093013593505050565b600060208284031215614afc57600080fd5b5035919050565b600080600060608486031215614b1857600080fd5b8335614b2381614aa9565b92506020840135614b3381614aa9565b929592945050506040919091013590565b8015158114611e8657600080fd5b60008060408385031215614b6557600080fd5b8235614b7081614aa9565b91506020830135614b8081614b44565b809150509250929050565b600060208284031215614b9d57600080fd5b8135610e8781614aa9565b803562ffffff81168114614bbb57600080fd5b919050565b60008060408385031215614bd357600080fd5b614bdc83614ba8565b9150614bea60208401614ba8565b90509250929050565b60008060408385031215614c0657600080fd5b823591506020830135614b8081614b44565b60008060408385031215614c2b57600080fd5b8235614c3681614aa9565b91506020830135614b8081614aa9565b600181811c90821680614c5a57607f821691505b602082108103614c7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082614cb357634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c4557610c45614c80565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610c4557610c45614c80565b80820180821115610c4557610c45614c80565b634e487b7160e01b600052603160045260246000fd5b600060018201614d3357614d33614c80565b5060010190565b62ffffff8181168382160190808211156113b7576113b7614c80565b60208082526015908201527473656c6c20746f74616c20666565203c3d2033302560581b604082015260600190565b60208082526014908201527362757920746f74616c20666565203c3d2033302560601b604082015260600190565b6020808252600f908201526e73656c6c20666565203c3d2031352560881b604082015260600190565b6020808252600e908201526d62757920666565203c3d2031352560901b604082015260600190565b60208082526033908201527f6d61726b6574696e672077616c6c65742063616e27742062652073616d6520776040820152721a5d1a08151c99585cdd5c9e481dd85b1b195d606a1b606082015260800190565b600060208284031215614e6957600080fd5b8151610e8781614aa9565b600060208284031215614e8657600080fd5b5051919050565b600081518084526020808501945080840160005b83811015614ec65781516001600160a01b031687529582019590820190600101614ea1565b509495945050505050565b848152608060208201526000614eea6080830186614e8d565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000614f2560a0830186614e8d565b6001600160a01b0394909416606083015250608001529392505050565b600060208284031215614f5457600080fd5b8151610e8781614b44565b60018060a01b038616815284602082015283604082015260a060608201526000614f8c60a0830185614e8d565b90508260808301529695505050505050565b600080600060608486031215614fb357600080fd5b8351925060208401519150604084015190509250925092565b60008251614fde818460208701614a52565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220394381c3913f18d5a2782a2384120dcf856d803aa2e8b1156da8da472c4cc7ac64736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000026e0a31af79fa08f00000000000000000000000000000000000000000000000026e0a31af79fa08f00000000000000000000000000000000000000000000000026e0a31af79fa08f000000000000000000000000000000c7d1c5433dfc880520afc6ad534bbf9ad8dec0b20000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d86cf748548aaddebb681df2fe9123770d3f0a8200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0dcc752af9be6a07a67934471d7cd901a6094e60000000000000000000000001ccfe8c40ef259566433716002e379dfffbf5a3e000000000000000000000000000000000000000000000000000000000000000b5472756d70734669676874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5472756d707346696768740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f041690d9cbe398d3d51f25c87902c1403affe66

-----Decoded View---------------
Arg [0] : args (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : autoApproveAddressList (address[]): 0xF041690D9cBE398d3D51F25C87902C1403AffE66
Arg [2] : referrer (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
32 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 00000000000000000000000000000000000000000000000000000000000002e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [6] : 00000000000000000000000000000000000000000026e0a31af79fa08f000000
Arg [7] : 00000000000000000000000000000000000000000026e0a31af79fa08f000000
Arg [8] : 00000000000000000000000000000000000000000026e0a31af79fa08f000000
Arg [9] : 000000000000000000000000c7d1c5433dfc880520afc6ad534bbf9ad8dec0b2
Arg [10] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [11] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [12] : 000000000000000000000000d86cf748548aaddebb681df2fe9123770d3f0a82
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [17] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [18] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [19] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [24] : 000000000000000000000000c0dcc752af9be6a07a67934471d7cd901a6094e6
Arg [25] : 0000000000000000000000001ccfe8c40ef259566433716002e379dfffbf5a3e
Arg [26] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [27] : 5472756d70734669676874000000000000000000000000000000000000000000
Arg [28] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [29] : 5472756d70734669676874000000000000000000000000000000000000000000
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [31] : 000000000000000000000000f041690d9cbe398d3d51f25c87902c1403affe66


Deployed Bytecode Sourcemap

20133:40620:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38322:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39319:193;;;;;;;;;;-1:-1:-1;39319:193:0;;;;;:::i;:::-;;:::i;:::-;;;1291:14:1;;1284:22;1266:41;;1254:2;1239:18;39319:193:0;1126:187:1;22012:26:0;;;;;;;;;;-1:-1:-1;22012:26:0;;;;-1:-1:-1;;;22012:26:0;;;;;;;;;1492:8:1;1480:21;;;1462:40;;1450:2;1435:18;22012:26:0;1318:190:1;40696:94:0;;;;;;;;;;-1:-1:-1;40767:15:0;;40696:94;;;1659:25:1;;;1647:2;1632:18;40696:94:0;1513:177:1;38605:97:0;;;;;;;;;;-1:-1:-1;38687:7:0;;38605:97;;34445:242;;;;;;;;;;-1:-1:-1;34445:242:0;;;;;:::i;:::-;;:::i;:::-;;39520:350;;;;;;;;;;-1:-1:-1;39520:350:0;;;;;:::i;:::-;;:::i;50520:323::-;;;;;;;;;;-1:-1:-1;50520:323:0;;;;;:::i;:::-;;:::i;41685:317::-;;;;;;;;;;-1:-1:-1;41685:317:0;;;;;:::i;:::-;;:::i;38512:85::-;;;;;;;;;;-1:-1:-1;38580:9:0;;-1:-1:-1;;;38580:9:0;;;;38512:85;;3023:4:1;3011:17;;;2993:36;;2981:2;2966:18;38512:85:0;2851:184:1;42514:613:0;;;;;;;;;;-1:-1:-1;42514:613:0;;;;;:::i;:::-;;:::i;39878:299::-;;;;;;;;;;-1:-1:-1;39878:299:0;;;;;:::i;:::-;;:::i;46239:862::-;;;;;;;;;;-1:-1:-1;46239:862:0;;;;;:::i;:::-;;:::i;40798:879::-;;;;;;;;;;-1:-1:-1;40798:879:0;;;;;:::i;:::-;;:::i;22412:29::-;;;;;;;;;;-1:-1:-1;22412:29:0;;;;-1:-1:-1;;;;;22412:29:0;;;;;;-1:-1:-1;;;;;4197:32:1;;;4179:51;;4167:2;4152:18;22412:29:0;4033:203:1;47923:701:0;;;;;;;;;;-1:-1:-1;47923:701:0;;;;;:::i;:::-;;:::i;21016:33::-;;;;;;;;;;-1:-1:-1;21016:33:0;;;;-1:-1:-1;;;;;21016:33:0;;;42010:496;;;;;;;;;;-1:-1:-1;42010:496:0;;;;;:::i;:::-;;:::i;22646:49::-;;;;;;;;;;-1:-1:-1;22646:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22370:35;;;;;;;;;;-1:-1:-1;22370:35:0;;;;-1:-1:-1;;;22370:35:0;;;;;;22231:28;;;;;;;;;;-1:-1:-1;22231:28:0;;;;-1:-1:-1;;;22231:28:0;;;;;;22195:29;;;;;;;;;;-1:-1:-1;22195:29:0;;;;-1:-1:-1;;;22195:29:0;;;;;;30975:799;;;;;;;;;;-1:-1:-1;30975:799:0;;;;;:::i;:::-;;:::i;38710:198::-;;;;;;;;;;-1:-1:-1;38710:198:0;;;;;:::i;:::-;;:::i;5942:103::-;;;;;;;;;;;;;:::i;49283:322::-;;;;;;;;;;-1:-1:-1;49283:322:0;;;;;:::i;:::-;;:::i;22333:30::-;;;;;;;;;;-1:-1:-1;22333:30:0;;;;-1:-1:-1;;;;;22333:30:0;;;22157:29;;;;;;;;;;-1:-1:-1;22157:29:0;;;;-1:-1:-1;;;22157:29:0;;;;;;20970:39;;;;;;;;;;-1:-1:-1;20970:39:0;;;;-1:-1:-1;;;;;20970:39:0;;;48632:643;;;;;;;;;;-1:-1:-1;48632:643:0;;;;;:::i;:::-;;:::i;45397:834::-;;;;;;;;;;-1:-1:-1;45397:834:0;;;;;:::i;:::-;;:::i;22614:23::-;;;;;;;;;;-1:-1:-1;22614:23:0;;;;-1:-1:-1;;;;;22614:23:0;;;40534:154;;;;;;;;;;-1:-1:-1;40534:154:0;;;;;:::i;:::-;-1:-1:-1;;;;;40660:20:0;40631:4;40660:20;;;:11;:20;;;;;;;;;40534:154;60508:207;;;;;;;;;;-1:-1:-1;60508:207:0;;;;;:::i;:::-;;:::i;5711:87::-;;;;;;;;;;-1:-1:-1;5757:7:0;5784:6;-1:-1:-1;;;;;5784:6:0;5711:87;;58485:1827;;;:::i;22120:30::-;;;;;;;;;;-1:-1:-1;22120:30:0;;;;-1:-1:-1;;;22120:30:0;;;;;;38415:89;;;;;;;;;;;;;:::i;49613:163::-;;;;;;;;;;-1:-1:-1;49613:163:0;;;;;:::i;:::-;;:::i;40185:341::-;;;;;;;;;;-1:-1:-1;40185:341:0;;;;;:::i;:::-;;:::i;38916:201::-;;;;;;;;;;-1:-1:-1;38916:201:0;;;;;:::i;:::-;;:::i;34695:366::-;;;;;;;;;;-1:-1:-1;34695:366:0;;;;;:::i;:::-;;:::i;22268:25::-;;;;;;;;;;-1:-1:-1;22268:25:0;;;;-1:-1:-1;;;22268:25:0;;;;;;22775:57;;;;;;;;;;-1:-1:-1;22775:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22525:35;;;;;;;;;;;;;;;;22571:36;;;;;;;;;;-1:-1:-1;22571:36:0;;;;-1:-1:-1;;;;;22571:36:0;;;43634:874;;;;;;;;;;-1:-1:-1;43634:874:0;;;;;:::i;:::-;;:::i;47109:806::-;;;;;;;;;;-1:-1:-1;47109:806:0;;;;;:::i;:::-;;:::i;39125:186::-;;;;;;;;;;-1:-1:-1;39125:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;39276:18:0;;;39244:7;39276:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;39125:186;21978:27;;;;;;;;;;-1:-1:-1;21978:27:0;;;;;;;;;;;50278:234;;;;;;;;;;-1:-1:-1;50278:234:0;;;;;:::i;:::-;;:::i;60318:184::-;;;;;;;;;;;;;:::i;22300:24::-;;;;;;;;;;-1:-1:-1;22300:24:0;;;;-1:-1:-1;;;22300:24:0;;;;;;22702:66;;;;;;;;;;-1:-1:-1;22702:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44516:873;;;;;;;;;;-1:-1:-1;44516:873:0;;;;;:::i;:::-;;:::i;22082:29::-;;;;;;;;;;-1:-1:-1;22082:29:0;;;;-1:-1:-1;;;22082:29:0;;;;;;6051:201;;;;;;;;;;-1:-1:-1;6051:201:0;;;;;:::i;:::-;;:::i;22045:30::-;;;;;;;;;;-1:-1:-1;22045:30:0;;;;-1:-1:-1;;;22045:30:0;;;;;;22494:24;;;;;;;;;;;;;;;;22454:33;;;;;;;;;;;;;;;;38322:85;38361:13;38394:5;38387:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38322:85;:::o;39319:193::-;39421:4;39443:39;5270:10;39466:7;39475:6;39443:8;:39::i;:::-;-1:-1:-1;39500:4:0;39319:193;;;;;:::o;34445:242::-;5672:13;:11;:13::i;:::-;34550:5:::1;34540:7;;:15;;;;:::i;:::-;34528:10;:27;;34520:72;;;::::0;-1:-1:-1;;;34520:72:0;;6043:2:1;34520:72:0::1;::::0;::::1;6025:21:1::0;;;6062:18;;;6055:30;6121:34;6101:18;;;6094:62;6173:18;;34520:72:0::1;;;;;;;;;34636:9;::::0;34608:38:::1;::::0;;6376:25:1;;;6432:2;6417:18;;6410:34;;;;34608:38:0::1;::::0;6349:18:1;34608:38:0::1;;;;;;;34657:9;:22:::0;34445:242::o;39520:350::-;39654:4;39671:36;39681:6;39689:9;39700:6;39671:9;:36::i;:::-;-1:-1:-1;;;;;39789:19:0;;;;;;:11;:19;;;;;;;;5270:10;39789:33;;;;;;;;;39718:122;;39741:6;;39789:40;;39823:6;;39789:40;:::i;:::-;39718:8;:122::i;:::-;-1:-1:-1;39858:4:0;39520:350;;;;;:::o;50520:323::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;50650:43:0;::::1;;::::0;;;:34:::1;:43:::0;;;;;;:49;::::1;;:43;::::0;;::::1;:49;;::::0;50642:69:::1;;;::::0;-1:-1:-1;;;50642:69:0;;6790:2:1;50642:69:0::1;::::0;::::1;6772:21:1::0;6829:1;6809:18;;;6802:29;-1:-1:-1;;;6847:18:1;;;6840:37;6894:18;;50642:69:0::1;6588:330:1::0;50642:69:0::1;-1:-1:-1::0;;;;;50722:43:0;::::1;;::::0;;;:34:::1;:43:::0;;;;;;;;:50;;-1:-1:-1;;50722:50:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50788:47;;1266:41:1;;;50788:47:0::1;::::0;1239:18:1;50788:47:0::1;;;;;;;;50520:323:::0;;:::o;41685:317::-;41779:7;41837;;41826;:18;;41804:110;;;;-1:-1:-1;;;41804:110:0;;7125:2:1;41804:110:0;;;7107:21:1;7164:2;7144:18;;;7137:30;7203:34;7183:18;;;7176:62;-1:-1:-1;;;7254:18:1;;;7247:40;7304:19;;41804:110:0;6923:406:1;41804:110:0;41925:19;41947:10;:8;:10::i;:::-;41925:32;-1:-1:-1;41975:19:0;41925:32;41975:7;:19;:::i;:::-;41968:26;41685:317;-1:-1:-1;;;41685:317:0:o;42514:613::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;42592:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;42584:56;;;::::0;-1:-1:-1;;;42584:56:0;;7536:2:1;42584:56:0::1;::::0;::::1;7518:21:1::0;7575:2;7555:18;;;7548:30;7614:25;7594:18;;;7587:53;7657:18;;42584:56:0::1;7334:347:1::0;42584:56:0::1;42656:9;42651:469;42675:9;:16:::0;42671:20;::::1;42651:469;;;42733:7;-1:-1:-1::0;;;;;42717:23:0::1;:9;42727:1;42717:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;42717:12:0::1;:23:::0;42713:396:::1;;-1:-1:-1::0;;;;;42781:16:0;::::1;42761:19;42781:16:::0;;;:7:::1;:16;::::0;;;;;42850:10:::1;:8;:10::i;:::-;-1:-1:-1::0;;;;;42833:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;:27:::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;;;;42816:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:44;;;42887:7:::1;::::0;:19:::1;::::0;42895:11;;42887:19:::1;:::i;:::-;:36;;;;:::i;:::-;42879:7;:44:::0;-1:-1:-1;;;;;42942:20:0;::::1;42965:5;42942:20:::0;;;:11:::1;:20;::::0;;;;:28;;-1:-1:-1;;42942:28:0::1;::::0;;43004:9:::1;43014:16:::0;;:20:::1;::::0;42942:28;;43014:20:::1;:::i;:::-;43004:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;42989:9:::1;:12:::0;;-1:-1:-1;;;;;43004:31:0;;::::1;::::0;42999:1;;42989:12;::::1;;;;;:::i;:::-;;;;;;;;;:46;;;;;-1:-1:-1::0;;;;;42989:46:0::1;;;;;-1:-1:-1::0;;;;;42989:46:0::1;;;;;;43054:9;:15;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;43054:15:0;;;;;-1:-1:-1;;;;;;43054:15:0::1;::::0;;;;;-1:-1:-1;42651:469:0::1;42514:613:::0;:::o;42713:396::-:1;42693:3:::0;::::1;::::0;::::1;:::i;:::-;;;;42651:469;;;;42514:613:::0;:::o;39878:299::-;5270:10;39995:4;40089:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;40089:34:0;;;;;;;;;;39995:4;;40017:130;;40067:7;;40089:47;;40125:10;;40089:47;:::i;46239:862::-;5672:13;:11;:13::i;:::-;46465:11:::1;::::0;46480:6:::1;::::0;46465:11:::1;-1:-1:-1::0;;;46465:11:0;::::1;::::0;::::1;::::0;::::1;46449:13:::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46430:16:0;::::1;::::0;::::1;::::0;46392:35:::1;::::0;-1:-1:-1;;;46411:16:0;;::::1;;46392::::0;:35:::1;:::i;:::-;:54;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;46370:165;;;;-1:-1:-1::0;;;46370:165:0::1;;;;;;;:::i;:::-;46637:10;::::0;46651:6:::1;::::0;46637:10:::1;-1:-1:-1::0;;;46637:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46622:12:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46604:15:0;::::1;::::0;::::1;::::0;46568:33:::1;::::0;-1:-1:-1;;;46586:15:0;;::::1;;46568::::0;:33:::1;:::i;:::-;:51;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:89;;;;46546:159;;;;-1:-1:-1::0;;;46546:159:0::1;;;;;;;:::i;:::-;46743:6;46724:16;:25;;;;46716:53;;;;-1:-1:-1::0;;;46716:53:0::1;;;;;;;:::i;:::-;46806:6;46788:15;:24;;;;46780:51;;;;-1:-1:-1::0;;;46780:51:0::1;;;;;;;:::i;:::-;46941:15;::::0;46847:150:::1;::::0;;46941:15:::1;10222::1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;-1:-1:-1;;;46941:15:0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;46972:14:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;46847:150:0;::::1;::::0;;;;10164:3:1;46847:150:0;;::::1;47008:15;:34:::0;;-1:-1:-1;;;;47053:32:0;-1:-1:-1;;;47008:34:0::1;::::0;;::::1;;-1:-1:-1::0;;;;47053:32:0;;-1:-1:-1;;;47053:32:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;46239:862::o;40798:879::-;40918:7;40962;;40951;:18;;40943:62;;;;-1:-1:-1;;;40943:62:0;;10607:2:1;40943:62:0;;;10589:21:1;10646:2;10626:18;;;10619:30;10685:33;10665:18;;;10658:61;10736:18;;40943:62:0;10405:355:1;40943:62:0;41016:19;41038:10;:8;:10::i;:::-;41016:32;;41064:17;41059:611;;41110:15;41128:19;41136:11;41128:7;:19;:::i;:::-;41110:37;-1:-1:-1;41162:14:0;;-1:-1:-1;;41162:14:0;41059:611;41239:17;41275:18;41312;41349:17;41385:13;41425:20;41437:7;41425:11;:20::i;:::-;41209:236;;;;;;;;;;41460:23;41546:5;41534:9;41521:10;41508;41496:9;41486:7;:19;;;;:::i;:::-;:32;;;;:::i;:::-;:45;;;;:::i;:::-;:57;;;;:::i;:::-;:65;;;;:::i;:::-;41460:91;-1:-1:-1;41566:23:0;41592:29;41610:11;41460:91;41592:29;:::i;:::-;41566:55;-1:-1:-1;41636:22:0;;-1:-1:-1;;;;;;;;41636:22:0;41059:611;40932:745;40798:879;;;;:::o;47923:701::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;48074:30:0;::::1;48066:70;;;::::0;-1:-1:-1;;;48066:70:0;;10967:2:1;48066:70:0::1;::::0;::::1;10949:21:1::0;11006:2;10986:18;;;10979:30;11045:29;11025:18;;;11018:57;11092:18;;48066:70:0::1;10765:351:1::0;48066:70:0::1;48175:14;::::0;-1:-1:-1;;;;;48175:14:0;;::::1;48155:34:::0;;::::1;::::0;48147:98:::1;;;;-1:-1:-1::0;;;48147:98:0::1;;;;;;;:::i;:::-;48340:15;::::0;48261:120:::1;::::0;;11728:14:1;;11721:22;11703:41;;-1:-1:-1;;;48357:23:0;::::1;;;11787:14:1::0;11780:22;11775:2;11760:18;;11753:50;-1:-1:-1;;;;;48340:15:0;;::::1;::::0;48261:120;::::1;::::0;::::1;::::0;11676:18:1;48261:120:0::1;;;;;;;48392:15;:34:::0;;48437:50;::::1;;-1:-1:-1::0;;;48437:50:0::1;-1:-1:-1::0;;;;;;48437:50:0;;;-1:-1:-1;;;;;48392:34:0;;::::1;48437:50:::0;;;;;;::::1;::::0;;48392:15:::1;48498:35:::0;;;:17:::1;:35;::::0;;;;;;;:42;;-1:-1:-1;;48498:42:0;;::::1;48392:34:::0;48498:42;;::::1;::::0;;;48555:52;;;;;:57;;;;::::1;::::0;;::::1;::::0;;47923:701::o;42010:496::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;42091:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;42090:21;42082:61;;;::::0;-1:-1:-1;;;42082:61:0;;12016:2:1;42082:61:0::1;::::0;::::1;11998:21:1::0;12055:2;12035:18;;;12028:30;12094:29;12074:18;;;12067:57;12141:18;;42082:61:0::1;11814:351:1::0;42082:61:0::1;42176:9;:16:::0;42200:2:::1;::::0;42176:20:::1;::::0;42195:1:::1;42176:20;:::i;:::-;:26;;42154:153;;;::::0;-1:-1:-1;;;42154:153:0;;12372:2:1;42154:153:0::1;::::0;::::1;12354:21:1::0;12411:2;12391:18;;;12384:30;12450:34;12430:18;;;12423:62;12521:34;12501:18;;;12494:62;-1:-1:-1;;;12572:19:1;;;12565:44;12626:19;;42154:153:0::1;12170:481:1::0;42154:153:0::1;-1:-1:-1::0;;;;;42322:16:0;::::1;42341:1;42322:16:::0;;;:7:::1;:16;::::0;;;;;:20;42318:109:::1;;-1:-1:-1::0;;;;;42398:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;42378:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;42359:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;42318:109:::1;-1:-1:-1::0;;;;;42437:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;42437:27:0::1;42460:4;42437:27:::0;;::::1;::::0;;;42475:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;42475:23:0::1;::::0;;::::1;::::0;;42010:496::o;30975:799::-;5672:13;:11;:13::i;:::-;31109:18:::1;:40:::0;;-1:-1:-1;;;;;;31109:40:0::1;-1:-1:-1::0;;;;;31109:40:0;;::::1;::::0;;;::::1;::::0;;;31171:10:::1;::::0;31163:34;;::::1;31171:10:::0;::::1;31163:34;31160:165;;31213:41;31230:4;31237:11:::0;-1:-1:-1;;31213:8:0::1;:41::i;:::-;31269:10;:44:::0;;-1:-1:-1;;;;;;31269:44:0::1;-1:-1:-1::0;;;;;31269:44:0;::::1;;::::0;;31160:165:::1;31365:10;;;;;;;;;-1:-1:-1::0;;;;;31365:10:0::1;-1:-1:-1::0;;;;;31365:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31440:18;::::0;31347:122:::1;::::0;-1:-1:-1;;;31347:122:0;;31420:4:::1;31347:122;::::0;::::1;13124:34:1::0;-1:-1:-1;;;;;31440:18:0;;::::1;13174::1::0;;;13167:43;31347:50:0;::::1;::::0;::::1;::::0;13059:18:1;;31347:122:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31336:8;:133:::0;;-1:-1:-1;;;;;;31336:133:0::1;-1:-1:-1::0;;;;;31336:133:0;;::::1;;::::0;;31505:10:::1;::::0;:17:::1;::::0;;-1:-1:-1;;;31505:17:0;;;;:10;;;::::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31483:18;::::0;-1:-1:-1;;;;;31483:18:0;;::::1;:39:::0;::::1;;31480:146;;31597:10;::::0;31557:18:::1;::::0;31550:64:::1;::::0;-1:-1:-1;;;;;31557:18:0;;::::1;::::0;31597:10:::1;-1:-1:-1::0;;31550:38:0::1;:64::i;:::-;31667:10;::::0;31680:8:::1;::::0;31690:18:::1;::::0;31641:68:::1;::::0;;-1:-1:-1;;;;;31667:10:0;;::::1;13461:34:1::0;;31680:8:0;;::::1;13526:2:1::0;13511:18;;13504:43;31690:18:0;::::1;13563::1::0;;;13556:43;31641:68:0;;::::1;::::0;;;;13411:2:1;31641:68:0;;::::1;31749:8;::::0;31720:44:::1;::::0;-1:-1:-1;;;;;31749:8:0::1;::::0;31720:28:::1;:44::i;38710:198::-:0;-1:-1:-1;;;;;38800:20:0;;38776:7;38800:20;;;:11;:20;;;;;;;;38796:49;;;-1:-1:-1;;;;;;38829:16:0;;;;;:7;:16;;;;;;;38710:198::o;38796:49::-;-1:-1:-1;;;;;38883:16:0;;;;;;:7;:16;;;;;;38863:37;;:19;:37::i;5942:103::-;5672:13;:11;:13::i;:::-;6007:30:::1;6034:1;6007:18;:30::i;:::-;5942:103::o:0;49283:322::-;5672:13;:11;:13::i;:::-;49429:1:::1;49407:19;:23;49399:58;;;::::0;-1:-1:-1;;;49399:58:0;;13812:2:1;49399:58:0::1;::::0;::::1;13794:21:1::0;13851:2;13831:18;;;13824:30;-1:-1:-1;;;13870:18:1;;;13863:52;13932:18;;49399:58:0::1;13610:346:1::0;49399:58:0::1;49519:18;::::0;49473:65:::1;::::0;;6376:25:1;;;6432:2;6417:18;;6410:34;;;;49473:65:0::1;::::0;6349:18:1;49473:65:0::1;;;;;;;49549:18;:40:::0;49283:322::o;48632:643::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;48741:29:0;::::1;48733:68;;;::::0;-1:-1:-1;;;48733:68:0;;14163:2:1;48733:68:0::1;::::0;::::1;14145:21:1::0;14202:2;14182:18;;;14175:30;14241:28;14221:18;;;14214:56;14287:18;;48733:68:0::1;13961:350:1::0;48733:68:0::1;48847:4;-1:-1:-1::0;;;;;48820:32:0;::::1;::::0;48812:87:::1;;;::::0;-1:-1:-1;;;48812:87:0;;14518:2:1;48812:87:0::1;::::0;::::1;14500:21:1::0;14557:2;14537:18;;;14530:30;14596:34;14576:18;;;14569:62;-1:-1:-1;;;14647:18:1;;;14640:40;14697:19;;48812:87:0::1;14316:406:1::0;48812:87:0::1;48918:15;::::0;-1:-1:-1;;;;;48918:34:0;;::::1;:15:::0;::::1;:34:::0;48910:98:::1;;;;-1:-1:-1::0;;;48910:98:0::1;;;;;;;:::i;:::-;49075:14;::::0;49024:66:::1;::::0;-1:-1:-1;;;;;49075:14:0;;::::1;::::0;49024:66;::::1;::::0;::::1;::::0;49075:14:::1;::::0;49024:66:::1;49101:14;:32:::0;;-1:-1:-1;;;;;49101:32:0;;::::1;-1:-1:-1::0;;;;;;49101:32:0;;::::1;::::0;::::1;::::0;;:14:::1;49144:34:::0;;;:17:::1;:34;::::0;;;;;;;:41;;-1:-1:-1;;49144:41:0;;::::1;49101:32:::0;49144:41;;::::1;::::0;;;49200:51;;;;;:56;;;;::::1;::::0;;::::1;::::0;;48632:643::o;45397:834::-;5672:13;:11;:13::i;:::-;45617:11:::1;::::0;45632:6:::1;::::0;45617:11:::1;-1:-1:-1::0;;;45617:11:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;45599:15:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;45580:16:0;::::1;::::0;::::1;::::0;45544:33:::1;::::0;-1:-1:-1;;;45561:16:0;;::::1;;45544:14:::0;:33:::1;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;45522:165;;;;-1:-1:-1::0;;;45522:165:0::1;;;;;;;:::i;:::-;45789:10;::::0;45803:6:::1;::::0;45789:10:::1;-1:-1:-1::0;;;45789:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;45772:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;45754:15:0;::::1;::::0;::::1;::::0;45720:31:::1;::::0;-1:-1:-1;;;45736:15:0;;::::1;;45720:13:::0;:31:::1;:::i;:::-;:49;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:89;;;;45698:159;;;;-1:-1:-1::0;;;45698:159:0::1;;;;;;;:::i;:::-;45893:6;45876:14;:23;;;;45868:51;;;;-1:-1:-1::0;;;45868:51:0::1;;;;;;;:::i;:::-;45954:6;45938:13;:22;;;;45930:49;;;;-1:-1:-1::0;;;45930:49:0::1;;;;;;;:::i;:::-;46083:13;::::0;45995:140:::1;::::0;;46083:13:::1;10222:15:1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;46083:13:0::1;::::0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;46112:12:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;45995:140:0;::::1;::::0;;;;10164:3:1;45995:140:0;;::::1;46146:13;:30:::0;;-1:-1:-1;;46187:28:0;46146:30:::1;;::::0;;::::1;;-1:-1:-1::0;;46187:28:0;;-1:-1:-1;;;46187:28:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;45397:834::o;60508:207::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;60583:22:0;::::1;60591:4;60583:22:::0;60575:46:::1;;;::::0;-1:-1:-1;;;60575:46:0;;14929:2:1;60575:46:0::1;::::0;::::1;14911:21:1::0;14968:2;14948:18;;;14941:30;-1:-1:-1;;;14987:18:1;;;14980:41;15038:18;;60575:46:0::1;14727:335:1::0;60575:46:0::1;60632:75;60659:7;5757::::0;5784:6;-1:-1:-1;;;;;5784:6:0;;5711:87;60659:7:::1;60668:38;::::0;-1:-1:-1;;;60668:38:0;;60700:4:::1;60668:38;::::0;::::1;4179:51:1::0;-1:-1:-1;;;;;60668:23:0;::::1;::::0;::::1;::::0;4152:18:1;;60668:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60632:26:0;::::1;::::0;:75;:26:::1;:75::i;:::-;60508:207:::0;:::o;58485:1827::-;58560:16;;;58574:1;58560:16;;;;;;;;58536:21;;58560:16;;;;;;;;-1:-1:-1;;58597:18:0;;58587:7;;;;-1:-1:-1;;;;;;58597:18:0;;58587:7;;-1:-1:-1;58597:18:0;;58587:7;;;;:::i;:::-;;;;;;:28;-1:-1:-1;;;;;58587:28:0;;;-1:-1:-1;;;;;58587:28:0;;;;;58644:4;58626;58631:1;58626:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58626:23:0;;;:7;;;;;;;;;;:23;;;;58685:10;;:17;;;-1:-1:-1;;;58685:17:0;;;;:10;;;;;:15;;:17;;;;;58626:7;;58685:17;;;;;:10;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58674:28:0;:4;58679:1;58674:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;58674:28:0;;58670:753;;58718:10;;58892:14;;58718:237;;-1:-1:-1;;;58718:237:0;;-1:-1:-1;;;;;58718:10:0;;;;:61;;58786:9;;58718:237;;:10;;58869:4;;58892:14;;;58925:15;;58718:237;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58670:753;;;59010:18;;58986:14;;-1:-1:-1;;;;;59010:18:0;59003:36;5270:10;59003:50;;-1:-1:-1;;;;;;59003:50:0;;;;;;;-1:-1:-1;;;;;4197:32:1;;;59003:50:0;;;4179:51:1;4152:18;;59003:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58986:67;-1:-1:-1;59068:80:0;5270:10;59075:18;;-1:-1:-1;;;;;59075:18:0;;59134:4;59141:6;59068:43;:80::i;:::-;59163:10;;59348:14;;59163:248;;-1:-1:-1;;;59163:248:0;;-1:-1:-1;;;;;59163:10:0;;;;:64;;:248;;59246:6;;59163:10;;59325:4;;59348:14;;;59381:15;;59163:248;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58971:452;58670:753;59489:14;;-1:-1:-1;;;;;59489:14:0;59477:27;;;;:11;:27;;;;;;;;59474:812;;;59552:14;;-1:-1:-1;;;;;59552:14:0;59544:23;;;;:7;:23;;;;;;59534:7;;:33;;59544:23;59534:33;:::i;:::-;59524:7;:43;59614:14;;-1:-1:-1;;;;;59614:14:0;59606:23;;;;:7;:23;;;;;;59596:7;;:33;;59606:23;59596:33;:::i;:::-;59586:7;:43;59659:14;;-1:-1:-1;;;;;59659:14:0;59677:1;59651:23;;;:7;:23;;;;;;:27;59648:119;;59715:14;;-1:-1:-1;;;;;59715:14:0;59739:1;59743:23;;;:7;:23;;;;;;;;;59706:61;;1659:25:1;;;59739:1:0;;59715:14;-1:-1:-1;;;;;;;;;;;59706:61:0;1632:18:1;59706:61:0;;;;;;;59648:119;59794:14;;;-1:-1:-1;;;;;59794:14:0;;;59812:1;59786:23;;;:7;:23;;;;;;;;:27;;;59840:14;;;;;59832:23;;:7;:23;;;;;;:27;60508:207;:::o;59474:812::-;59949:14;;-1:-1:-1;;;;;59949:14:0;59904;59941:23;;;:7;:23;;;;;;59921:44;;:19;:44::i;:::-;59904:61;;60004:6;59994:7;;:16;;;;:::i;:::-;59984:7;:26;60057:14;;-1:-1:-1;;;;;60057:14:0;60049:23;;;;:7;:23;;;;;;60039:7;;:33;;60049:23;60039:33;:::i;:::-;60029:7;:43;60094:10;;60091:85;;60141:14;;60132:44;;1659:25:1;;;60165:1:0;;-1:-1:-1;;;;;60141:14:0;;-1:-1:-1;;;;;;;;;;;60132:44:0;1647:2:1;1632:18;60132:44:0;;;;;;;60091:85;-1:-1:-1;60203:14:0;;;-1:-1:-1;;;;;60203:14:0;;;60221:1;60195:23;;;:7;:23;;;;;;;;:27;;;60249:14;;;;;60241:23;;:7;:23;;;;;;:27;58525:1787;58485:1827::o;38415:89::-;38456:13;38489:7;38482:14;;;;;:::i;49613:163::-;5672:13;:11;:13::i;:::-;49727:41:::1;49756:4;49762:5;49727:28;:41::i;40185:341::-:0;5270:10;40307:4;40401:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;40401:34:0;;;;;;;;;;40307:4;;40329:167;;40379:7;;40401:84;;40455:15;;40401:84;:::i;38916:201::-;39023:4;39045:42;5270:10;39069:9;39080:6;39045:9;:42::i;34695:366::-;5672:13;:11;:13::i;:::-;34856:5:::1;34846:7;;:15;;;;:::i;:::-;34823:21;:38;;34815:94;;;::::0;-1:-1:-1;;;34815:94:0;;17158:2:1;34815:94:0::1;::::0;::::1;17140:21:1::0;17197:2;17177:18;;;17170:30;17236:34;17216:18;;;17209:62;-1:-1:-1;;;17287:18:1;;;17280:41;17338:19;;34815:94:0::1;16956:407:1::0;34815:94:0::1;34977:20;::::0;34927:71:::1;::::0;;6376:25:1;;;6432:2;6417:18;;6410:34;;;;34927:71:0::1;::::0;6349:18:1;34927:71:0::1;;;;;;;35009:20;:44:::0;34695:366::o;43634:874::-;5672:13;:11;:13::i;:::-;43863:11:::1;::::0;43878:6:::1;::::0;43863:11:::1;-1:-1:-1::0;;;43863:11:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;43845:15:0;::::1;::::0;::::1;::::0;43863:11:::1;43829:13:::0;::::1;::::0;::::1;::::0;43790:36:::1;::::0;-1:-1:-1;;;43810:16:0;;::::1;;43790:17:::0;:36:::1;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;43768:165;;;;-1:-1:-1::0;;;43768:165:0::1;;;;;;;:::i;:::-;44035:10;::::0;44049:6:::1;::::0;44035:10:::1;-1:-1:-1::0;;;44035:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44018:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44003:12:0;::::1;::::0;::::1;::::0;43966:34:::1;::::0;-1:-1:-1;;;43985:15:0;;::::1;;43966:16:::0;:34:::1;:::i;:::-;:49;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:89;;;;43944:159;;;;-1:-1:-1::0;;;43944:159:0::1;;;;;;;:::i;:::-;44142:6;44122:17;:26;;;;44114:54;;;;-1:-1:-1::0;;;44114:54:0::1;;;;;;;:::i;:::-;44206:6;44187:16;:25;;;;44179:52;;;;-1:-1:-1::0;;;44179:52:0::1;;;;;;;:::i;:::-;44343:16;::::0;44247:153:::1;::::0;;44343:16:::1;10222:15:1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;-1:-1:-1;;;44343:16:0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;44374:15:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;44247:153:0;::::1;::::0;;;;10164:3:1;44247:153:0;;::::1;44411:16;:36:::0;;-1:-1:-1;;44458:34:0;-1:-1:-1;;;44411:36:0::1;::::0;;::::1;;-1:-1:-1::0;;;;44458:34:0;;-1:-1:-1;;;44458:34:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;43634:874::o;47109:806::-;5672:13;:11;:13::i;:::-;47321::::1;::::0;47338:6:::1;::::0;47321:13:::1;;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;47303:15:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;47284:16:0;::::1;::::0;::::1;::::0;47250:31:::1;::::0;-1:-1:-1;;;47265:16:0;;::::1;;47250:12:::0;:31:::1;:::i;:::-;:50;;;;:::i;:::-;:68;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;47228:165;;;;-1:-1:-1::0;;;47228:165:0::1;;;;;;;:::i;:::-;47493:12;::::0;47509:6:::1;::::0;47493:12:::1;-1:-1:-1::0;;;47493:12:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;47476:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;47458:15:0;::::1;::::0;::::1;::::0;47426:29:::1;::::0;-1:-1:-1;;;47440:15:0;;::::1;;47426:11:::0;:29:::1;:::i;:::-;:47;;;;:::i;:::-;:64;;;;:::i;:::-;:79;;;;:::i;:::-;:89;;;;47404:159;;;;-1:-1:-1::0;;;47404:159:0::1;;;;;;;:::i;:::-;47597:6;47582:12;:21;;;;47574:49;;;;-1:-1:-1::0;;;47574:49:0::1;;;;;;;:::i;:::-;47656:6;47642:11;:20;;;;47634:47;;;;-1:-1:-1::0;;;47634:47:0::1;;;;;;;:::i;:::-;47779:11;::::0;47697:130:::1;::::0;;47779:11:::1;10222:15:1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;-1:-1:-1;;;47779:11:0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;47806:10:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;47697:130:0;::::1;::::0;;;;10164:3:1;47697:130:0;;::::1;47838:11;:26:::0;;-1:-1:-1;;;;47875:24:0;-1:-1:-1;;;47838:26:0::1;::::0;;::::1;;-1:-1:-1::0;;;;47875:24:0;;-1:-1:-1;;;47875:24:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;47109:806::o;50278:234::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;50368:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;:34;::::1;;:26;::::0;;::::1;:34;;::::0;50360:54:::1;;;::::0;-1:-1:-1;;;50360:54:0;;6790:2:1;50360:54:0::1;::::0;::::1;6772:21:1::0;6829:1;6809:18;;;6802:29;-1:-1:-1;;;6847:18:1;;;6840:37;6894:18;;50360:54:0::1;6588:330:1::0;50360:54:0::1;-1:-1:-1::0;;;;;50425:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;;;;:33;;-1:-1:-1;;50425:33:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50474:30;;1266:41:1;;;50474:30:0::1;::::0;1239:18:1;50474:30:0::1;1126:187:1::0;60318:184:0;5672:13;:11;:13::i;:::-;60372:12:::1;5784:6:::0;;60388:55:::1;::::0;-1:-1:-1;;;;;5784:6:0;;;;60417:21:::1;::::0;60372:12;60388:55;60372:12;60388:55;60417:21;5784:6;60388:55:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60371:72;;;60462:7;60454:40;;;::::0;-1:-1:-1;;;60454:40:0;;17780:2:1;60454:40:0::1;::::0;::::1;17762:21:1::0;17819:2;17799:18;;;17792:30;-1:-1:-1;;;17838:18:1;;;17831:50;17898:18;;60454:40:0::1;17578:344:1::0;44516:873:0;5672:13;:11;:13::i;:::-;44745:11:::1;::::0;44760:6:::1;::::0;44745:11:::1;-1:-1:-1::0;;;44745:11:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44727:15:0;::::1;::::0;::::1;::::0;44745:11:::1;44711:13:::0;::::1;::::0;::::1;::::0;44672:36:::1;::::0;-1:-1:-1;;;44692:16:0;;::::1;;44672:17:::0;:36:::1;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;44650:165;;;;-1:-1:-1::0;;;44650:165:0::1;;;;;;;:::i;:::-;44916:10;::::0;44930:6:::1;::::0;44916:10:::1;-1:-1:-1::0;;;44916:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44899:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44884:12:0;::::1;::::0;::::1;::::0;44848:34:::1;::::0;-1:-1:-1;;;44867:15:0;;::::1;;44848:16:::0;:34:::1;:::i;:::-;:48;;;;:::i;:::-;:65;;;;:::i;:::-;:78;;;;:::i;:::-;:88;;;;44826:158;;;;-1:-1:-1::0;;;44826:158:0::1;;;;;;;:::i;:::-;45023:6;45003:17;:26;;;;44995:54;;;;-1:-1:-1::0;;;44995:54:0::1;;;;;;;:::i;:::-;45087:6;45068:16;:25;;;;45060:52;;;;-1:-1:-1::0;;;45060:52:0::1;;;;;;;:::i;:::-;45224:16;::::0;45128:153:::1;::::0;;45224:16:::1;10222:15:1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;-1:-1:-1;;;45224:16:0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;45255:15:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;45128:153:0;::::1;::::0;;;;10164:3:1;45128:153:0;;::::1;45292:16;:36:::0;;-1:-1:-1;;;;45339:34:0;-1:-1:-1;;;45292:36:0::1;::::0;;::::1;;-1:-1:-1::0;;;;45339:34:0;;-1:-1:-1;;;45339:34:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;44516:873::o;6051:201::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;6140:22:0;::::1;6132:73;;;::::0;-1:-1:-1;;;6132:73:0;;18129:2:1;6132:73:0::1;::::0;::::1;18111:21:1::0;18168:2;18148:18;;;18141:30;18207:34;18187:18;;;18180:62;-1:-1:-1;;;18258:18:1;;;18251:36;18304:19;;6132:73:0::1;17927:402:1::0;6132:73:0::1;6216:28;6235:8;6216:18;:28::i;43135:371::-:0;-1:-1:-1;;;;;43262:19:0;;43254:68;;;;-1:-1:-1;;;43254:68:0;;18536:2:1;43254:68:0;;;18518:21:1;18575:2;18555:18;;;18548:30;18614:34;18594:18;;;18587:62;-1:-1:-1;;;18665:18:1;;;18658:34;18709:19;;43254:68:0;18334:400:1;43254:68:0;-1:-1:-1;;;;;43341:21:0;;43333:68;;;;-1:-1:-1;;;43333:68:0;;18941:2:1;43333:68:0;;;18923:21:1;18980:2;18960:18;;;18953:30;19019:34;18999:18;;;18992:62;-1:-1:-1;;;19070:18:1;;;19063:32;19112:19;;43333:68:0;18739:398:1;43333:68:0;-1:-1:-1;;;;;43414:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;43466:32;;1659:25:1;;;43466:32:0;;1632:18:1;43466:32:0;;;;;;;43135:371;;;:::o;5804:132::-;5757:7;5784:6;-1:-1:-1;;;;;5784:6:0;5270:10;5868:23;5860:68;;;;-1:-1:-1;;;5860:68:0;;19344:2:1;5860:68:0;;;19326:21:1;;;19363:18;;;19356:30;19422:34;19402:18;;;19395:62;19474:18;;5860:68:0;19142:356:1;50851:2282:0;-1:-1:-1;;;;;50973:18:0;;50965:68;;;;-1:-1:-1;;;50965:68:0;;19705:2:1;50965:68:0;;;19687:21:1;19744:2;19724:18;;;19717:30;19783:34;19763:18;;;19756:62;-1:-1:-1;;;19834:18:1;;;19827:35;19879:19;;50965:68:0;19503:401:1;50965:68:0;-1:-1:-1;;;;;51052:16:0;;51044:64;;;;-1:-1:-1;;;51044:64:0;;20111:2:1;51044:64:0;;;20093:21:1;20150:2;20130:18;;;20123:30;20189:34;20169:18;;;20162:62;-1:-1:-1;;;20240:18:1;;;20233:33;20283:19;;51044:64:0;19909:399:1;51044:64:0;51127:28;51158:24;51176:4;51158:9;:24::i;:::-;51127:55;;51203:24;51252:19;;51230;;:41;;;;:::i;:::-;51203:68;;51282:28;51346:18;;51313:16;:51;;:95;;;;;51388:20;51368:16;:40;;51313:95;51461:16;;51282:126;;-1:-1:-1;51461:16:0;;51460:17;:57;;;;;51494:23;51460:57;:97;;;;-1:-1:-1;51544:8:0;;51556:1;;51534:19;;-1:-1:-1;;;;;51544:8:0;51534:9;:19::i;:::-;:23;51460:97;:143;;;;-1:-1:-1;;;;;;51574:29:0;;;;;;:25;:29;;;;;;;;51460:143;51442:209;;;51630:9;:7;:9::i;:::-;51661:14;36773:10;;;36752:18;:31;36818:13;;;36794:21;:37;36866:13;;;36842:21;:37;36913:12;;;36890:20;:35;36955:8;;;36936:16;:27;-1:-1:-1;36976:12:0;;;;36999:16;;;;37026:17;;;;37054:14;;;;37079:17;36709:395;51661:14;51791:16;;;;51790:17;:58;;;;-1:-1:-1;;;;;;51825:23:0;;;;;;:17;:23;;;;;;;;51824:24;51790:58;:97;;;;-1:-1:-1;;;;;;51866:21:0;;;;;;:17;:21;;;;;;;;51865:22;51790:97;51772:786;;;-1:-1:-1;;;;;51938:31:0;;;;;;:25;:31;;;;;;;;51934:613;;;52003:12;;;-1:-1:-1;;;52003:12:0;;;;51990:10;:25;-1:-1:-1;;;52050:15:0;;;;52034:13;:31;-1:-1:-1;;;52100:15:0;;;;52084:13;:31;-1:-1:-1;;;52149:14:0;;;;52134:12;:29;-1:-1:-1;;;52193:10:0;;;;52182:8;:21;51934:613;;;-1:-1:-1;;;;;52263:29:0;;;;;;:25;:29;;;;;;;;52259:288;;;52326:13;;;;;;;;52313:10;:26;-1:-1:-1;;;52374:16:0;;;;52358:13;:32;-1:-1:-1;;;52425:16:0;;;;52409:13;:32;-1:-1:-1;;;52475:15:0;;;;;52460:30;-1:-1:-1;;;52520:11:0;;;;52509:8;:22;52259:288;52568:32;52583:4;52589:2;52593:6;52568:14;:32::i;:::-;52611:15;37167:16;;37156:8;:27;37209:20;;37194:12;:35;37253:18;;37240:10;:31;37298:21;;37282:13;:37;37346:21;;37330:13;:37;37112:263;52611:15;52642:16;;;;52637:489;;-1:-1:-1;;;;;52680:40:0;;;;;;:34;:40;;;;;;;;52675:215;;52781:20;;52771:6;:30;;52741:133;;;;-1:-1:-1;;;52741:133:0;;20515:2:1;52741:133:0;;;20497:21:1;20554:2;20534:18;;;20527:30;20593:31;20573:18;;;20566:59;20642:18;;52741:133:0;20313:353:1;52741:133:0;-1:-1:-1;;;;;52909:38:0;;;;;;:34;:38;;;;;;;;52904:211;;53015:9;;52998:13;53008:2;52998:9;:13::i;:::-;:26;;52968:131;;;;-1:-1:-1;;;52968:131:0;;20873:2:1;52968:131:0;;;20855:21:1;20912:2;20892:18;;;20885:30;20951:33;20931:18;;;20924:61;21002:18;;52968:131:0;20671:355:1;52968:131:0;50954:2179;;;50851:2282;;;:::o;35944:159::-;35986:7;36007:15;36024;36043:19;:17;:19::i;:::-;36006:56;;-1:-1:-1;36006:56:0;-1:-1:-1;36080:15:0;36006:56;;36080:15;:::i;:::-;36073:22;;;;35944:159;:::o;35245:691::-;35346:7;35368;35390;35412;35434;35469:17;35489:27;35508:7;35489:18;:27::i;:::-;35469:47;;35527:18;35548:30;35570:7;35548:21;:30::i;:::-;35527:51;;35589:18;35610:30;35632:7;35610:21;:30::i;:::-;35589:51;;35651:17;35671:29;35692:7;35671:20;:29::i;:::-;35651:49;;35711:13;35727:25;35744:7;35727:16;:25::i;:::-;35876:9;;35887:10;;-1:-1:-1;35899:10:0;;-1:-1:-1;35899:10:0;-1:-1:-1;35876:9:0;;-1:-1:-1;35245:691:0;-1:-1:-1;;;35245:691:0:o;7270:582::-;7600:10;;;7599:62;;-1:-1:-1;7616:39:0;;-1:-1:-1;;;7616:39:0;;7640:4;7616:39;;;13124:34:1;-1:-1:-1;;;;;13194:15:1;;;13174:18;;;13167:43;7616:15:0;;;;;13059:18:1;;7616:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;7599:62;7577:166;;;;-1:-1:-1;;;7577:166:0;;21233:2:1;7577:166:0;;;21215:21:1;21272:2;21252:18;;;21245:30;21311:34;21291:18;;;21284:62;-1:-1:-1;;;21362:18:1;;;21355:52;21424:19;;7577:166:0;21031:418:1;7577:166:0;7781:62;;-1:-1:-1;;;;;21646:32:1;;7781:62:0;;;21628:51:1;21695:18;;;21688:34;;;7754:90:0;;7774:5;;-1:-1:-1;;;7804:22:0;21601:18:1;;7781:62:0;;;;-1:-1:-1;;7781:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;7781:62:0;-1:-1:-1;;;;;;7781:62:0;;;;;;;;;;7754:19;:90::i;:::-;7270:582;;;:::o;49784:484::-;-1:-1:-1;;;;;49889:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;49867:146;;;;-1:-1:-1;;;49867:146:0;;21935:2:1;49867:146:0;;;21917:21:1;21974:2;21954:18;;;21947:30;22013:34;21993:18;;;21986:62;22084:26;22064:18;;;22057:54;22128:19;;49867:146:0;21733:420:1;49867:146:0;-1:-1:-1;;;;;50024:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;50024:39:0;;;;;;;;;;;;50074:71;;50085:23;50103:4;50085:17;:23::i;:::-;50074:71;;;50124:21;50140:4;50124:15;:21::i;:::-;-1:-1:-1;;;;;50156:40:0;;;;;;:34;:40;;;;;;;;:48;;-1:-1:-1;;50156:48:0;;;;;;;;;;50220:40;;1266:41:1;;;50220:40:0;;1239:18:1;50220:40:0;1126:187:1;6258:191:0;6332:16;6351:6;;-1:-1:-1;;;;;6368:17:0;;;-1:-1:-1;;;;;;6368:17:0;;;;;;6401:40;;6351:6;;;;;;;6401:40;;6332:16;6401:40;6321:128;6258:191;:::o;6876:177::-;6986:58;;-1:-1:-1;;;;;21646:32:1;;6986:58:0;;;21628:51:1;21695:18;;;21688:34;;;6959:86:0;;6979:5;;-1:-1:-1;;;7009:23:0;21601:18:1;;6986:58:0;21454:274:1;7059:205:0;7187:68;;-1:-1:-1;;;;;22416:15:1;;;7187:68:0;;;22398:34:1;22468:15;;22448:18;;;22441:43;22500:18;;;22493:34;;;7160:96:0;;7180:5;;-1:-1:-1;;;7210:27:0;22333:18:1;;7187:68:0;22158:375:1;7160:96:0;7059:205;;;;:::o;53141:3703::-;43548:16;:23;;-1:-1:-1;;43548:23:0;43567:4;43548:23;;;53269:19:::1;::::0;43548:16;;53269:23:::1;::::0;53291:1:::1;::::0;53269:23:::1;:::i;:::-;53240:52;;53303:31;53357:10;;;;;;;;;-1:-1:-1::0;;;;;53357:10:0::1;-1:-1:-1::0;;;;;53357:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53337:18;::::0;-1:-1:-1;;;;;53337:18:0;;::::1;:37:::0;::::1;;:128;;53421:18;::::0;53414:51:::1;::::0;-1:-1:-1;;;53414:51:0;;53459:4:::1;53414:51;::::0;::::1;4179::1::0;-1:-1:-1;;;;;53421:18:0;;::::1;::::0;53414:36:::1;::::0;4152:18:1;;53414:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53337:128;;;53377:21;53337:128;53303:162;;53476:29;53516:28:::0;53559:23:::1;;;;;;;;;;;53555:2143;;;53599:21;53662:18;;53640:19;;53621:18;:38;;;;:::i;:::-;:59;;;;:::i;:::-;53599:81:::0;-1:-1:-1;53698:15:0;;53695:74:::1;;53732:37;53755:13;53732:22;:37::i;:::-;53831:10;::::0;:17:::1;::::0;;-1:-1:-1;;;53831:17:0;;;;53784:24:::1;::::0;-1:-1:-1;;;;;53831:10:0::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53811:18;::::0;-1:-1:-1;;;;;53811:18:0;;::::1;:37:::0;::::1;;:180;;53923:18;::::0;53916:51:::1;::::0;-1:-1:-1;;;53916:51:0;;53961:4:::1;53916:51;::::0;::::1;4179::1::0;53968:23:0;;-1:-1:-1;;;;;53923:18:0::1;::::0;53916:36:::1;::::0;4152:18:1;;53916:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;;;:::i;:::-;53811:180;;;53851:45;53873:23:::0;53851:21:::1;:45;:::i;:::-;53784:207;;54006:29;54075:13;54055:19;;54038:16;:36;;;;:::i;:::-;:50;;;;:::i;:::-;54006:82:::0;-1:-1:-1;54163:13:0;54127:35:::1;54144:18:::0;54127:16;:35:::1;:::i;:::-;:49;;;;:::i;:::-;54103:73:::0;-1:-1:-1;54103:73:0;54214:40:::1;54233:21:::0;54214:16;:40:::1;:::i;:::-;:64;;;;:::i;:::-;54191:87:::0;-1:-1:-1;54296:23:0;;54293:584:::1;;54362:10;;;;;;;;;-1:-1:-1::0;;;;;54362:10:0::1;-1:-1:-1::0;;;;;54362:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54342:18;::::0;-1:-1:-1;;;;;54342:37:0;;::::1;:18:::0;::::1;:37:::0;54339:516:::1;;54428:15;::::0;54420:63:::1;::::0;54404:12:::1;::::0;-1:-1:-1;;;;;54428:15:0::1;::::0;54457:21;;54404:12;54420:63;54404:12;54420:63;54457:21;54428:15;54420:63:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54403:80;;;54509:7;54506:133;;;54572:43;::::0;;54590:1:::1;6376:25:1::0;;6432:2;6417:18;;6410:34;;;54572:43:0::1;::::0;6349:18:1;54572:43:0::1;;;;;;;54506:133;54380:278;54339:516;;;54725:15;::::0;54692:18:::1;::::0;54685:79:::1;::::0;-1:-1:-1;;;;;54692:18:0;;::::1;::::0;54725:15:::1;54742:21:::0;54685:39:::1;:79::i;:::-;54792:43;::::0;;54810:1:::1;6376:25:1::0;;6432:2;6417:18;;6410:34;;;54792:43:0::1;::::0;6349:18:1;54792:43:0::1;;;;;;;54339:516;53584:1316;;;53555:2143;;;54921:21;54964:18;;54943;:39;;;;:::i;:::-;54921:61:::0;-1:-1:-1;55000:15:0;;54997:74:::1;;55034:37;55057:13;55034:22;:37::i;:::-;55133:10;::::0;:17:::1;::::0;;-1:-1:-1;;;55133:17:0;;;;55086:24:::1;::::0;-1:-1:-1;;;;;55133:10:0::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55113:18;::::0;-1:-1:-1;;;;;55113:18:0;;::::1;:37:::0;::::1;;:180;;55225:18;::::0;55218:51:::1;::::0;-1:-1:-1;;;55218:51:0;;55263:4:::1;55218:51;::::0;::::1;4179::1::0;55270:23:0;;-1:-1:-1;;;;;55225:18:0::1;::::0;55218:36:::1;::::0;4152:18:1;;55218:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;;;:::i;:::-;55113:180;;;55153:45;55175:23:::0;55153:21:::1;:45;:::i;:::-;55086:207:::0;-1:-1:-1;55368:13:0;55332:35:::1;55349:18:::0;55086:207;55332:35:::1;:::i;:::-;:49;;;;:::i;:::-;55308:73:::0;-1:-1:-1;55419:40:0::1;55308:73:::0;55419:16;:40:::1;:::i;:::-;55491:19;::::0;55396:63;;-1:-1:-1;55491:21:0;55488:187:::1;;55557:15;::::0;55574:19:::1;::::0;55532:62:::1;::::0;55550:4:::1;::::0;-1:-1:-1;;;;;55557:15:0;;::::1;::::0;55532:9:::1;:62::i;:::-;55636:19;::::0;55618:41:::1;::::0;;6376:25:1;;;55657:1:0::1;6432:2:1::0;6417:18;;6410:34;55618:41:0::1;::::0;6349:18:1;55618:41:0::1;;;;;;;55488:187;54906:792;;53555:2143;55735:1;55714:18;:22;:51;;;;;55764:1;55740:21;:25;55714:51;55710:216;;;55782:55;55795:18;55815:21;55782:12;:55::i;:::-;55857:57;::::0;;6376:25:1;;;6432:2;6417:18;;6410:34;;;55857:57:0::1;::::0;6349:18:1;55857:57:0::1;;;;;;;55710:216;55939:22:::0;;55936:526:::1;;56000:10;;;;;;;;;-1:-1:-1::0;;;;;56000:10:0::1;-1:-1:-1::0;;;;;56000:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55980:18;::::0;-1:-1:-1;;;;;55980:37:0;;::::1;:18:::0;::::1;:37:::0;55977:467:::1;;56062:14;::::0;56054:61:::1;::::0;56038:12:::1;::::0;-1:-1:-1;;;;;56062:14:0::1;::::0;56090:20;;56038:12;56054:61;56038:12;56054:61;56090:20;56062:14;56054:61:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56037:78;;;56137:7;56134:117;;;56193:38;::::0;1659:25:1;;;56193:38:0::1;::::0;1647:2:1;1632:18;56193:38:0::1;;;;;;;56134:117;56018:248;55977:467;;;56329:14;::::0;56296:18:::1;::::0;56289:77:::1;::::0;-1:-1:-1;;;;;56296:18:0;;::::1;::::0;56329:14:::1;56345:20:::0;56289:39:::1;:77::i;:::-;56390:38;::::0;1659:25:1;;;56390:38:0::1;::::0;1647:2:1;1632:18;56390:38:0::1;;;;;;;55977:467;56494:1;56472:19;:23:::0;;;56506:18:::1;:22:::0;;;56539:19:::1;:23:::0;;;56576:24:::1;56594:4;56576:9;:24::i;:::-;:26;56573:264;;;56638:1;5784:6:::0;-1:-1:-1;;;;;5784:6:0;56621:19;56618:205:::1;;56659:59;56677:4;56684:7;5757::::0;5784:6;-1:-1:-1;;;;;5784:6:0;;5711:87;56684:7:::1;56693:24;56711:4;56693:9;:24::i;:::-;56659:9;:59::i;:::-;56618:205;;;56782:14;::::0;56757:66:::1;::::0;56775:4:::1;::::0;-1:-1:-1;;;;;56782:14:0::1;56798:24;56775:4:::0;56798:9:::1;:24::i;56757:66::-;-1:-1:-1::0;;43594:16:0;:24;;-1:-1:-1;;43594:24:0;;;-1:-1:-1;;53141:3703:0:o;31783:2652::-;31978:17;32010:18;32043;32076:17;32108:13;32135:19;32147:6;32135:11;:19::i;:::-;31911:243;;;;;;;;;;32165:23;32250:5;32238:9;32225:10;32212;32200:9;32191:6;:18;;;;:::i;:::-;:31;;;;:::i;:::-;:44;;;;:::i;:::-;:56;;;;:::i;:::-;:64;;;;:::i;:::-;32165:90;;32266:19;32288:10;:8;:10::i;:::-;32266:32;;32364:5;32354:7;;:15;;;;:::i;:::-;32344:7;:25;32404:17;32410:11;32404:5;:17;:::i;:::-;32394:7;;:27;;;;:::i;:::-;32384:7;:37;32439:9;;32436:71;;32472:35;;1659:25:1;;;32497:1:0;;-1:-1:-1;;;;;32472:35:0;;;-1:-1:-1;;;;;;;;;;;32472:35:0;1647:2:1;1632:18;32472:35:0;;;;;;;32436:71;32675:10;32655:19;;:30;;;;:::i;:::-;32633:19;:52;32722:19;;:30;;32742:10;;32722:30;:::i;:::-;32700:19;:52;32788:18;;:28;;32807:9;;32788:28;:::i;:::-;32767:18;:49;32831:17;32873:9;32851:21;32862:10;32851;:21;:::i;:::-;:31;;;;:::i;:::-;32831:51;-1:-1:-1;32945:23:0;32957:11;32831:51;32945:23;:::i;:::-;32938:4;32922:22;;;;:7;:22;;;;;;:46;;;;:::i;:::-;32913:4;32897:22;;;;:7;:22;;;;;;;;:71;;;;32987:11;:26;;;;;;32983:106;;;33073:4;33057:22;;;;:7;:22;;;;;;:32;;33080:9;;33057:32;:::i;:::-;33048:4;33032:22;;;;:7;:22;;;;;:57;32983:106;33107:13;;33104:82;;33144:42;;1659:25:1;;;33169:4:0;;-1:-1:-1;;;;;33144:42:0;;;-1:-1:-1;;;;;;;;;;;33144:42:0;1647:2:1;1632:18;33144:42:0;;;;;;;33104:82;-1:-1:-1;;;;;;33212:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;33236:22:0;;;;;;:11;:22;;;;;;;;33235:23;33212:46;33208:1067;;;-1:-1:-1;;;;;33293:15:0;;;;;;:7;:15;;;;;;:22;;33309:6;;33293:22;:::i;:::-;-1:-1:-1;;;;;33275:15:0;;;;;;:7;:15;;;;;:40;33364:18;33371:11;33364:6;:18;:::i;:::-;-1:-1:-1;;;;;33348:15:0;;;;;;:7;:15;;;;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;33330:15:0;;;;;;:7;:15;;;;;:52;33437:27;33453:11;33437:15;:27;:::i;:::-;-1:-1:-1;;;;;33418:18:0;;;;;;:7;:18;;;;;;:46;;;;:::i;:::-;-1:-1:-1;;;;;33397:18:0;;;;;;:7;:18;;;;;:67;33208:1067;;;-1:-1:-1;;;;;33487:19:0;;;;;;:11;:19;;;;;;;;33486:20;:46;;;;-1:-1:-1;;;;;;33510:22:0;;;;;;:11;:22;;;;;;;;33486:46;33482:793;;;33583:18;33590:11;33583:6;:18;:::i;:::-;-1:-1:-1;;;;;33567:15:0;;;;;;:7;:15;;;;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;33549:15:0;;;;;;;:7;:15;;;;;;;;:52;;;;33637:18;;;;;:7;:18;;;;;:34;;33656:15;;33637:34;:::i;:::-;-1:-1:-1;;;;;33616:18:0;;;;;;:7;:18;;;;;:55;33726:27;33742:11;33726:15;:27;:::i;33482:793::-;-1:-1:-1;;;;;33775:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;33798:22:0;;;;;;:11;:22;;;;;;;;33775:45;33771:504;;;-1:-1:-1;;;;;33855:15:0;;;;;;:7;:15;;;;;;:22;;33871:6;;33855:22;:::i;:::-;-1:-1:-1;;;;;33837:15:0;;;;;;:7;:15;;;;;:40;33926:18;33933:11;33926:6;:18;:::i;33771:504::-;34163:18;34170:11;34163:6;:18;:::i;:::-;-1:-1:-1;;;;;34147:15:0;;;;;;:7;:15;;;;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;34129:15:0;;;;;;:7;:15;;;;;:52;34236:27;34252:11;34236:15;:27;:::i;:::-;-1:-1:-1;;;;;34217:18:0;;;;;;:7;:18;;;;;;:46;;;;:::i;:::-;-1:-1:-1;;;;;34196:18:0;;;;;;:7;:18;;;;;:67;33771:504;34285:45;34297:21;34307:11;34297:9;:21;:::i;:::-;34320:9;34285:11;:45::i;:::-;34344:19;;34341:86;;34400:9;-1:-1:-1;;;;;34383:44:0;34392:6;-1:-1:-1;;;;;34383:44:0;-1:-1:-1;;;;;;;;;;;34411:15:0;34383:44;;;;1659:25:1;;1647:2;1632:18;;1513:177;34383:44:0;;;;;;;;34341:86;31900:2535;;;;;;;31783:2652;;;:::o;36111:590::-;36209:7;;36245;;36162;;;;;36263:328;36287:9;:16;36283:20;;36263:328;;;36371:7;36347;:21;36355:9;36365:1;36355:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36355:12:0;36347:21;;;;;;;;;;;;;:31;;:83;;;36423:7;36399;:21;36407:9;36417:1;36407:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36407:12:0;36399:21;;;;;;;;;;;;;:31;36347:83;36325:146;;;36454:7;;36463;;36446:25;;;;;;;36111:590;;:::o;36325:146::-;36504:7;:21;36512:9;36522:1;36512:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36512:12:0;36504:21;;;;;;;;;;;;;36496:29;;:7;:29;:::i;:::-;36486:39;;36558:7;:21;36566:9;36576:1;36566:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36566:12:0;36558:21;;;;;;;;;;;;;36550:29;;:7;:29;:::i;:::-;36540:39;-1:-1:-1;36305:3:0;;;;:::i;:::-;;;;36263:328;;;;36623:7;;36615;;:15;;;;:::i;:::-;36605:7;:25;36601:56;;;36640:7;;36649;;36632:25;;;;;;36111:590;;:::o;36601:56::-;36676:7;;36685;;-1:-1:-1;36111:590:0;-1:-1:-1;36111:590:0:o;37383:160::-;37477:7;37529:5;37517:10;;37509:7;:18;;;;:::i;:::-;:26;;;;:::i;37551:166::-;37648:7;37703:5;37688:13;;37680:7;:21;;;;:::i;37725:166::-;37822:7;37877:5;37862:13;;37854:7;:21;;;;:::i;37899:164::-;37995:7;38049:5;38035:12;;38027:7;:20;;;;:::i;38071:156::-;38163:7;38213:5;38203:8;;38195:7;:16;;;;:::i;9481:649::-;9905:23;9931:69;9959:4;9931:69;;;;;;;;;;;;;;;;;9939:5;-1:-1:-1;;;;;9931:27:0;;;:69;;;;;:::i;:::-;9905:95;;10019:10;:17;10040:1;10019:22;:56;;;;10056:10;10045:30;;;;;;;;;;;;:::i;:::-;10011:111;;;;-1:-1:-1;;;10011:111:0;;23512:2:1;10011:111:0;;;23494:21:1;23551:2;23531:18;;;23524:30;23590:34;23570:18;;;23563:62;-1:-1:-1;;;23641:18:1;;;23634:40;23691:19;;10011:111:0;23310:406:1;56856:830:0;56952:16;;;56966:1;56952:16;;;;;;;;56928:21;;56952:16;;;;;;;;;;-1:-1:-1;56952:16:0;56928:40;;56997:4;56979;56984:1;56979:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56979:23:0;;;:7;;;;;;;;;:23;57023:18;;57013:7;;57023:18;;;57013:4;;57023:18;;57013:7;;;;;;:::i;:::-;-1:-1:-1;;;;;57013:28:0;;;:7;;;;;;;;;;:28;;;;57067:10;;:17;;;-1:-1:-1;;;57067:17:0;;;;:10;;;;;:15;;:17;;;;;57013:7;;57067:17;;;;;:10;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;57056:28:0;:4;57061:1;57056:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;57056:28:0;;57052:627;;57100:10;;:249;;-1:-1:-1;;;57100:249:0;;-1:-1:-1;;;;;57100:10:0;;;;:61;;:249;;57180:11;;57100:10;;57264:4;;57295;;57319:15;;57100:249;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57052:627;57380:15;;57480:10;;57380:287;;-1:-1:-1;;;57380:287:0;;-1:-1:-1;;;;;57380:15:0;;;;:69;;:287;;57480:10;;;57514:11;;57380:15;;57606:4;;57633:15;;57380:287;;;:::i;57694:783::-;57815:10;;;;;;;;;-1:-1:-1;;;;;57815:10:0;-1:-1:-1;;;;;57815:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57793:18;;-1:-1:-1;;;;;57793:39:0;;;:18;;:39;57789:669;;57848:10;;:289;;-1:-1:-1;;;57848:289:0;;57925:4;57848:289;;;24649:34:1;24699:18;;;24692:34;;;57848:10:0;24742:18:1;;;24735:34;;;24785:18;;;24778:34;58081:6:0;24828:19:1;;;24821:44;58107:15:0;24881:19:1;;;24874:35;-1:-1:-1;;;;;57848:10:0;;;;:26;;57882:15;;24583:19:1;;57848:289:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;42651:469:::1;42514:613:::0;:::o;57789:669::-;58167:10;;58241:18;;58167:279;;-1:-1:-1;;;58167:279:0;;58217:4;58167:279;;;25628:34:1;-1:-1:-1;;;;;58241:18:0;;;25678::1;;;25671:43;25730:18;;;25723:34;;;25773:18;;;25766:34;;;58167:10:0;25816:19:1;;;25809:35;;;25860:19;;;25853:35;58390:6:0;25904:19:1;;;25897:44;58416:15:0;25957:19:1;;;25950:35;58167:10:0;;;:23;;25562:19:1;;58167:279:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35070:167::-;35166:9;35158:7;;:17;;;;:::i;:::-;35148:7;:27;35204:15;;:25;;35220:9;;35204:25;:::i;:::-;35186:15;:43;-1:-1:-1;;35070:167:0:o;933:229::-;1070:12;1102:52;1124:6;1132:4;1138:1;1141:12;1102:21;:52::i;:::-;1095:59;933:229;-1:-1:-1;;;;933:229:0:o;1400:455::-;1570:12;1628:5;1603:21;:30;;1595:81;;;;-1:-1:-1;;;1595:81:0;;26198:2:1;1595:81:0;;;26180:21:1;26237:2;26217:18;;;26210:30;26276:34;26256:18;;;26249:62;-1:-1:-1;;;26327:18:1;;;26320:36;26373:19;;1595:81:0;25996:402:1;1595:81:0;1688:12;1702:23;1729:6;-1:-1:-1;;;;;1729:11:0;1748:5;1755:4;1729:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1687:73;;;;1778:69;1805:6;1813:7;1822:10;1834:12;1778:26;:69::i;:::-;1771:76;1400:455;-1:-1:-1;;;;;;;1400:455:0:o;2949:644::-;3134:12;3163:7;3159:427;;;3191:10;:17;3212:1;3191:22;3187:290;;-1:-1:-1;;;;;380:19:0;;;3401:60;;;;-1:-1:-1;;;3401:60:0;;26897:2:1;3401:60:0;;;26879:21:1;26936:2;26916:18;;;26909:30;26975:31;26955:18;;;26948:59;27024:18;;3401:60:0;26695:353:1;3401:60:0;-1:-1:-1;3498:10:0;3491:17;;3159:427;3541:33;3549:10;3561:12;4071:17;;:21;4067:388;;4303:10;4297:17;4360:15;4347:10;4343:2;4339:19;4332:44;4067:388;4430:12;4423:20;;-1:-1:-1;;;4423:20:0;;;;;;;;:::i;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:131::-;-1:-1:-1;;;;;745:31:1;;735:42;;725:70;;791:1;788;781:12;806:315;874:6;882;935:2;923:9;914:7;910:23;906:32;903:52;;;951:1;948;941:12;903:52;990:9;977:23;1009:31;1034:5;1009:31;:::i;:::-;1059:5;1111:2;1096:18;;;;1083:32;;-1:-1:-1;;;806:315:1:o;1695:180::-;1754:6;1807:2;1795:9;1786:7;1782:23;1778:32;1775:52;;;1823:1;1820;1813:12;1775:52;-1:-1:-1;1846:23:1;;1695:180;-1:-1:-1;1695:180:1:o;1880:456::-;1957:6;1965;1973;2026:2;2014:9;2005:7;2001:23;1997:32;1994:52;;;2042:1;2039;2032:12;1994:52;2081:9;2068:23;2100:31;2125:5;2100:31;:::i;:::-;2150:5;-1:-1:-1;2207:2:1;2192:18;;2179:32;2220:33;2179:32;2220:33;:::i;:::-;1880:456;;2272:7;;-1:-1:-1;;;2326:2:1;2311:18;;;;2298:32;;1880:456::o;2341:118::-;2427:5;2420:13;2413:21;2406:5;2403:32;2393:60;;2449:1;2446;2439:12;2464:382;2529:6;2537;2590:2;2578:9;2569:7;2565:23;2561:32;2558:52;;;2606:1;2603;2596:12;2558:52;2645:9;2632:23;2664:31;2689:5;2664:31;:::i;:::-;2714:5;-1:-1:-1;2771:2:1;2756:18;;2743:32;2784:30;2743:32;2784:30;:::i;:::-;2833:7;2823:17;;;2464:382;;;;;:::o;3040:247::-;3099:6;3152:2;3140:9;3131:7;3127:23;3123:32;3120:52;;;3168:1;3165;3158:12;3120:52;3207:9;3194:23;3226:31;3251:5;3226:31;:::i;3292:161::-;3359:20;;3419:8;3408:20;;3398:31;;3388:59;;3443:1;3440;3433:12;3388:59;3292:161;;;:::o;3458:256::-;3524:6;3532;3585:2;3573:9;3564:7;3560:23;3556:32;3553:52;;;3601:1;3598;3591:12;3553:52;3624:28;3642:9;3624:28;:::i;:::-;3614:38;;3671:37;3704:2;3693:9;3689:18;3671:37;:::i;:::-;3661:47;;3458:256;;;;;:::o;3719:309::-;3784:6;3792;3845:2;3833:9;3824:7;3820:23;3816:32;3813:52;;;3861:1;3858;3851:12;3813:52;3897:9;3884:23;3874:33;;3957:2;3946:9;3942:18;3929:32;3970:28;3992:5;3970:28;:::i;4241:388::-;4309:6;4317;4370:2;4358:9;4349:7;4345:23;4341:32;4338:52;;;4386:1;4383;4376:12;4338:52;4425:9;4412:23;4444:31;4469:5;4444:31;:::i;:::-;4494:5;-1:-1:-1;4551:2:1;4536:18;;4523:32;4564:33;4523:32;4564:33;:::i;5102:380::-;5181:1;5177:12;;;;5224;;;5245:61;;5299:4;5291:6;5287:17;5277:27;;5245:61;5352:2;5344:6;5341:14;5321:18;5318:38;5315:161;;5398:10;5393:3;5389:20;5386:1;5379:31;5433:4;5430:1;5423:15;5461:4;5458:1;5451:15;5315:161;;5102:380;;;:::o;5487:127::-;5548:10;5543:3;5539:20;5536:1;5529:31;5579:4;5576:1;5569:15;5603:4;5600:1;5593:15;5619:217;5659:1;5685;5675:132;;5729:10;5724:3;5720:20;5717:1;5710:31;5764:4;5761:1;5754:15;5792:4;5789:1;5782:15;5675:132;-1:-1:-1;5821:9:1;;5619:217::o;6455:128::-;6522:9;;;6543:11;;;6540:37;;;6557:18;;:::i;7686:127::-;7747:10;7742:3;7738:20;7735:1;7728:31;7778:4;7775:1;7768:15;7802:4;7799:1;7792:15;7818:168;7891:9;;;7922;;7939:15;;;7933:22;;7919:37;7909:71;;7960:18;;:::i;7991:125::-;8056:9;;;8077:10;;;8074:36;;;8090:18;;:::i;8121:127::-;8182:10;8177:3;8173:20;8170:1;8163:31;8213:4;8210:1;8203:15;8237:4;8234:1;8227:15;8253:135;8292:3;8313:17;;;8310:43;;8333:18;;:::i;:::-;-1:-1:-1;8380:1:1;8369:13;;8253:135::o;8393:170::-;8460:8;8488:10;;;8500;;;8484:27;;8523:11;;;8520:37;;;8537:18;;:::i;8568:345::-;8770:2;8752:21;;;8809:2;8789:18;;;8782:30;-1:-1:-1;;;8843:2:1;8828:18;;8821:51;8904:2;8889:18;;8568:345::o;8918:344::-;9120:2;9102:21;;;9159:2;9139:18;;;9132:30;-1:-1:-1;;;9193:2:1;9178:18;;9171:50;9253:2;9238:18;;8918:344::o;9267:339::-;9469:2;9451:21;;;9508:2;9488:18;;;9481:30;-1:-1:-1;;;9542:2:1;9527:18;;9520:45;9597:2;9582:18;;9267:339::o;9611:338::-;9813:2;9795:21;;;9852:2;9832:18;;;9825:30;-1:-1:-1;;;9886:2:1;9871:18;;9864:44;9940:2;9925:18;;9611:338::o;11121:415::-;11323:2;11305:21;;;11362:2;11342:18;;;11335:30;11401:34;11396:2;11381:18;;11374:62;-1:-1:-1;;;11467:2:1;11452:18;;11445:49;11526:3;11511:19;;11121:415::o;12656:251::-;12726:6;12779:2;12767:9;12758:7;12754:23;12750:32;12747:52;;;12795:1;12792;12785:12;12747:52;12827:9;12821:16;12846:31;12871:5;12846:31;:::i;15067:184::-;15137:6;15190:2;15178:9;15169:7;15165:23;15161:32;15158:52;;;15206:1;15203;15196:12;15158:52;-1:-1:-1;15229:16:1;;15067:184;-1:-1:-1;15067:184:1:o;15388:461::-;15441:3;15479:5;15473:12;15506:6;15501:3;15494:19;15532:4;15561:2;15556:3;15552:12;15545:19;;15598:2;15591:5;15587:14;15619:1;15629:195;15643:6;15640:1;15637:13;15629:195;;;15708:13;;-1:-1:-1;;;;;15704:39:1;15692:52;;15764:12;;;;15799:15;;;;15740:1;15658:9;15629:195;;;-1:-1:-1;15840:3:1;;15388:461;-1:-1:-1;;;;;15388:461:1:o;15854:510::-;16125:6;16114:9;16107:25;16168:3;16163:2;16152:9;16148:18;16141:31;16088:4;16189:57;16241:3;16230:9;16226:19;16218:6;16189:57;:::i;:::-;-1:-1:-1;;;;;16282:32:1;;;;16277:2;16262:18;;16255:60;-1:-1:-1;16346:2:1;16331:18;16324:34;16181:65;15854:510;-1:-1:-1;;15854:510:1:o;16369:582::-;16668:6;16657:9;16650:25;16711:6;16706:2;16695:9;16691:18;16684:34;16754:3;16749:2;16738:9;16734:18;16727:31;16631:4;16775:57;16827:3;16816:9;16812:19;16804:6;16775:57;:::i;:::-;-1:-1:-1;;;;;16868:32:1;;;;16863:2;16848:18;;16841:60;-1:-1:-1;16932:3:1;16917:19;16910:35;16767:65;16369:582;-1:-1:-1;;;16369:582:1:o;23060:245::-;23127:6;23180:2;23168:9;23159:7;23155:23;23151:32;23148:52;;;23196:1;23193;23186:12;23148:52;23228:9;23222:16;23247:28;23269:5;23247:28;:::i;23721:582::-;24049:1;24045;24040:3;24036:11;24032:19;24024:6;24020:32;24009:9;24002:51;24089:6;24084:2;24073:9;24069:18;24062:34;24132:6;24127:2;24116:9;24112:18;24105:34;24175:3;24170:2;24159:9;24155:18;24148:31;23983:4;24196:57;24248:3;24237:9;24233:19;24225:6;24196:57;:::i;:::-;24188:65;;24290:6;24284:3;24273:9;24269:19;24262:35;23721:582;;;;;;;;:::o;24920:306::-;25008:6;25016;25024;25077:2;25065:9;25056:7;25052:23;25048:32;25045:52;;;25093:1;25090;25083:12;25045:52;25122:9;25116:16;25106:26;;25172:2;25161:9;25157:18;25151:25;25141:35;;25216:2;25205:9;25201:18;25195:25;25185:35;;24920:306;;;;;:::o;26403:287::-;26532:3;26570:6;26564:13;26586:66;26645:6;26640:3;26633:4;26625:6;26621:17;26586:66;:::i;:::-;26668:16;;;;;26403:287;-1:-1:-1;;26403:287:1:o

Swarm Source

ipfs://394381c3913f18d5a2782a2384120dcf856d803aa2e8b1156da8da472c4cc7ac

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.