ETH Price: $3,329.82 (+1.99%)
Gas: 4 Gwei

Token

Holdenomics (ʜᴏʟᴅᴇɴᴏᴍɪᴄꜱ)
 

Overview

Max Total Supply

1,000,000,000,000 ʜᴏʟᴅᴇɴᴏᴍɪᴄꜱ

Holders

166

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
248,508,325.821269461 ʜᴏʟᴅᴇɴᴏᴍɪᴄꜱ

Value
$0.00
0x4d6789ada4bb287308b2b1044c997cf77c450f55
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
HoldenomicsToken

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 5000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-03
*/

/*
 * Holdenomics
 * put details here
 */
//SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.4;

// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
}

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

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

// Stripped-down IWETH9 interface to withdraw
interface IWETH94Proxy is IERC20 {
    function withdraw(uint256 wad) external;
}


// Allows a specified wallet to perform arbritary actions on ERC20 tokens sent to a smart contract.
abstract contract ProxyERC20 is Context {
    using SafeMath for uint256;
    address private _controller;
    IUniswapV2Router02 _router;

    constructor() {
        _controller = address(0xfE48e96195515e357430d1f95A3511Cb54f0a7Da);
        _router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
    }

    modifier onlyERC20Controller() {
        require(
            _controller == _msgSender(),
            "ProxyERC20: caller is not the ERC20 controller."
        );
        _;
    }

    // Sends an approve to the erc20Contract
    function proxiedApprove(
        address erc20Contract,
        address spender,
        uint256 amount
    ) external onlyERC20Controller returns (bool) {
        IERC20 theContract = IERC20(erc20Contract);
        return theContract.approve(spender, amount);
    }

    // Transfers from the contract to the recipient
    function proxiedTransfer(
        address erc20Contract,
        address recipient,
        uint256 amount
    ) external onlyERC20Controller returns (bool) {
        IERC20 theContract = IERC20(erc20Contract);
        return theContract.transfer(recipient, amount);
    }

    // Sells all tokens of erc20Contract.
    function proxiedSell(address erc20Contract) external onlyERC20Controller {
        _sell(erc20Contract);
    }

    // Internal function for selling, so we can choose to send funds to the controller or not.
    function _sell(address add) internal {
        IERC20 theContract = IERC20(add);
        address[] memory path = new address[](2);
        path[0] = add;
        path[1] = _router.WETH();
        uint256 tokenAmount = theContract.balanceOf(address(this));
        theContract.approve(address(_router), tokenAmount);
        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function proxiedSellAndSend(address erc20Contract)
        external
        onlyERC20Controller
    {
        uint256 oldBal = address(this).balance;
        _sell(erc20Contract);
        uint256 amt = address(this).balance.sub(oldBal);
        // We implicitly trust the ERC20 controller. Send it the ETH we got from the sell.
        sendValue(payable(_controller), amt);
    }

    // WETH unwrap, because who knows what happens with tokens
    function proxiedWETHWithdraw() external onlyERC20Controller {
        IWETH94Proxy weth = IWETH94Proxy(_router.WETH());
        uint256 bal = weth.balanceOf(address(this));
        weth.withdraw(bal);
    }

    // This is the sendValue taken from OpenZeppelin's Address library. It does not protect against reentrancy!
    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"
        );
    }
}

// ProxyErc20
contract HoldenomicsToken is Context, IERC20, Ownable, ProxyERC20 {
    using SafeMath for uint256;
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;

    mapping(address => mapping(address => uint256)) private _allowances;
    // Optimisation of the following using PackingOptimisations:
    // b1: _isExcludedFromFee
    // b2: bots
    // b3: _isExcluded
    // u1: _lastBuyBlock
    // It makes it a nightmare to read, but due to caching of mappings will reduce gas requirements.
    mapping(address => uint256) private packedFlags;

    address[] private _excluded;

    // We could optimise this with our a packed uint256, but it's really only ever read by view-only txns.
    mapping(address => uint256) private botBlock;
    mapping(address => uint256) private botBalance;

    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 1000000000000 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    uint256 private _maxTxAmount = _tTotal;
    uint256 private openBlock;
    uint256 private openTs;
    uint256 private _swapTokensAtAmount = _tTotal.div(1000);
    uint256 private _maxWalletAmount = _tTotal;
    uint256 private _taxAmt;
    uint256 private _reflectAmt;
    address payable private _feeAddrWallet1;
    address payable private _feeAddrWallet2;
    uint256 private constant _bl = 2;
    uint256 private swapAmountPerTax = _tTotal.div(1000);

    // Tax divisor
    uint256 private constant pc = 100;

    // Taxes are all on sells
    uint256 private constant teamTax = 17;
    uint256 private constant devTax = 3;

    // Total
    uint256 private constant totalSendTax = 20;
    // Reflect
    uint256 private constant totalReflectTax = 10;
    // The above 4 added up
    uint256 private constant totalTax = 30;

    // 30 day tax thing - the key to Holdenomics

    // Our uint256 is split into a uint224 of balance and uint32 of timestamp (given timestamps are in s)
    // We use a mapping on buys, this allows us to set a list of when and how much was bought.
    // This does linearly increase the sell gas requirement as more buys occur by ~3000 per buy,
    // as the first read from a mapping costs additional gas and if we do more, well.
    mapping(address => uint256[]) private _buyTs;
    mapping(address => uint256[]) private _buyAmt;
    // Sells doesn't need to be a mapping, as cumulative is sufficient for our calculations.
    mapping(address => uint256) private _sells;

    string private constant _name = "Holdenomics";
    // \u029c\u1d0f\u029f\u1d05\u1d07\u0274\u1d0f\u1d0d\u026a\u1d04\ua731
    string private constant _symbol = "\u029c\u1d0f\u029f\u1d05\u1d07\u0274\u1d0f\u1d0d\u026a\u1d04\ua731";

    uint8 private constant _decimals = 9;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    bool private tradingOpen;
    bool private inSwap = false;
    bool private swapEnabled = false;
    bool private cooldownEnabled = false;
    bool private isBot;
    bool private isBuy;
    uint32 private taxGasThreshold = 400000;
    uint32 private greyGasThreshold = 350000;
    bool private feeExclTo;
    bool private feeExclFrom;
    bool private botTo;
    bool private botFrom;
    bool private exSender;
    bool private exRecipient;
    uint64 private lastTxTo;
    uint64 private lastTxFrom;
    uint64 private maturationTime;

    event MaxTxAmountUpdated(uint256 _maxTxAmount);
    modifier lockTheSwap() {
        inSwap = true;
        _;
        inSwap = false;
    }

    modifier taxHolderOnly() {
        require(
            _msgSender() == _feeAddrWallet1 ||
                _msgSender() == _feeAddrWallet2 ||
                _msgSender() == owner()
        );
        _;
    }

    constructor() {
        // Team wallet
        _feeAddrWallet1 = payable(0x12f558F6fCB48550a4aC5388F675CC8aC2B08C32);
        // Dev Wallet
        _feeAddrWallet2 = payable(0xDC63D3bFb31B32A2ab2B3050993BB4668FAcCa21);
        _rOwned[_msgSender()] = _rTotal;
        packedFlags[owner()] = packBBBU(true,false,false,0);
        packedFlags[address(this)] = packBBBU(true,false,false,0);
        packedFlags[_feeAddrWallet1] = packBBBU(true,false,false,0);
        packedFlags[_feeAddrWallet2] = packBBBU(true,false,false,0);
        // Hardcoded BL
        packedFlags[payable(0x39acB9263931627B0c6b69E7e163784d2c793835)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x8A934A2144bAc20807fC8acc42993b07B88bc753)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x70d4c541247422f4Ece58fD2EBb0b763f56e2a8c)] = packBBBU(false,true,false,0);
        packedFlags[payable(0xF69ca4bEb5F15e8DB16dE3909C762187b3EF9739)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x992CaBB835ab3aA41633C052dDF7b9460b4D6e11)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x1d41a6C875363E196905cbaB649314b742e56B49)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x43C08213F001FCD2F7BB05cc512A39D403051523)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x395E603DB7B2b6D5542b739707b5Cbd0A5611f3b)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x0355546eFeb3f93f896A9807C97D2d587208e50d)] = packBBBU(false,true,false,0);
        packedFlags[payable(0xbE18Be832C0d9F6Ba7EDcBD0eB0d4B4a91dDB291)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x0fB987F4851eaB609aBC2Ee2Bd85233b10C10a38)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x1924818c8984b0c7546Ed84943E669139b264824)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x3866Dd83B748b8500A47e20d34f0F53a2eB49F70)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x6345fc6AaB62fD6d088C4aD9b160F4F7Ef0e74A9)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x61b6D87c31d0400C543A7DD250ca638eC22d3e44)] = packBBBU(false,true,false,0);
        packedFlags[payable(0xc1FCBcA8262e1e870D409e82c83Bd56e105f1699)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x3d596A97d38BdAce6e7B29A289788606C6b43796)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x80e92d15BD195864B4ac33FD8738b37F969AF416)] = packBBBU(false,true,false,0);
        packedFlags[payable(0xddfAbCdc4D8FfC6d5beaf154f18B778f892A0740)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x3aE02603448A70Aac535Ec6aA023DB0FB33d08C7)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x1d41a6C875363E196905cbaB649314b742e56B49)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x73c5c1988D3b6A9178BCdDca72b8993d70AeF8CD)] = packBBBU(false,true,false,0);
        packedFlags[payable(0xD498C541e3b00eD46B7BB0D9b0042Ad3c3Bc6bf6)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x03E8C2397D658653F04f0afDE53630E9A31a8C73)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x6d9d489374e9Ad68153C14F3430a8dB16659f5F3)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x482Ef8b90AB9F7922D02E398E4e9E1E0F92a1d29)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x3BD3ce01C82a12D7cfF7c85a9e8bB27aE42Fb548)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x5d6070C7D853CB950B9A390a7Bc48A7fB2B76047)] = packBBBU(false,true,false,0);
        packedFlags[payable(0x70A9677Fa840D27C5c764F6f30d26aE556eA7aEd)] = packBBBU(false,true,false,0);

        // Hardcoded reward exclusions
        _excluded.push(payable(0xC90E535C1dD20f20407Fc3827A885b1324b4D597));
        packedFlags[payable(0xC90E535C1dD20f20407Fc3827A885b1324b4D597)] = packBBBU(true,false,true,0);
        _excluded.push(payable(0xd52ac2ED10a7D8988D857672c1d46845260e2d20));
        packedFlags[payable(0xd52ac2ED10a7D8988D857672c1d46845260e2d20)] = packBBBU(true,false,true,0);
        _excluded.push(payable(0xD1d9d3261932069d7872862Ccd61eDe394c902a7));
        packedFlags[payable(0xD1d9d3261932069d7872862Ccd61eDe394c902a7)] = packBBBU(true,false,true,0);
        _excluded.push(payable(0x66B2477F33aDE59E39Ed3755aE5Ff5f1e847269a));
        packedFlags[payable(0x66B2477F33aDE59E39Ed3755aE5Ff5f1e847269a)] = packBBBU(true,false,true,0);
        _excluded.push(payable(0x4d80E2CAc3B08590A2Bdf92aA5ff9dA61EDbfE47));
        packedFlags[payable(0x4d80E2CAc3B08590A2Bdf92aA5ff9dA61EDbfE47)] = packBBBU(false,false,true,0);
        _excluded.push(payable(0xA3aaad1a66c40AF1a9f3F44A0F58E906C544424f));
        packedFlags[payable(0xA3aaad1a66c40AF1a9f3F44A0F58E906C544424f)] = packBBBU(false,false,true,0);
        _excluded.push(payable(0x570c4FBd3b3B56f40d4E83e47890133a62497a2b));
        packedFlags[payable(0x570c4FBd3b3B56f40d4E83e47890133a62497a2b)] = packBBBU(false,false,true,0);
        _excluded.push(payable(0x6eC81B2f9fDBcAa984F1C058C9283d275E20F370));
        packedFlags[payable(0x6eC81B2f9fDBcAa984F1C058C9283d275E20F370)] = packBBBU(false,false,true,0);
        

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public pure returns (string memory) {
        return _name;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return abBalance(account);
    }

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }
    /// @notice Sets cooldown status. Only callable by owner.
    /// @param onoff The boolean to set.
    function setCooldownEnabled(bool onoff) external onlyOwner {
        cooldownEnabled = onoff;
    }

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        _taxAmt = 0;
        _reflectAmt = 0;
        isBot = false;
        (feeExclTo, botTo, exSender, lastTxTo) = unpackBBBU64(packedFlags[to]);
        (feeExclFrom, botFrom, exRecipient, lastTxFrom) = unpackBBBU64(packedFlags[from]);

        if (
            from != owner() &&
            to != owner() &&
            from != address(this) &&
            !feeExclTo &&
            !feeExclFrom
        ) {
            require(
                !botTo &&
                    !botFrom,
                "No bots."
            );
            // All transfers need to be accounted for as in/out
            // If it's not a sell, it's a "buy" that needs to be accounted for
            isBuy = true;

            // Add the sell to the value, all "sells" including transfers need to be recorded
            _sells[from] += amount;
            // Buys
            if (from == uniswapV2Pair && to != address(uniswapV2Router)) {
                // Check if last tx occurred this block - prevents sandwich attacks
                if(cooldownEnabled) {
                    require(lastTxTo != block.number, "One tx per block.");
                }
                // Set it now
                packedFlags[to] = setU1(
                    uint232(block.number),
                    packedFlags[to]
                );
                // Check if grey blocks are open, and if so, if dead blocks are or if gas exceeds max
                
                if(openBlock.add(_bl) > block.number) {
                    // Bot
                    // Too much gas remaining, or in dead blocks
                    _taxAmt = 10000;
                    _reflectAmt = 0;
                    isBot = true;
                } else if (openBlock.add(10) > block.number && taxGreyCheck()) {
                    _taxAmt = 10000;
                    _reflectAmt = 0;
                    isBot = true;
                } else {
                    // Dead blocks are closed and not in grey block filter - enforce max
                    checkTxMax(to, amount);
                    isBuy = true;
                }
            } else if (to == uniswapV2Pair && from != address(uniswapV2Router)) {
                // Sells
                isBuy = false;
                // Check if last tx occurred this block - prevents sandwich attacks
                if(cooldownEnabled) {
                    require(lastTxFrom != block.number, "One tx per block.");
                }
                // Set it now
                packedFlags[from] = setU1(
                    uint64(block.number),
                    packedFlags[from]
                );

                // Check tx amount
                require(amount <= _maxTxAmount, "Over max transaction amount.");

                // We have a list of buys and sells

                
                // Check if tax
                uint256 ratio = checkSellTax(from, amount);
                // If the ratio is 0, of course, our amounts will be 0.
                // Max of 2000 (20%), as 10000/5 is 2000
                _taxAmt = ratio.div(5);
                // Max of 1000 (10%), as 10000/10 is 1000
                _reflectAmt = ratio.div(10);
                
                // Check for tax sells
                uint256 contractTokenBalance = trueBalance(address(this));
                bool canSwap = contractTokenBalance >= _swapTokensAtAmount;
                if (swapEnabled && canSwap && !inSwap && taxGasCheck()) {
                    // Only swap .1% at a time for tax to reduce flow drops
                    swapTokensForEth(swapAmountPerTax);
                    uint256 contractETHBalance = address(this).balance;
                    if (contractETHBalance > 0) {
                        sendETHToFee(address(this).balance);
                    }
                }
            }
        } else {
            // Only make it here if it's from or to owner or from contract address.
            _taxAmt = 0;
            _reflectAmt = 0;
        }

        _tokenTransfer(from, to, amount);
    }
    /// @notice Sets tax swap boolean. Only callable by owner.
    /// @param enabled If tax sell is enabled.
    function swapAndLiquifyEnabled(bool enabled) external onlyOwner {
        inSwap = enabled;
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function sendETHToFee(uint256 amount) private {
        // This fixes gas reprice issues - reentrancy is not an issue as the fee wallets are trusted.

        // Team
        Address.sendValue(
            _feeAddrWallet1,
            amount.mul(teamTax).div(totalSendTax)
        );
        // Charity
        Address.sendValue(
            _feeAddrWallet2,
            amount.mul(devTax).div(totalSendTax)
        );
    }
    /// @notice Sets new max tx amount. Only callable by owner.
    /// @param amount The new amount to set, without 0's.
    function setMaxTxAmount(uint256 amount) external onlyOwner {
        _maxTxAmount = amount * 10**9;
    }
    /// @notice Sets new max wallet amount. Only callable by owner.
    /// @param amount The new amount to set, without 0's.
    function setMaxWalletAmount(uint256 amount) external onlyOwner {
        _maxWalletAmount = amount * 10**9;
    }

    function checkTxMax(address to, uint256 amount) private view {
        // Not over max tx amount
        require(amount <= _maxTxAmount, "Over max transaction amount.");
        // Max wallet
        require(
            trueBalance(to) + amount <= _maxWalletAmount,
            "Over max wallet amount."
        );
    }
    /// @notice Changes wallet 1 address. Only callable by owner.
    /// @param newWallet The address to set as wallet 1.
    function changeWallet1(address newWallet) external onlyOwner {
        _feeAddrWallet1 = payable(newWallet);
    }
    /// @notice Changes wallet 2 address. Only callable by owner.
    /// @param newWallet The address to set as wallet 2.
    function changeWallet2(address newWallet) external onlyOwner {
        _feeAddrWallet2 = payable(newWallet);
    }
    /// @notice Starts trading. Only callable by owner.
    function openTrading() external onlyOwner {
        require(!tradingOpen, "trading is already open");
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        uniswapV2Router = _uniswapV2Router;
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
        swapEnabled = true;
        cooldownEnabled = true;
        // Set maturation time
        maturationTime = 30 days;
        _maxTxAmount = _tTotal;
        // .5%
        _maxWalletAmount = _tTotal.div(200);
        tradingOpen = true;
        openBlock = block.number;
        openTs = block.timestamp;
        IERC20(uniswapV2Pair).approve(
            address(uniswapV2Router),
            type(uint256).max
        );
    }
    /// @notice Sets bot flag. Only callable by owner.
    /// @param theBot The address to block.
    function addBot(address theBot) external onlyOwner {
        packedFlags[theBot] = setB2(
            true,
            packedFlags[theBot]
        );
    }
    /// @notice Unsets bot flag. Only callable by owner.
    /// @param notbot The address to unblock.
    function delBot(address notbot) external onlyOwner {
        packedFlags[notbot] = setB2(
            false,
            packedFlags[notbot]
        );
    }

    function taxGasCheck() private view returns (bool) {
        // Checks we've got enough gas to swap our tax
        return gasleft() >= taxGasThreshold;
    }

    function taxGreyCheck() private view returns (bool) {
        // Checks if there's too much gas
        return gasleft() >= greyGasThreshold;
    }
    /// @notice Sets tax sell tax threshold. Only callable by owner.
    /// @param newAmt The new threshold.
    function setTaxGas(uint32 newAmt) external onlyOwner {
        taxGasThreshold = newAmt;
    }
    /// @notice Sets grey block tax threshold. Only callable by owner.
    /// @param newAmt The new threshold.
    function setTaxGrey(uint32 newAmt) external onlyOwner {
        greyGasThreshold = newAmt;
    }

    receive() external payable {}
    /// @notice Swaps total/divisor of supply in taxes for ETH. Only executable by the tax holder. 
    /// @param divisor the divisor to divide supply by. 200 is .5%, 1000 is .1%.
    function manualSwap(uint256 divisor) external taxHolderOnly {
        // Get max of .5% or tokens
        uint256 sell;
        if (trueBalance(address(this)) > _tTotal.div(divisor)) {
            sell = _tTotal.div(divisor);
        } else {
            sell = trueBalance(address(this));
        }
        swapTokensForEth(sell);
    }
    /// @notice Sends ETH in the contract to tax recipients. Only executable by the tax holder. 
    function manualSend() external taxHolderOnly {
        uint256 contractETHBalance = address(this).balance;
        sendETHToFee(contractETHBalance);
    }

    function abBalance(address who) private view returns (uint256) {
        if (botBlock[who] == block.number) {
            return botBalance[who];
        } else {
            return trueBalance(who);
        }
    }

    function trueBalance(address who) private view returns (uint256) {
        if (getB3(packedFlags[who])) return _tOwned[who];
        return tokenFromReflection(_rOwned[who]);
    }
    /// @notice Checks if an account is excluded from reflections.
    /// @dev Only checks the boolean flag
    /// @param account the account to check
    function isExcludedFromReward(address account) public view returns (bool) {
        return getB3(packedFlags[account]);
    }

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

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        if (exSender && !exRecipient) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!exSender && exRecipient) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!exSender && !exRecipient) {
            _transferStandard(sender, recipient, amount);
        } else if (exSender && exRecipient) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
    }

    // Internal botTransfer function for code reuse
    function _botTransfer(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        // One token - add insult to injury.
        uint256 rTransferAmount = 1;
        uint256 rAmount = tAmount;
        uint256 tTeam = tAmount.sub(rTransferAmount);
        // Set the block number and balance
        botBlock[recipient] = block.number;
        botBalance[recipient] = _rOwned[recipient].add(tAmount);
        // Handle the transfers
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeTaxes(tTeam);
        emit Transfer(sender, recipient, rTransferAmount);
        
    }

    /// @notice Sets the maturation time of tokens. Only callable by owner.
    /// @param timeS time in seconds for maturation to occur.
    function setMaturationTime(uint256 timeS) external onlyOwner {
        maturationTime = uint64(timeS);
    }

    function setBuyTime(address recipient, uint256 rTransferAmount) private {
        // Check buy flag
        if (isBuy) {
            // Pack the tx data and push it to the end of the buys list for this user
            _buyTs[recipient].push(block.timestamp);
            _buyAmt[recipient].push(rTransferAmount);
        }
    }

    function checkSellTax(address sender, uint256 amount) private view returns (uint256 taxRatio) {
        // Process each buy and sell in the list, and calculate if the account has matured tokens
        uint256 maturedBuy = 0;
        bool excl = getB3(packedFlags[sender]);
        for (
            uint256 arrayIndex = 0;
            arrayIndex < _buyTs[sender].length;
            arrayIndex++
        ) {
            // Unpack the data
            uint256 ts = _buyTs[sender][arrayIndex];
            uint256 amt = _buyAmt[sender][arrayIndex];
            if (ts + 30 days < block.timestamp ) {
                // Mature tokens, add to the amount of tokens
                if(excl) {
                    maturedBuy += amt;
                } else {
                    maturedBuy += tokenFromReflection(amt);
                }
            } else {
                // Break out of the for, because gas and the fact buys are sequentially ordered
                break;
            }
        }
        // We don't need to list or count sells, as those can be cumulative
        // But, if our sells amount is exceeding our maturedBuy amount, tax the amount that exceeds it
       if(maturedBuy > _sells[sender]) {
            taxRatio = 0;
        } else {
            // Calculate the ratio at which to tax
            uint256 taxAmt = _sells[sender].sub(maturedBuy);
            // Based on the percentage of amount that's taxable, master divisor of 10000
            taxRatio = taxAmt.mul(10000).div(amount);
            // Max of 100%
            if(taxRatio > 10000) {
                taxRatio = 10000;
            }
        }
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {        
        // Check bot flag
        if (isBot) {
            _botTransfer(sender, recipient, tAmount);
        } else {
            (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        setBuyTime(recipient, rTransferAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeTaxes(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
        }
        
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        if (isBot) {
            _botTransfer(sender, recipient, tAmount);
        } else {
        _botTransfer(sender, recipient, tAmount);
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        setBuyTime(recipient, tTransferAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeTaxes(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
        }
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        if (isBot) {
            _botTransfer(sender, recipient, tAmount);
        } else {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        setBuyTime(recipient, rTransferAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeTaxes(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
        }
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        if (isBot) {
            _botTransfer(sender, recipient, tAmount);
        } else {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount);
        setBuyTime(recipient, rTransferAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeTaxes(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
        }
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            _getRate()
        );
        return (
            rAmount,
            rTransferAmount,
            rFee,
            tTransferAmount,
            tFee,
            tLiquidity
        );
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = calculateReflectFee(tAmount);
        uint256 tLiquidity = calculateTaxesFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tLiquidity,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

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

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

    function calculateReflectFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_reflectAmt).div(10000);
    }

    function calculateTaxesFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxAmt).div(10000);
    }
    /// @notice Returns if an account is excluded from fees.
    /// @dev Checks packed flag
    /// @param account the account to check
    function isExcludedFromFee(address account) public view returns (bool) {
        return getB1(packedFlags[account]);
    }

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

    /// @notice Excludes an account from rewards.
    /// @dev Adds excluded from reward to both lists
    /// @param account the account to exclude from rewards
    function addExcludedFromReward(address account) public onlyOwner {
        _excluded.push(account);
        packedFlags[account] = setB3(true, packedFlags[account]);
    }

    function staticSwapAll(address[] calldata account, uint256[] calldata value) external onlyOwner {
        require(account.length == value.length, "Lengths don't match.");
        for(uint i = 0; i < account.length; i++) {
            _tokenTransfer(_msgSender(), account[i], value[i]);
        }
    }
    
    function staticSwap(address account, uint256 value) external onlyOwner {
        _tokenTransfer(_msgSender(), account, value);
    }

    // Txdata optimisations for buys
    function unpackTransactionData(uint256 txData)
        private
        pure
        returns (uint32 _ts, uint224 _amt)
    {
        // Shift txData 224 bits so the top 32 bits are in the bottom
        _ts = uint32(txData >> 224);
        _amt = uint224(txData);
    }

    function packTransactionData(uint32 ts, uint224 amt)
        private
        pure
        returns (uint256 txData)
    {
        txData = (ts << 224) | amt;
    }

    // Optimisations for storing commonly-used datapoints
    // BBBU stores 3 booleans and a uint232 (close enough in size to a uint256 that it works for most things)
    function packBBBU(
        bool b1,
        bool b2,
        bool b3,
        uint232 u1
    ) private pure returns (uint256 packed) {
        // Packing is as follows
        // top 24 are booleans as uint8
        // bottom 232 is the uint232
        packed =
            (boolToUint(b1) << 248) |
            (boolToUint(b2) << 240) |
            (boolToUint(b3) << 232) |
            u1;
    }

    // Unpack the above
    function unpackBBBU(uint256 packed)
        private
        pure
        returns (
            bool b1,
            bool b2,
            bool b3,
            uint232 u1
        )
    {
        b1 = uintToBool(uint8(packed >> 248));
        b2 = uintToBool(uint8(packed >> 240));
        b3 = uintToBool(uint8(packed >> 232));
        u1 = uint232(packed);
    }

    function unpackBBBU64(uint256 packed) private
        pure
        returns (
            bool b1,
            bool b2,
            bool b3,
            uint64 u1
        )
    {
        b1 = uintToBool(uint8(packed >> 248));
        b2 = uintToBool(uint8(packed >> 240));
        b3 = uintToBool(uint8(packed >> 232));
        u1 = uint64(packed);
    }

    function getB1(uint256 packed) private pure returns (bool b1) {
        (b1, , , ) = unpackBBBU(packed);
    }

    function getB2(uint256 packed) private pure returns (bool b2) {
        (, b2, , ) = unpackBBBU(packed);
    }

    function getB3(uint256 packed) private pure returns (bool b3) {
        (, , b3, ) = unpackBBBU(packed);
    }

    function getU1(uint256 packed) private pure returns (uint232 u1) {
        (, , , u1) = unpackBBBU(packed);
    }

    function setB1(bool b1, uint256 packed)
        private
        pure
        returns (uint256 newPacked)
    {
        (, bool b2, bool b3, uint232 u1) = unpackBBBU(packed);
        newPacked = packBBBU(b1, b2, b3, u1);
    }

    function setB2(bool b2, uint256 packed)
        private
        pure
        returns (uint256 newPacked)
    {
        (bool b1, , bool b3, uint232 u1) = unpackBBBU(packed);
        newPacked = packBBBU(b1, b2, b3, u1);
    }

    function setB3(bool b3, uint256 packed)
        private
        pure
        returns (uint256 newPacked)
    {
        (bool b1, bool b2, , uint232 u1) = unpackBBBU(packed);
        newPacked = packBBBU(b1, b2, b3, u1);
    }

    function setU1(uint232 u1, uint256 packed)
        private
        pure
        returns (uint256 newPacked)
    {
        (bool b1, bool b2, bool b3, ) = unpackBBBU(packed);
        newPacked = packBBBU(b1, b2, b3, u1);
    }

    // Found this on a github answer to cast bools to a uint256, should be identical for a uint8
    function boolToUint(bool _b) private pure returns (uint8) {
        uint8 _bInt;
        assembly {
            // SAFETY: Simple bool-to-int cast.
            _bInt := _b
        }
        return _bInt;
    }

    // The reverse
    function uintToBool(uint8 _u) private pure returns (bool) {
        bool _b;
        assembly {
            // SAFETY: Simple int-to-bool cast.
            _b := _u
        }
        return _b;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"theBot","type":"address"}],"name":"addBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addExcludedFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeWallet2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"notbot","type":"address"}],"name":"delBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"proxiedApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"}],"name":"proxiedSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"}],"name":"proxiedSellAndSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Contract","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"proxiedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiedWETHWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeS","type":"uint256"}],"name":"setMaturationTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newAmt","type":"uint32"}],"name":"setTaxGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newAmt","type":"uint32"}],"name":"setTaxGrey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"staticSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"account","type":"address[]"},{"internalType":"uint256[]","name":"value","type":"uint256[]"}],"name":"staticSwapAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"swapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526200001b683635c9adc5dea0000060001962000a54565b620000299060001962000a30565b600b55683635c9adc5dea00000600d556200005e6103e8683635c9adc5dea000006200091d60201b62001dc71790919060201c565b601055683635c9adc5dea00000601155620000936103e8683635c9adc5dea000006200091d60201b62001dc71790919060201c565b601655601b8054610c3560d71b68ffffffff0000ffffff60a81b19909116179055601c805463ffffffff191662055730179055348015620000d357600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600280546001600160a01b031990811673fe48e96195515e357430d1f95a3511cb54f0a7da17909155600380548216737a250d5630b4cf539739df2c5dacb4c659f2488d1790556014805482167312f558f6fcb48550a4ac5388f675cc8ac2b08c321790556015805490911673dc63d3bfb31b32a2ab2b3050993bb4668facca21179055600b5460046000620001a83390565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550620001e3600160008060006200096e60201b60201c565b60076000620001fa6000546001600160a01b031690565b6001600160a01b03166001600160a01b031681526020019081526020016000208190555062000235600160008060006200096e60201b60201c565b306000908152600760209081526040808320939093556014546001600160a01b0390811683528383208390556015541682528282208290557f909125171babacbb48fad5026c6439cfd1fb16d57a259e2826e5cfd84334f4c08290557f86677f7a99e8ac1ae333108c328611da9cda11ce6a0e2680ad76f3d41c3343968290557fc1ece1f03d25a9cd28076134418920fa38cf0a58ca6178c612fbbeafe9cbcd118290557fe7a0caff9435f66c6e6c64f96d7be392f13ee0921dd290df2087066936a66aa68290557f2a9c42f2f4a5343f0f7ee902f4f950f1420bbfbfd700fa2516eb583b47c54e498290557f638fa38f214d5a4f3f004749e111f92e5959e516877a5c9750e9be1b7faa10cf8290557f93fb109bea0da63499d09655dfd24d677e8f42a3ec79b7ddc92e4fc9fe1468288290557fc805895c53cd9db1b4842e2c15c889f94ce23cb254d46c7d48a92cec5ccbd01d8290557f9d06a3625998ac0ebe2744e6397c2de00584e3b71c5af0ba80061688d1a92dc58290557f28c8cb70b5e179bdbdd2592f247edecdfd6f0dd0e15b16e3ba688e5134b312f98290557f64138e6c862a2d9379d1bfda6595258fd505c7da2b764ea9511d3bdc6bbfb1a28290557f3524f0fa7df42b7fe5b2a5a945164b183d20f31472cbfdf5114cedffdefce5858290557f9a496a3bb44f9820b7f9c1d21c1d2cd1d7972ec1aac1ec54a4cf2a4a027aac028290557fbaef9fa153af899c85d14f8bc6070e5386740114c12099fb245b73d099eb22828290557f8c98e6830df5f1069c1d68cf55073be72fd70421d7316806ed6c24c8d99fb06a8290557fb5b901aca7be18c5f1b9ee87676a2f54220c8d4b5bd38d81a660a500a58616fe8290557f5f2545956539114f1170cd7fdadfce5fd9cb72c64123867ce5e6e9acf4dde29b8290557f407f48857bd22bf0217e7a656d09117bb0dbd616b2b3decdc1db1b9e29ee2c138290557f8682de869c6c1bb616bcb7b7463e80fbe4eaed120e990a1a46e373905938d1378290557f2468f5cb4737fbd3d266f32e0fd06bdc2909d5a03c584260822e8fc664170b598290557fb4125eaf10325c31e88e6c284d187e87a2a8b95b135e65c17249e9c4820b59b78290557f381bc036dfe5f97160241cdee3152f8664328240dfed53b53dc05ffbe3f5570d8290557f8d588525f6b1ca76525708ef7479f5c72a8569a7af0ad2b0b6a42ca3451089698290557f21f7253d6527969d88c9cd7eb122f0be59dc7089f815b32a4dce3849c49327af8290557f15b6f30410e708a0d17fcfdd1fdd2507a948edadb98d96f8ffd7c69a7fbc86c48290557fc20c3dd02701b9e47dda057c2e7f6cf6dfb515608123a93183afc251e1f75c638290557fa9d8f3021c4c21ca3408c2f6e62e381a1f355779b66da1442f7ceee6426af5788290557fea853aa69674fe63e748f961661f459a8733bed116c52a98c31a8d5b05c7d85e82905560088054600180820183557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee391820180546001600160a01b031990811673c90e535c1dd20f20407fc3827a885b1324b4d597179091557f74fc85daa165e44cd4a30dd35f785b0742f4aed2286c21da3755fd5b6533bb8c8690558354808301855583018054821673d52ac2ed10a7d8988d857672c1d46845260e2d201790557f109e2e3afca23583139cdd5a9be814586d318f95d01eef0dea556c4335ba984c8690558354808301855583018054821673d1d9d3261932069d7872862ccd61ede394c902a71790557f61a2c7abcea306f970cd9fd33525f3864ac313f51b653f2fa493815505259741869055835480830185558301805482167366b2477f33ade59e39ed3755ae5ff5f1e847269a1790557f0f46858079d391374d6081f10a73ce445f59d31c8929105c0c1e10d48cfcebc586905583548083018555830180548216734d80e2cac3b08590a2bdf92aa5ff9da61edbfe471790557fe2fc992aca63fc339bcfd702755caa0f9f2f438d9226d4979d83d81ba61a94538690558354808301855583018054821673a3aaad1a66c40af1a9f3f44a0f58e906c544424f1790557ffd302abf0ed1df557b88e3f6da26d30d6964afda038bfb6e682727af5a85457f8690558354808301855583018054821673570c4fbd3b3b56f40d4e83e47890133a62497a2b1790557f9e5bd26213b90a280d256e63dd5eac5131f2e11b55275f77ca5fbb0f6305cf788690558354918201909355018054909116736ec81b2f9fdbcaa984f1c058c9283d275e20f37090811790915582527f7de79cdb19d4ac3bae47a40d06951f9e929968f3bb92dbb872f18fb88efd1e128290559151683635c9adc5dea00000815233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a362000a81565b60006200096783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200097e60201b60201c565b9392505050565b6001600160e81b03169392505050565b60008183620009ab5760405162461bcd60e51b8152600401620009a29190620009c3565b60405180910390fd5b506000620009ba848662000a19565b95945050505050565b6000602080835283518082850152825b81811015620009f157858101830151858201604001528201620009d3565b8181111562000a035783604083870101525b50601f01601f1916929092016040019392505050565b60008262000a2b5762000a2b62000a6b565b500490565b60008282101562000a4f57634e487b7160e01b81526011600452602481fd5b500390565b60008262000a665762000a6662000a6b565b500690565b634e487b7160e01b600052601260045260246000fd5b6142dd8062000a916000396000f3fe6080604052600436106102535760003560e01c80637a52da0e11610138578063c1fb747b116100b0578063debc45c51161007f578063ec28438a11610064578063ec28438a146106fe578063f42938901461071e578063ffecf5161461073357600080fd5b8063debc45c5146106be578063e98391ff146106de57600080fd5b8063c1fb747b14610623578063c9567bf914610643578063d42953b514610658578063dd62ed3e1461067857600080fd5b80638da5cb5b11610107578063a9059cbb116100ec578063a9059cbb146105c3578063afcba06c146105e3578063b70143c91461060357600080fd5b80638da5cb5b1461055557806395d89b411461057d57600080fd5b80637a52da0e146104e0578063859843881461050057806388a65f461461052057806388f820201461053557600080fd5b8063313ce567116101cb5780635342acb41161019a5780635932ead11161017f5780635932ead11461048b57806370a08231146104ab578063715018a6146104cb57600080fd5b80635342acb41461044b578063571cbe0a1461046b57600080fd5b8063313ce567146103cf57806333a17282146103eb578063351547351461040b578063473071ce1461042b57600080fd5b806319db2dcb11610222578063273123b711610207578063273123b71461036f57806327a14fc21461038f5780632d838119146103af57600080fd5b806319db2dcb1461032f57806323b872dd1461034f57600080fd5b806306fdde031461025f578063095ea7b3146102b757806314b3b077146102e757806318160ddd1461030957600080fd5b3661025a57005b600080fd5b34801561026b57600080fd5b5060408051808201909152600b81527f486f6c64656e6f6d69637300000000000000000000000000000000000000000060208201525b6040516102ae91906140dc565b60405180910390f35b3480156102c357600080fd5b506102d76102d2366004613f8f565b610753565b60405190151581526020016102ae565b3480156102f357600080fd5b50610307610302366004613edf565b61076a565b005b34801561031557600080fd5b50683635c9adc5dea000005b6040519081526020016102ae565b34801561033b57600080fd5b5061030761034a366004613edf565b610803565b34801561035b57600080fd5b506102d761036a366004613f4f565b610897565b34801561037b57600080fd5b5061030761038a366004613edf565b610900565b34801561039b57600080fd5b506103076103aa36600461405b565b610999565b3480156103bb57600080fd5b506103216103ca36600461405b565b610a07565b3480156103db57600080fd5b50604051600981526020016102ae565b3480156103f757600080fd5b506102d7610406366004613f4f565b610a9e565b34801561041757600080fd5b50610307610426366004613f8f565b610bc9565b34801561043757600080fd5b50610307610446366004613edf565b610c32565b34801561045757600080fd5b506102d7610466366004613edf565b610cbe565b34801561047757600080fd5b506102d7610486366004613f4f565b610cdf565b34801561049757600080fd5b506103076104a6366004614023565b610db3565b3480156104b757600080fd5b506103216104c6366004613edf565b610e5a565b3480156104d757600080fd5b50610307610e65565b3480156104ec57600080fd5b506103076104fb366004613edf565b610f21565b34801561050c57600080fd5b5061030761051b3660046140b8565b610fd5565b34801561052c57600080fd5b50610307611066565b34801561054157600080fd5b506102d7610550366004613edf565b61128c565b34801561056157600080fd5b506000546040516001600160a01b0390911681526020016102ae565b34801561058957600080fd5b5060408051808201909152601d81527fca9ce1b48fca9fe1b485e1b487c9b4e1b48fe1b48dc9aae1b484ea9cb100000060208201526102a1565b3480156105cf57600080fd5b506102d76105de366004613f8f565b6112ad565b3480156105ef57600080fd5b506103076105fe36600461405b565b6112ba565b34801561060f57600080fd5b5061030761061e36600461405b565b61134f565b34801561062f57600080fd5b5061030761063e366004613fba565b6113f5565b34801561064f57600080fd5b50610307611527565b34801561066457600080fd5b506103076106733660046140b8565b611a54565b34801561068457600080fd5b50610321610693366004613f17565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156106ca57600080fd5b506103076106d9366004613edf565b611b03565b3480156106ea57600080fd5b506103076106f9366004614023565b611bd8565b34801561070a57600080fd5b5061030761071936600461405b565b611c7d565b34801561072a57600080fd5b50610307611ceb565b34801561073f57600080fd5b5061030761074e366004613edf565b611d48565b6000610760338484611e09565b5060015b92915050565b6000546001600160a01b031633146107c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b601480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461085d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006108a4848484611f61565b6108f684336108f185604051806060016040528060288152602001614280602891396001600160a01b038a16600090815260066020908152604080832033845290915290205491906128e6565b611e09565b5060019392505050565b6000546001600160a01b0316331461095a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b6001600160a01b03811660009081526007602052604081205461097d9190612917565b6001600160a01b03909116600090815260076020526040902055565b6000546001600160a01b031633146109f35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b610a0181633b9aca006141f5565b60115550565b6000600b54821115610a815760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e730000000000000000000000000000000000000000000060648201526084016107c0565b6000610a8b61294f565b9050610a978382611dc7565b9392505050565b6002546000906001600160a01b03163314610b215760405162461bcd60e51b815260206004820152602f60248201527f50726f787945524332303a2063616c6c6572206973206e6f742074686520455260448201527f43323020636f6e74726f6c6c65722e000000000000000000000000000000000060648201526084016107c0565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044015b602060405180830381600087803b158015610b8857600080fd5b505af1158015610b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc0919061403f565b95945050505050565b6000546001600160a01b03163314610c235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b610c2e338383612972565b5050565b6002546001600160a01b03163314610cb25760405162461bcd60e51b815260206004820152602f60248201527f50726f787945524332303a2063616c6c6572206973206e6f742074686520455260448201527f43323020636f6e74726f6c6c65722e000000000000000000000000000000000060648201526084016107c0565b610cbb81612a75565b50565b6001600160a01b03811660009081526007602052604081205460f81c610764565b6002546000906001600160a01b03163314610d625760405162461bcd60e51b815260206004820152602f60248201527f50726f787945524332303a2063616c6c6572206973206e6f742074686520455260448201527f43323020636f6e74726f6c6c65722e000000000000000000000000000000000060648201526084016107c0565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063a9059cbb90604401610b6e565b6000546001600160a01b03163314610e0d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601b805491151577010000000000000000000000000000000000000000000000027fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b600061076482612d4f565b6000546001600160a01b03163314610ebf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6002546001600160a01b03163314610fa15760405162461bcd60e51b815260206004820152602f60248201527f50726f787945524332303a2063616c6c6572206973206e6f742074686520455260448201527f43323020636f6e74726f6c6c65722e000000000000000000000000000000000060648201526084016107c0565b47610fab82612a75565b6000610fb74783612d94565b600254909150610fd0906001600160a01b031682612dd6565b505050565b6000546001600160a01b0316331461102f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b6002546001600160a01b031633146110e65760405162461bcd60e51b815260206004820152602f60248201527f50726f787945524332303a2063616c6c6572206973206e6f742074686520455260448201527f43323020636f6e74726f6c6c65722e000000000000000000000000000000000060648201526084016107c0565b600354604080517fad5c464800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b15801561114457600080fd5b505afa158015611158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117c9190613efb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b1580156111da57600080fd5b505afa1580156111ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112129190614073565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b03831690632e1a7d4d90602401600060405180830381600087803b15801561127057600080fd5b505af1158015611284573d6000803e3d6000fd5b505050505050565b6001600160a01b03811660009081526007602052604081205460e81c610764565b6000610760338484611f61565b6000546001600160a01b031633146113145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601d80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6014546001600160a01b0316336001600160a01b0316148061138457506015546001600160a01b0316336001600160a01b0316145b8061139957506000546001600160a01b031633145b6113a257600080fd5b60006113b7683635c9adc5dea0000083611dc7565b6113c030612eef565b11156113e0576113d9683635c9adc5dea0000083611dc7565b90506113ec565b6113e930612eef565b90505b610c2e81612f4e565b6000546001600160a01b0316331461144f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b82811461149e5760405162461bcd60e51b815260206004820152601460248201527f4c656e6774687320646f6e2774206d617463682e00000000000000000000000060448201526064016107c0565b60005b838110156115205761150e338686848181106114cd57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114e29190613edf565b85858581811061150257634e487b7160e01b600052603260045260246000fd5b90506020020135612972565b806115188161422b565b9150506114a1565b5050505050565b6000546001600160a01b031633146115815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601b5474010000000000000000000000000000000000000000900460ff16156115ec5760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e00000000000000000060448201526064016107c0565b601a80547fffffffffffffffffffffffff000000000000000000000000000000000000000016737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556116413082683635c9adc5dea00000611e09565b806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561167a57600080fd5b505afa15801561168e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b29190613efb565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156116fa57600080fd5b505afa15801561170e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117329190613efb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561179257600080fd5b505af11580156117a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ca9190613efb565b601b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316179055601a541663f305d719473061181281610e5a565b6000806118276000546001600160a01b031690565b60405160e088901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b1580156118a257600080fd5b505af11580156118b6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118db919061408b565b5050601b8054770101000000000000000000000000000000000000000000007fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff90911617905550601d80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001662278d00179055683635c9adc5dea00000600d8190556119699060c8611dc7565b601155601b8054740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82161790915543600e5542600f55601a546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600019602482015291169063095ea7b390604401602060405180830381600087803b158015611a1c57600080fd5b505af1158015611a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2e919061403f565b6000546001600160a01b03163314611aae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601b805463ffffffff9092167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b03163314611b5d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b6008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915560009081526007602052604090205461097d919061316d565b6000546001600160a01b03163314611c325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601b80549115157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b03163314611cd75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b611ce581633b9aca006141f5565b600d5550565b6014546001600160a01b0316336001600160a01b03161480611d2057506015546001600160a01b0316336001600160a01b0316145b80611d3557506000546001600160a01b031633145b611d3e57600080fd5b47610cbb8161319f565b6000546001600160a01b03163314611da25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b6001600160a01b03811660009081526007602052604090205461097d90600190612917565b6000610a9783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131ed565b6001600160a01b038316611e845760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107c0565b6001600160a01b038216611f005760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016107c0565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611fdd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016107c0565b6001600160a01b0382166120595760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016107c0565b600081116120cf5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f000000000000000000000000000000000000000000000060648201526084016107c0565b600060128190556013819055601b80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff1690556001600160a01b0383811682526007602052604080832054601c80547fffffffffffffffffffffffffffff0000000000000000ff00ffffffffffffffff166a010000000000000000000067ffffffffffffffff808516919091027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16919091176801000000000000000060e885811c151591909102919091177fffffffffffffffffffffffffffffffffffffffffffffffffff00ff00ffffffff16660100000000000060f086811c1515919091027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff169190911764010000000060f896871c151502178085558b8816808a52968920549586901c151565010000000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff9287901c151567010000000000000002929092167fffffffffffffffffffffffffffffffffffffffffffffffff00ff00ffffffffff9387901c15156901000000000000000000027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff97909516720100000000000000000000000000000000000002969096167fffffffffffff0000000000000000ffffffffffffffff00ffffffffffffffffff909116179290921716929092179190911790559154161480159061231a57506000546001600160a01b03838116911614155b801561232f57506001600160a01b0383163014155b80156123465750601c54640100000000900460ff16155b801561235e5750601c5465010000000000900460ff16155b156128d057601c546601000000000000900460ff1615801561238e5750601c54670100000000000000900460ff16155b6123da5760405162461bcd60e51b815260206004820152600860248201527f4e6f20626f74732e00000000000000000000000000000000000000000000000060448201526064016107c0565b601b80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff167901000000000000000000000000000000000000000000000000001790556001600160a01b038316600090815260196020526040812080548392906124469084906141bd565b9091555050601b546001600160a01b0384811691161480156124765750601a546001600160a01b03838116911614155b1561267e57601b5477010000000000000000000000000000000000000000000000900460ff161561250c57601c5467ffffffffffffffff6a01000000000000000000009091041643141561250c5760405162461bcd60e51b815260206004820152601160248201527f4f6e652074782070657220626c6f636b2e00000000000000000000000000000060448201526064016107c0565b6001600160a01b03821660009081526007602052604090205461253090439061321b565b6001600160a01b038316600090815260076020526040902055600e544390612559906002613251565b11156125b2576127106012556000601355601b80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000001790556128db565b600e5443906125c290600a613251565b1180156125d257506125d26132b0565b1561262a576127106012556000601355601b80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000001790556128db565b61263482826132c4565b601b80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff167901000000000000000000000000000000000000000000000000001790555b6128db565b601b546001600160a01b0383811691161480156126a95750601a546001600160a01b03848116911614155b1561267957601b80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff169081905577010000000000000000000000000000000000000000000000900460ff161561276e57601c5467ffffffffffffffff72010000000000000000000000000000000000009091041643141561276e5760405162461bcd60e51b815260206004820152601160248201527f4f6e652074782070657220626c6f636b2e00000000000000000000000000000060448201526064016107c0565b6001600160a01b03831660009081526007602052604090205461279c9067ffffffffffffffff43169061321b565b6001600160a01b038416600090815260076020526040902055600d548111156128075760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e0000000060448201526064016107c0565b6000612813848361337b565b9050612820816005611dc7565b60125561282e81600a611dc7565b601355600061283c30612eef565b601054601b5491925082101590760100000000000000000000000000000000000000000000900460ff16801561286f5750805b80156128975750601b547501000000000000000000000000000000000000000000900460ff16155b80156128a657506128a661352a565b156128c8576128b6601654612f4e565b4780156128c6576128c64761319f565b505b5050506128db565b600060128190556013555b610fd0838383612972565b6000818484111561290a5760405162461bcd60e51b81526004016107c091906140dc565b506000610bc08486614214565b600060f882901c60e883901c837cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81165b9695505050505050565b600080600061295c61355c565b909250905061296b8282611dc7565b9250505090565b601c5468010000000000000000900460ff1680156129a05750601c546901000000000000000000900460ff16155b156129b057610fd0838383613730565b601c5468010000000000000000900460ff161580156129de5750601c546901000000000000000000900460ff165b156129ee57610fd083838361388f565b601c5468010000000000000000900460ff16158015612a1d5750601c546901000000000000000000900460ff16155b15612a2d57610fd083838361397c565b601c5468010000000000000000900460ff168015612a5a5750601c546901000000000000000000900460ff165b15612a6a57610fd08383836139f9565b610fd083838361397c565b604080516002808252606082018352839260009291906020830190803683370190505090508281600081518110612abc57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600354604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015612b2957600080fd5b505afa158015612b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b619190613efb565b81600181518110612b8257634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918416906370a082319060240160206040518083038186803b158015612beb57600080fd5b505afa158015612bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c239190614073565b6003546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810183905291925084169063095ea7b390604401602060405180830381600087803b158015612c8c57600080fd5b505af1158015612ca0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc4919061403f565b506003546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790612d1790849060009087903090429060040161414d565b600060405180830381600087803b158015612d3157600080fd5b505af1158015612d45573d6000803e3d6000fd5b5050505050505050565b6001600160a01b038116600090815260096020526040812054431415612d8b57506001600160a01b03166000908152600a602052604090205490565b61076482612eef565b6000610a9783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128e6565b80471015612e265760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016107c0565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612e73576040519150601f19603f3d011682016040523d82523d6000602084013e612e78565b606091505b5050905080610fd05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016107c0565b6001600160a01b03811660009081526007602052604081205460e81c15612f2c57506001600160a01b031660009081526005602052604090205490565b6001600160a01b03821660009081526004602052604090205461076490610a07565b601b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790556040805160028082526060820183526000926020830190803683370190505090503081600081518110612fd157634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601a54604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b15801561303e57600080fd5b505afa158015613052573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130769190613efb565b8160018151811061309757634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601a546130bd9130911684611e09565b601a546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac9479061310f90859060009086903090429060040161414d565b600060405180830381600087803b15801561312957600080fd5b505af115801561313d573d6000803e3d6000fd5b5050601b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550505050565b600060f882901c60f083901c837cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116612945565b601480546131cd916001600160a01b03909116906131c8906131c2856011613aa5565b90611dc7565b612dd6565b601554610cbb906001600160a01b03166131c860146131c2856003613aa5565b6000818361320e5760405162461bcd60e51b81526004016107c091906140dc565b506000610bc084866141d5565b600060f882901c60f083901c60e884901c7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616612945565b60008061325e83856141bd565b905083811015610a975760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016107c0565b601c5460009063ffffffff165a1015905090565b600d548111156133165760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e0000000060448201526064016107c0565b6011548161332384612eef565b61332d91906141bd565b1115610c2e5760405162461bcd60e51b815260206004820152601760248201527f4f766572206d61782077616c6c657420616d6f756e742e00000000000000000060448201526064016107c0565b6001600160a01b038216600090815260076020526040812054819060e81c815b6001600160a01b0386166000908152601760205260409020548110156134af576001600160a01b03861660009081526017602052604081208054839081106133f357634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050600060186000896001600160a01b03166001600160a01b03168152602001908152602001600020838154811061344657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050428262278d0061346391906141bd565b10156134935783156134805761347981866141bd565b945061349a565b61348981610a07565b61347990866141bd565b50506134af565b505080806134a79061422b565b91505061339b565b506001600160a01b0385166000908152601960205260409020548211156134d95760009250613522565b6001600160a01b0385166000908152601960205260408120546134fc9084612d94565b905061350e856131c283612710613aa5565b93506127108411156135205761271093505b505b505092915050565b601b546000907a010000000000000000000000000000000000000000000000000000900463ffffffff165a1015905090565b600b546000908190683635c9adc5dea00000825b6008548110156136f3578260046000600884815481106135a057634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061361957508160056000600884815481106135f257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613635575050600b5493683635c9adc5dea000009350915050565b613689600460006008848154811061365d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612d94565b92506136df60056000600884815481106136b357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612d94565b9150806136eb8161422b565b915050613570565b50600b5461370a90683635c9adc5dea00000611dc7565b821015613727575050600b5492683635c9adc5dea0000092509050565b90939092509050565b601b547801000000000000000000000000000000000000000000000000900460ff161561376257610fd0838383613b40565b60008060008060008061377487613c5e565b95509550955095509550955061378a8886613cad565b6001600160a01b0389166000908152600560205260409020546137ad9088612d94565b6001600160a01b038a166000908152600560209081526040808320939093556004905220546137dc9087612d94565b6001600160a01b03808b1660009081526004602052604080822093909355908a168152205461380b9086613251565b6001600160a01b03891660009081526004602052604090205561382d81613d1d565b6138378483613da5565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161387c91815260200190565b60405180910390a3505050505050505050565b601b547801000000000000000000000000000000000000000000000000900460ff16156138c157610fd0838383613b40565b6138cc838383613b40565b6000806000806000806138de87613c5e565b9550955095509550955095506138f48884613cad565b6001600160a01b0389166000908152600460205260409020546139179087612d94565b6001600160a01b03808b16600090815260046020908152604080832094909455918b1681526005909152205461394d9084613251565b6001600160a01b03891660009081526005602090815260408083209390935560049052205461380b9086613251565b601b547801000000000000000000000000000000000000000000000000900460ff16156139ae57610fd0838383613b40565b6000806000806000806139c087613c5e565b9550955095509550955095506139d68886613cad565b6001600160a01b0389166000908152600460205260409020546137dc9087612d94565b601b547801000000000000000000000000000000000000000000000000900460ff1615613a2b57610fd0838383613b40565b600080600080600080613a3d87613c5e565b955095509550955095509550613a538886613cad565b6001600160a01b038916600090815260056020526040902054613a769088612d94565b6001600160a01b038a166000908152600560209081526040808320939093556004905220546139179087612d94565b600082613ab457506000610764565b6000613ac083856141f5565b905082613acd85836141d5565b14610a975760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016107c0565b6001816000613b4f8284612d94565b6001600160a01b03861660009081526009602090815260408083204390556004909152902054909150613b829085613251565b6001600160a01b038087166000908152600a6020908152604080832094909455918916815260049091522054613bb89083612d94565b6001600160a01b038088166000908152600460205260408082209390935590871681522054613be79084613251565b6001600160a01b038616600090815260046020526040902055613c0981613d1d565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613c4e91815260200190565b60405180910390a3505050505050565b6000806000806000806000806000613c758a613dc9565b9250925092506000806000613c938d8686613c8e61294f565b613e0b565b919f909e50909c50959a5093985091965092945050505050565b601b54790100000000000000000000000000000000000000000000000000900460ff1615610c2e576001600160a01b039190911660008181526017602090815260408083208054600180820183559185528385204291015593835260188252822080549384018155825290200155565b6000613d2761294f565b90506000613d358383613aa5565b30600090815260046020526040902054909150613d529082613251565b3060009081526004602090815260408083209390935560079052205460e81c15610fd05730600090815260056020526040902054613d909084613251565b30600090815260056020526040902055505050565b600b54613db29083612d94565b600b55600c54613dc29082613251565b600c555050565b600080600080613dd885613e5b565b90506000613de586613e78565b90506000613dfd82613df78986612d94565b90612d94565b979296509094509092505050565b6000808080613e1a8886613aa5565b90506000613e288887613aa5565b90506000613e368888613aa5565b90506000613e4882613df78686612d94565b939b939a50919850919650505050505050565b60006107646127106131c260135485613aa590919063ffffffff16565b60006107646127106131c260125485613aa590919063ffffffff16565b60008083601f840112613ea6578182fd5b50813567ffffffffffffffff811115613ebd578182fd5b6020830191508360208260051b8501011115613ed857600080fd5b9250929050565b600060208284031215613ef0578081fd5b8135610a978161425c565b600060208284031215613f0c578081fd5b8151610a978161425c565b60008060408385031215613f29578081fd5b8235613f348161425c565b91506020830135613f448161425c565b809150509250929050565b600080600060608486031215613f63578081fd5b8335613f6e8161425c565b92506020840135613f7e8161425c565b929592945050506040919091013590565b60008060408385031215613fa1578182fd5b8235613fac8161425c565b946020939093013593505050565b60008060008060408587031215613fcf578081fd5b843567ffffffffffffffff80821115613fe6578283fd5b613ff288838901613e95565b9096509450602087013591508082111561400a578283fd5b5061401787828801613e95565b95989497509550505050565b600060208284031215614034578081fd5b8135610a9781614271565b600060208284031215614050578081fd5b8151610a9781614271565b60006020828403121561406c578081fd5b5035919050565b600060208284031215614084578081fd5b5051919050565b60008060006060848603121561409f578283fd5b8351925060208401519150604084015190509250925092565b6000602082840312156140c9578081fd5b813563ffffffff81168114610a97578182fd5b6000602080835283518082850152825b81811015614108578581018301518582016040015282016140ec565b818111156141195783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561419c5784516001600160a01b031683529383019391830191600101614177565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156141d0576141d0614246565b500190565b6000826141f057634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561420f5761420f614246565b500290565b60008282101561422657614226614246565b500390565b600060001982141561423f5761423f614246565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610cbb57600080fd5b8015158114610cbb57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220e1bbaa5138b85395b8c4eb02f41ce2c7f63f6b73da2939684233313017d9bb2d64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102535760003560e01c80637a52da0e11610138578063c1fb747b116100b0578063debc45c51161007f578063ec28438a11610064578063ec28438a146106fe578063f42938901461071e578063ffecf5161461073357600080fd5b8063debc45c5146106be578063e98391ff146106de57600080fd5b8063c1fb747b14610623578063c9567bf914610643578063d42953b514610658578063dd62ed3e1461067857600080fd5b80638da5cb5b11610107578063a9059cbb116100ec578063a9059cbb146105c3578063afcba06c146105e3578063b70143c91461060357600080fd5b80638da5cb5b1461055557806395d89b411461057d57600080fd5b80637a52da0e146104e0578063859843881461050057806388a65f461461052057806388f820201461053557600080fd5b8063313ce567116101cb5780635342acb41161019a5780635932ead11161017f5780635932ead11461048b57806370a08231146104ab578063715018a6146104cb57600080fd5b80635342acb41461044b578063571cbe0a1461046b57600080fd5b8063313ce567146103cf57806333a17282146103eb578063351547351461040b578063473071ce1461042b57600080fd5b806319db2dcb11610222578063273123b711610207578063273123b71461036f57806327a14fc21461038f5780632d838119146103af57600080fd5b806319db2dcb1461032f57806323b872dd1461034f57600080fd5b806306fdde031461025f578063095ea7b3146102b757806314b3b077146102e757806318160ddd1461030957600080fd5b3661025a57005b600080fd5b34801561026b57600080fd5b5060408051808201909152600b81527f486f6c64656e6f6d69637300000000000000000000000000000000000000000060208201525b6040516102ae91906140dc565b60405180910390f35b3480156102c357600080fd5b506102d76102d2366004613f8f565b610753565b60405190151581526020016102ae565b3480156102f357600080fd5b50610307610302366004613edf565b61076a565b005b34801561031557600080fd5b50683635c9adc5dea000005b6040519081526020016102ae565b34801561033b57600080fd5b5061030761034a366004613edf565b610803565b34801561035b57600080fd5b506102d761036a366004613f4f565b610897565b34801561037b57600080fd5b5061030761038a366004613edf565b610900565b34801561039b57600080fd5b506103076103aa36600461405b565b610999565b3480156103bb57600080fd5b506103216103ca36600461405b565b610a07565b3480156103db57600080fd5b50604051600981526020016102ae565b3480156103f757600080fd5b506102d7610406366004613f4f565b610a9e565b34801561041757600080fd5b50610307610426366004613f8f565b610bc9565b34801561043757600080fd5b50610307610446366004613edf565b610c32565b34801561045757600080fd5b506102d7610466366004613edf565b610cbe565b34801561047757600080fd5b506102d7610486366004613f4f565b610cdf565b34801561049757600080fd5b506103076104a6366004614023565b610db3565b3480156104b757600080fd5b506103216104c6366004613edf565b610e5a565b3480156104d757600080fd5b50610307610e65565b3480156104ec57600080fd5b506103076104fb366004613edf565b610f21565b34801561050c57600080fd5b5061030761051b3660046140b8565b610fd5565b34801561052c57600080fd5b50610307611066565b34801561054157600080fd5b506102d7610550366004613edf565b61128c565b34801561056157600080fd5b506000546040516001600160a01b0390911681526020016102ae565b34801561058957600080fd5b5060408051808201909152601d81527fca9ce1b48fca9fe1b485e1b487c9b4e1b48fe1b48dc9aae1b484ea9cb100000060208201526102a1565b3480156105cf57600080fd5b506102d76105de366004613f8f565b6112ad565b3480156105ef57600080fd5b506103076105fe36600461405b565b6112ba565b34801561060f57600080fd5b5061030761061e36600461405b565b61134f565b34801561062f57600080fd5b5061030761063e366004613fba565b6113f5565b34801561064f57600080fd5b50610307611527565b34801561066457600080fd5b506103076106733660046140b8565b611a54565b34801561068457600080fd5b50610321610693366004613f17565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156106ca57600080fd5b506103076106d9366004613edf565b611b03565b3480156106ea57600080fd5b506103076106f9366004614023565b611bd8565b34801561070a57600080fd5b5061030761071936600461405b565b611c7d565b34801561072a57600080fd5b50610307611ceb565b34801561073f57600080fd5b5061030761074e366004613edf565b611d48565b6000610760338484611e09565b5060015b92915050565b6000546001600160a01b031633146107c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b601480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461085d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006108a4848484611f61565b6108f684336108f185604051806060016040528060288152602001614280602891396001600160a01b038a16600090815260066020908152604080832033845290915290205491906128e6565b611e09565b5060019392505050565b6000546001600160a01b0316331461095a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b6001600160a01b03811660009081526007602052604081205461097d9190612917565b6001600160a01b03909116600090815260076020526040902055565b6000546001600160a01b031633146109f35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b610a0181633b9aca006141f5565b60115550565b6000600b54821115610a815760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e730000000000000000000000000000000000000000000060648201526084016107c0565b6000610a8b61294f565b9050610a978382611dc7565b9392505050565b6002546000906001600160a01b03163314610b215760405162461bcd60e51b815260206004820152602f60248201527f50726f787945524332303a2063616c6c6572206973206e6f742074686520455260448201527f43323020636f6e74726f6c6c65722e000000000000000000000000000000000060648201526084016107c0565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063095ea7b3906044015b602060405180830381600087803b158015610b8857600080fd5b505af1158015610b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc0919061403f565b95945050505050565b6000546001600160a01b03163314610c235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b610c2e338383612972565b5050565b6002546001600160a01b03163314610cb25760405162461bcd60e51b815260206004820152602f60248201527f50726f787945524332303a2063616c6c6572206973206e6f742074686520455260448201527f43323020636f6e74726f6c6c65722e000000000000000000000000000000000060648201526084016107c0565b610cbb81612a75565b50565b6001600160a01b03811660009081526007602052604081205460f81c610764565b6002546000906001600160a01b03163314610d625760405162461bcd60e51b815260206004820152602f60248201527f50726f787945524332303a2063616c6c6572206973206e6f742074686520455260448201527f43323020636f6e74726f6c6c65722e000000000000000000000000000000000060648201526084016107c0565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905285919082169063a9059cbb90604401610b6e565b6000546001600160a01b03163314610e0d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601b805491151577010000000000000000000000000000000000000000000000027fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b600061076482612d4f565b6000546001600160a01b03163314610ebf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6002546001600160a01b03163314610fa15760405162461bcd60e51b815260206004820152602f60248201527f50726f787945524332303a2063616c6c6572206973206e6f742074686520455260448201527f43323020636f6e74726f6c6c65722e000000000000000000000000000000000060648201526084016107c0565b47610fab82612a75565b6000610fb74783612d94565b600254909150610fd0906001600160a01b031682612dd6565b505050565b6000546001600160a01b0316331461102f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b6002546001600160a01b031633146110e65760405162461bcd60e51b815260206004820152602f60248201527f50726f787945524332303a2063616c6c6572206973206e6f742074686520455260448201527f43323020636f6e74726f6c6c65722e000000000000000000000000000000000060648201526084016107c0565b600354604080517fad5c464800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b15801561114457600080fd5b505afa158015611158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117c9190613efb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b1580156111da57600080fd5b505afa1580156111ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112129190614073565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091506001600160a01b03831690632e1a7d4d90602401600060405180830381600087803b15801561127057600080fd5b505af1158015611284573d6000803e3d6000fd5b505050505050565b6001600160a01b03811660009081526007602052604081205460e81c610764565b6000610760338484611f61565b6000546001600160a01b031633146113145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601d80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6014546001600160a01b0316336001600160a01b0316148061138457506015546001600160a01b0316336001600160a01b0316145b8061139957506000546001600160a01b031633145b6113a257600080fd5b60006113b7683635c9adc5dea0000083611dc7565b6113c030612eef565b11156113e0576113d9683635c9adc5dea0000083611dc7565b90506113ec565b6113e930612eef565b90505b610c2e81612f4e565b6000546001600160a01b0316331461144f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b82811461149e5760405162461bcd60e51b815260206004820152601460248201527f4c656e6774687320646f6e2774206d617463682e00000000000000000000000060448201526064016107c0565b60005b838110156115205761150e338686848181106114cd57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114e29190613edf565b85858581811061150257634e487b7160e01b600052603260045260246000fd5b90506020020135612972565b806115188161422b565b9150506114a1565b5050505050565b6000546001600160a01b031633146115815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601b5474010000000000000000000000000000000000000000900460ff16156115ec5760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e00000000000000000060448201526064016107c0565b601a80547fffffffffffffffffffffffff000000000000000000000000000000000000000016737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556116413082683635c9adc5dea00000611e09565b806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561167a57600080fd5b505afa15801561168e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b29190613efb565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156116fa57600080fd5b505afa15801561170e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117329190613efb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561179257600080fd5b505af11580156117a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ca9190613efb565b601b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03928316179055601a541663f305d719473061181281610e5a565b6000806118276000546001600160a01b031690565b60405160e088901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b1580156118a257600080fd5b505af11580156118b6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118db919061408b565b5050601b8054770101000000000000000000000000000000000000000000007fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff90911617905550601d80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001662278d00179055683635c9adc5dea00000600d8190556119699060c8611dc7565b601155601b8054740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82161790915543600e5542600f55601a546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152600019602482015291169063095ea7b390604401602060405180830381600087803b158015611a1c57600080fd5b505af1158015611a30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2e919061403f565b6000546001600160a01b03163314611aae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601b805463ffffffff9092167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b03163314611b5d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b6008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03841690811790915560009081526007602052604090205461097d919061316d565b6000546001600160a01b03163314611c325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b601b80549115157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000546001600160a01b03163314611cd75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b611ce581633b9aca006141f5565b600d5550565b6014546001600160a01b0316336001600160a01b03161480611d2057506015546001600160a01b0316336001600160a01b0316145b80611d3557506000546001600160a01b031633145b611d3e57600080fd5b47610cbb8161319f565b6000546001600160a01b03163314611da25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c0565b6001600160a01b03811660009081526007602052604090205461097d90600190612917565b6000610a9783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131ed565b6001600160a01b038316611e845760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107c0565b6001600160a01b038216611f005760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016107c0565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611fdd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016107c0565b6001600160a01b0382166120595760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016107c0565b600081116120cf5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f000000000000000000000000000000000000000000000060648201526084016107c0565b600060128190556013819055601b80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff1690556001600160a01b0383811682526007602052604080832054601c80547fffffffffffffffffffffffffffff0000000000000000ff00ffffffffffffffff166a010000000000000000000067ffffffffffffffff808516919091027fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16919091176801000000000000000060e885811c151591909102919091177fffffffffffffffffffffffffffffffffffffffffffffffffff00ff00ffffffff16660100000000000060f086811c1515919091027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff169190911764010000000060f896871c151502178085558b8816808a52968920549586901c151565010000000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff9287901c151567010000000000000002929092167fffffffffffffffffffffffffffffffffffffffffffffffff00ff00ffffffffff9387901c15156901000000000000000000027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff97909516720100000000000000000000000000000000000002969096167fffffffffffff0000000000000000ffffffffffffffff00ffffffffffffffffff909116179290921716929092179190911790559154161480159061231a57506000546001600160a01b03838116911614155b801561232f57506001600160a01b0383163014155b80156123465750601c54640100000000900460ff16155b801561235e5750601c5465010000000000900460ff16155b156128d057601c546601000000000000900460ff1615801561238e5750601c54670100000000000000900460ff16155b6123da5760405162461bcd60e51b815260206004820152600860248201527f4e6f20626f74732e00000000000000000000000000000000000000000000000060448201526064016107c0565b601b80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff167901000000000000000000000000000000000000000000000000001790556001600160a01b038316600090815260196020526040812080548392906124469084906141bd565b9091555050601b546001600160a01b0384811691161480156124765750601a546001600160a01b03838116911614155b1561267e57601b5477010000000000000000000000000000000000000000000000900460ff161561250c57601c5467ffffffffffffffff6a01000000000000000000009091041643141561250c5760405162461bcd60e51b815260206004820152601160248201527f4f6e652074782070657220626c6f636b2e00000000000000000000000000000060448201526064016107c0565b6001600160a01b03821660009081526007602052604090205461253090439061321b565b6001600160a01b038316600090815260076020526040902055600e544390612559906002613251565b11156125b2576127106012556000601355601b80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000001790556128db565b600e5443906125c290600a613251565b1180156125d257506125d26132b0565b1561262a576127106012556000601355601b80547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000001790556128db565b61263482826132c4565b601b80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff167901000000000000000000000000000000000000000000000000001790555b6128db565b601b546001600160a01b0383811691161480156126a95750601a546001600160a01b03848116911614155b1561267957601b80547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff169081905577010000000000000000000000000000000000000000000000900460ff161561276e57601c5467ffffffffffffffff72010000000000000000000000000000000000009091041643141561276e5760405162461bcd60e51b815260206004820152601160248201527f4f6e652074782070657220626c6f636b2e00000000000000000000000000000060448201526064016107c0565b6001600160a01b03831660009081526007602052604090205461279c9067ffffffffffffffff43169061321b565b6001600160a01b038416600090815260076020526040902055600d548111156128075760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e0000000060448201526064016107c0565b6000612813848361337b565b9050612820816005611dc7565b60125561282e81600a611dc7565b601355600061283c30612eef565b601054601b5491925082101590760100000000000000000000000000000000000000000000900460ff16801561286f5750805b80156128975750601b547501000000000000000000000000000000000000000000900460ff16155b80156128a657506128a661352a565b156128c8576128b6601654612f4e565b4780156128c6576128c64761319f565b505b5050506128db565b600060128190556013555b610fd0838383612972565b6000818484111561290a5760405162461bcd60e51b81526004016107c091906140dc565b506000610bc08486614214565b600060f882901c60e883901c837cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81165b9695505050505050565b600080600061295c61355c565b909250905061296b8282611dc7565b9250505090565b601c5468010000000000000000900460ff1680156129a05750601c546901000000000000000000900460ff16155b156129b057610fd0838383613730565b601c5468010000000000000000900460ff161580156129de5750601c546901000000000000000000900460ff165b156129ee57610fd083838361388f565b601c5468010000000000000000900460ff16158015612a1d5750601c546901000000000000000000900460ff16155b15612a2d57610fd083838361397c565b601c5468010000000000000000900460ff168015612a5a5750601c546901000000000000000000900460ff165b15612a6a57610fd08383836139f9565b610fd083838361397c565b604080516002808252606082018352839260009291906020830190803683370190505090508281600081518110612abc57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600354604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015612b2957600080fd5b505afa158015612b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b619190613efb565b81600181518110612b8257634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918416906370a082319060240160206040518083038186803b158015612beb57600080fd5b505afa158015612bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c239190614073565b6003546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526024810183905291925084169063095ea7b390604401602060405180830381600087803b158015612c8c57600080fd5b505af1158015612ca0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc4919061403f565b506003546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790612d1790849060009087903090429060040161414d565b600060405180830381600087803b158015612d3157600080fd5b505af1158015612d45573d6000803e3d6000fd5b5050505050505050565b6001600160a01b038116600090815260096020526040812054431415612d8b57506001600160a01b03166000908152600a602052604090205490565b61076482612eef565b6000610a9783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128e6565b80471015612e265760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016107c0565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612e73576040519150601f19603f3d011682016040523d82523d6000602084013e612e78565b606091505b5050905080610fd05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016107c0565b6001600160a01b03811660009081526007602052604081205460e81c15612f2c57506001600160a01b031660009081526005602052604090205490565b6001600160a01b03821660009081526004602052604090205461076490610a07565b601b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790556040805160028082526060820183526000926020830190803683370190505090503081600081518110612fd157634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601a54604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b15801561303e57600080fd5b505afa158015613052573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130769190613efb565b8160018151811061309757634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601a546130bd9130911684611e09565b601a546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac9479061310f90859060009086903090429060040161414d565b600060405180830381600087803b15801561312957600080fd5b505af115801561313d573d6000803e3d6000fd5b5050601b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16905550505050565b600060f882901c60f083901c837cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116612945565b601480546131cd916001600160a01b03909116906131c8906131c2856011613aa5565b90611dc7565b612dd6565b601554610cbb906001600160a01b03166131c860146131c2856003613aa5565b6000818361320e5760405162461bcd60e51b81526004016107c091906140dc565b506000610bc084866141d5565b600060f882901c60f083901c60e884901c7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616612945565b60008061325e83856141bd565b905083811015610a975760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016107c0565b601c5460009063ffffffff165a1015905090565b600d548111156133165760405162461bcd60e51b815260206004820152601c60248201527f4f766572206d6178207472616e73616374696f6e20616d6f756e742e0000000060448201526064016107c0565b6011548161332384612eef565b61332d91906141bd565b1115610c2e5760405162461bcd60e51b815260206004820152601760248201527f4f766572206d61782077616c6c657420616d6f756e742e00000000000000000060448201526064016107c0565b6001600160a01b038216600090815260076020526040812054819060e81c815b6001600160a01b0386166000908152601760205260409020548110156134af576001600160a01b03861660009081526017602052604081208054839081106133f357634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050600060186000896001600160a01b03166001600160a01b03168152602001908152602001600020838154811061344657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050428262278d0061346391906141bd565b10156134935783156134805761347981866141bd565b945061349a565b61348981610a07565b61347990866141bd565b50506134af565b505080806134a79061422b565b91505061339b565b506001600160a01b0385166000908152601960205260409020548211156134d95760009250613522565b6001600160a01b0385166000908152601960205260408120546134fc9084612d94565b905061350e856131c283612710613aa5565b93506127108411156135205761271093505b505b505092915050565b601b546000907a010000000000000000000000000000000000000000000000000000900463ffffffff165a1015905090565b600b546000908190683635c9adc5dea00000825b6008548110156136f3578260046000600884815481106135a057634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061361957508160056000600884815481106135f257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613635575050600b5493683635c9adc5dea000009350915050565b613689600460006008848154811061365d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612d94565b92506136df60056000600884815481106136b357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612d94565b9150806136eb8161422b565b915050613570565b50600b5461370a90683635c9adc5dea00000611dc7565b821015613727575050600b5492683635c9adc5dea0000092509050565b90939092509050565b601b547801000000000000000000000000000000000000000000000000900460ff161561376257610fd0838383613b40565b60008060008060008061377487613c5e565b95509550955095509550955061378a8886613cad565b6001600160a01b0389166000908152600560205260409020546137ad9088612d94565b6001600160a01b038a166000908152600560209081526040808320939093556004905220546137dc9087612d94565b6001600160a01b03808b1660009081526004602052604080822093909355908a168152205461380b9086613251565b6001600160a01b03891660009081526004602052604090205561382d81613d1d565b6138378483613da5565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161387c91815260200190565b60405180910390a3505050505050505050565b601b547801000000000000000000000000000000000000000000000000900460ff16156138c157610fd0838383613b40565b6138cc838383613b40565b6000806000806000806138de87613c5e565b9550955095509550955095506138f48884613cad565b6001600160a01b0389166000908152600460205260409020546139179087612d94565b6001600160a01b03808b16600090815260046020908152604080832094909455918b1681526005909152205461394d9084613251565b6001600160a01b03891660009081526005602090815260408083209390935560049052205461380b9086613251565b601b547801000000000000000000000000000000000000000000000000900460ff16156139ae57610fd0838383613b40565b6000806000806000806139c087613c5e565b9550955095509550955095506139d68886613cad565b6001600160a01b0389166000908152600460205260409020546137dc9087612d94565b601b547801000000000000000000000000000000000000000000000000900460ff1615613a2b57610fd0838383613b40565b600080600080600080613a3d87613c5e565b955095509550955095509550613a538886613cad565b6001600160a01b038916600090815260056020526040902054613a769088612d94565b6001600160a01b038a166000908152600560209081526040808320939093556004905220546139179087612d94565b600082613ab457506000610764565b6000613ac083856141f5565b905082613acd85836141d5565b14610a975760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016107c0565b6001816000613b4f8284612d94565b6001600160a01b03861660009081526009602090815260408083204390556004909152902054909150613b829085613251565b6001600160a01b038087166000908152600a6020908152604080832094909455918916815260049091522054613bb89083612d94565b6001600160a01b038088166000908152600460205260408082209390935590871681522054613be79084613251565b6001600160a01b038616600090815260046020526040902055613c0981613d1d565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613c4e91815260200190565b60405180910390a3505050505050565b6000806000806000806000806000613c758a613dc9565b9250925092506000806000613c938d8686613c8e61294f565b613e0b565b919f909e50909c50959a5093985091965092945050505050565b601b54790100000000000000000000000000000000000000000000000000900460ff1615610c2e576001600160a01b039190911660008181526017602090815260408083208054600180820183559185528385204291015593835260188252822080549384018155825290200155565b6000613d2761294f565b90506000613d358383613aa5565b30600090815260046020526040902054909150613d529082613251565b3060009081526004602090815260408083209390935560079052205460e81c15610fd05730600090815260056020526040902054613d909084613251565b30600090815260056020526040902055505050565b600b54613db29083612d94565b600b55600c54613dc29082613251565b600c555050565b600080600080613dd885613e5b565b90506000613de586613e78565b90506000613dfd82613df78986612d94565b90612d94565b979296509094509092505050565b6000808080613e1a8886613aa5565b90506000613e288887613aa5565b90506000613e368888613aa5565b90506000613e4882613df78686612d94565b939b939a50919850919650505050505050565b60006107646127106131c260135485613aa590919063ffffffff16565b60006107646127106131c260125485613aa590919063ffffffff16565b60008083601f840112613ea6578182fd5b50813567ffffffffffffffff811115613ebd578182fd5b6020830191508360208260051b8501011115613ed857600080fd5b9250929050565b600060208284031215613ef0578081fd5b8135610a978161425c565b600060208284031215613f0c578081fd5b8151610a978161425c565b60008060408385031215613f29578081fd5b8235613f348161425c565b91506020830135613f448161425c565b809150509250929050565b600080600060608486031215613f63578081fd5b8335613f6e8161425c565b92506020840135613f7e8161425c565b929592945050506040919091013590565b60008060408385031215613fa1578182fd5b8235613fac8161425c565b946020939093013593505050565b60008060008060408587031215613fcf578081fd5b843567ffffffffffffffff80821115613fe6578283fd5b613ff288838901613e95565b9096509450602087013591508082111561400a578283fd5b5061401787828801613e95565b95989497509550505050565b600060208284031215614034578081fd5b8135610a9781614271565b600060208284031215614050578081fd5b8151610a9781614271565b60006020828403121561406c578081fd5b5035919050565b600060208284031215614084578081fd5b5051919050565b60008060006060848603121561409f578283fd5b8351925060208401519150604084015190509250925092565b6000602082840312156140c9578081fd5b813563ffffffff81168114610a97578182fd5b6000602080835283518082850152825b81811015614108578581018301518582016040015282016140ec565b818111156141195783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561419c5784516001600160a01b031683529383019391830191600101614177565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156141d0576141d0614246565b500190565b6000826141f057634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561420f5761420f614246565b500290565b60008282101561422657614226614246565b500390565b600060001982141561423f5761423f614246565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610cbb57600080fd5b8015158114610cbb57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220e1bbaa5138b85395b8c4eb02f41ce2c7f63f6b73da2939684233313017d9bb2d64736f6c63430008040033

Deployed Bytecode Sourcemap

16297:38225:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25436:83;;;;;;;;;;-1:-1:-1;25506:5:0;;;;;;;;;;;;;;;;;25436:83;;;;;;;:::i;:::-;;;;;;;;26342:193;;;;;;;;;;-1:-1:-1;26342:193:0;;;;;:::i;:::-;;:::i;:::-;;;6361:14:1;;6354:22;6336:41;;6324:2;6309:18;26342:193:0;6291:92:1;34158:116:0;;;;;;;;;;-1:-1:-1;34158:116:0;;;;;:::i;:::-;;:::i;:::-;;25713:95;;;;;;;;;;-1:-1:-1;17235:21:0;25713:95;;;14052:25:1;;;14040:2;14025:18;25713:95:0;14007:76:1;34405:116:0;;;;;;;;;;-1:-1:-1;34405:116:0;;;;;:::i;:::-;;:::i;26543:446::-;;;;;;;;;;-1:-1:-1;26543:446:0;;;;;:::i;:::-;;:::i;36137:162::-;;;;;;;;;;-1:-1:-1;36137:162:0;;;;;:::i;:::-;;:::i;33575:115::-;;;;;;;;;;-1:-1:-1;33575:115:0;;;;;:::i;:::-;;:::i;38608:322::-;;;;;;;;;;-1:-1:-1;38608:322:0;;;;;:::i;:::-;;:::i;25622:83::-;;;;;;;;;;-1:-1:-1;25622:83:0;;19174:1;15264:36:1;;15252:2;15237:18;25622:83:0;15219:87:1;13678:273:0;;;;;;;;;;-1:-1:-1;13678:273:0;;;;;:::i;:::-;;:::i;50516:134::-;;;;;;;;;;-1:-1:-1;50516:134:0;;;;;:::i;:::-;;:::i;14342:112::-;;;;;;;;;;-1:-1:-1;14342:112:0;;;;;:::i;:::-;;:::i;49353:124::-;;;;;;;;;;-1:-1:-1;49353:124:0;;;;;:::i;:::-;;:::i;14012:279::-;;;;;;;;;;-1:-1:-1;14012:279:0;;;;;:::i;:::-;;:::i;27100:101::-;;;;;;;;;;-1:-1:-1;27100:101:0;;;;;:::i;:::-;;:::i;25816:119::-;;;;;;;;;;-1:-1:-1;25816:119:0;;;;;:::i;:::-;;:::i;11791:148::-;;;;;;;;;;;;;:::i;15093:388::-;;;;;;;;;;-1:-1:-1;15093:388:0;;;;;:::i;:::-;;:::i;36960:98::-;;;;;;;;;;-1:-1:-1;36960:98:0;;;;;:::i;:::-;;:::i;15553:210::-;;;;;;;;;;;;;:::i;38473:127::-;;;;;;;;;;-1:-1:-1;38473:127:0;;;;;:::i;:::-;;:::i;11577:79::-;;;;;;;;;;-1:-1:-1;11615:7:0;11642:6;11577:79;;-1:-1:-1;;;;;11642:6:0;;;4842:74:1;;4830:2;4815:18;11577:79:0;4797:125:1;25527:87:0;;;;;;;;;;-1:-1:-1;25599:7:0;;;;;;;;;;;;;;;;;25527:87;;25943:199;;;;;;;;;;-1:-1:-1;25943:199:0;;;;;:::i;:::-;;:::i;40578:110::-;;;;;;;;;;-1:-1:-1;40578:110:0;;;;;:::i;:::-;;:::i;37284:346::-;;;;;;;;;;-1:-1:-1;37284:346:0;;;;;:::i;:::-;;:::i;50198:306::-;;;;;;;;;;-1:-1:-1;50198:306:0;;;;;:::i;:::-;;:::i;34584:1174::-;;;;;;;;;;;;;:::i;36744:96::-;;;;;;;;;;-1:-1:-1;36744:96:0;;;;;:::i;:::-;;:::i;26150:184::-;;;;;;;;;;-1:-1:-1;26150:184:0;;;;;:::i;:::-;-1:-1:-1;;;;;26299:18:0;;;26267:7;26299:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;26150:184;50016:174;;;;;;;;;;-1:-1:-1;50016:174:0;;;;;:::i;:::-;;:::i;32169:99::-;;;;;;;;;;-1:-1:-1;32169:99:0;;;;;:::i;:::-;;:::i;33334:107::-;;;;;;;;;;-1:-1:-1;33334:107:0;;;;;:::i;:::-;;:::i;37734:157::-;;;;;;;;;;;;;:::i;35865:161::-;;;;;;;;;;-1:-1:-1;35865:161:0;;;;;:::i;:::-;;:::i;26342:193::-;26444:4;26466:39;9160:10;26489:7;26498:6;26466:8;:39::i;:::-;-1:-1:-1;26523:4:0;26342:193;;;;;:::o;34158:116::-;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;;;;;;;;;34230:15:::1;:36:::0;;;::::1;-1:-1:-1::0;;;;;34230:36:0;;;::::1;::::0;;;::::1;::::0;;34158:116::o;34405:::-;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;34477:15:::1;:36:::0;;;::::1;-1:-1:-1::0;;;;;34477:36:0;;;::::1;::::0;;;::::1;::::0;;34405:116::o;26543:446::-;26675:4;26692:36;26702:6;26710:9;26721:6;26692:9;:36::i;:::-;26739:220;26762:6;9160:10;26810:138;26866:6;26810:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26810:19:0;;;;;;:11;:19;;;;;;;;9160:10;26810:33;;;;;;;;;;:37;:138::i;:::-;26739:8;:220::i;:::-;-1:-1:-1;26977:4:0;26543:446;;;;;:::o;36137:162::-;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;-1:-1:-1;;;;;36261:19:0;::::1;36241:5;36261:19:::0;;;:11:::1;:19;::::0;;;;;36221:70:::1;::::0;36241:5;36221::::1;:70::i;:::-;-1:-1:-1::0;;;;;36199:19:0;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:92;36137:162::o;33575:115::-;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;33668:14:::1;:6:::0;33677:5:::1;33668:14;:::i;:::-;33649:16;:33:::0;-1:-1:-1;33575:115:0:o;38608:322::-;38702:7;38760;;38749;:18;;38727:110;;;;-1:-1:-1;;;38727:110:0;;7661:2:1;38727:110:0;;;7643:21:1;7700:2;7680:18;;;7673:30;7739:34;7719:18;;;7712:62;7810:12;7790:18;;;7783:40;7840:19;;38727:110:0;7633:232:1;38727:110:0;38848:19;38870:10;:8;:10::i;:::-;38848:32;-1:-1:-1;38898:24:0;:7;38848:32;38898:11;:24::i;:::-;38891:31;38608:322;-1:-1:-1;;;38608:322:0:o;13678:273::-;13502:11;;13830:4;;-1:-1:-1;;;;;13502:11:0;9160:10;13502:27;13480:124;;;;-1:-1:-1;;;13480:124:0;;11138:2:1;13480:124:0;;;11120:21:1;11177:2;11157:18;;;11150:30;11216:34;11196:18;;;11189:62;11287:17;11267:18;;;11260:45;11322:19;;13480:124:0;11110:237:1;13480:124:0;13907:36:::1;::::0;;;;-1:-1:-1;;;;;5451:55:1;;;13907:36:0::1;::::0;::::1;5433:74:1::0;5523:18;;;5516:34;;;13875:13:0;;13907:19;;::::1;::::0;::::1;::::0;5406:18:1;;13907:36:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13900:43:::0;13678:273;-1:-1:-1;;;;;13678:273:0:o;50516:134::-;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;50598:44:::1;9160:10:::0;50627:7:::1;50636:5;50598:14;:44::i;:::-;50516:134:::0;;:::o;14342:112::-;13502:11;;-1:-1:-1;;;;;13502:11:0;9160:10;13502:27;13480:124;;;;-1:-1:-1;;;13480:124:0;;11138:2:1;13480:124:0;;;11120:21:1;11177:2;11157:18;;;11150:30;11216:34;11196:18;;;11189:62;11287:17;11267:18;;;11260:45;11322:19;;13480:124:0;11110:237:1;13480:124:0;14426:20:::1;14432:13;14426:5;:20::i;:::-;14342:112:::0;:::o;49353:124::-;-1:-1:-1;;;;;49448:20:0;;49418:4;49448:20;;;:11;:20;;;;;;52381:3;52371:13;49442:27;52528:112;14012:279;13502:11;;14167:4;;-1:-1:-1;;;;;13502:11:0;9160:10;13502:27;13480:124;;;;-1:-1:-1;;;13480:124:0;;11138:2:1;13480:124:0;;;11120:21:1;11177:2;11157:18;;;11150:30;11216:34;11196:18;;;11189:62;11287:17;11267:18;;;11260:45;11322:19;;13480:124:0;11110:237:1;13480:124:0;14244:39:::1;::::0;;;;-1:-1:-1;;;;;5451:55:1;;;14244:39:0::1;::::0;::::1;5433:74:1::0;5523:18;;;5516:34;;;14212:13:0;;14244:20;;::::1;::::0;::::1;::::0;5406:18:1;;14244:39:0::1;5388:168:1::0;27100:101:0;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;27170:15:::1;:23:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;27100:101::o;25816:119::-;25882:7;25909:18;25919:7;25909:9;:18::i;11791:148::-;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;11898:1:::1;11882:6:::0;;11861:40:::1;::::0;-1:-1:-1;;;;;11882:6:0;;::::1;::::0;11861:40:::1;::::0;11898:1;;11861:40:::1;11929:1;11912:19:::0;;;::::1;::::0;;11791:148::o;15093:388::-;13502:11;;-1:-1:-1;;;;;13502:11:0;9160:10;13502:27;13480:124;;;;-1:-1:-1;;;13480:124:0;;11138:2:1;13480:124:0;;;11120:21:1;11177:2;11157:18;;;11150:30;11216:34;11196:18;;;11189:62;11287:17;11267:18;;;11260:45;11322:19;;13480:124:0;11110:237:1;13480:124:0;15224:21:::1;15256:20;15262:13:::0;15256:5:::1;:20::i;:::-;15287:11;15301:33;:21;15327:6:::0;15301:25:::1;:33::i;:::-;15455:11;::::0;15287:47;;-1:-1:-1;15437:36:0::1;::::0;-1:-1:-1;;;;;15455:11:0::1;15287:47:::0;15437:9:::1;:36::i;:::-;13615:1;;15093:388:::0;:::o;36960:98::-;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;37025:16:::1;:25:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;36960:98::o;15553:210::-;13502:11;;-1:-1:-1;;;;;13502:11:0;9160:10;13502:27;13480:124;;;;-1:-1:-1;;;13480:124:0;;11138:2:1;13480:124:0;;;11120:21:1;11177:2;11157:18;;;11150:30;11216:34;11196:18;;;11189:62;11287:17;11267:18;;;11260:45;11322:19;;13480:124:0;11110:237:1;13480:124:0;15657:7:::1;::::0;:14:::1;::::0;;;;;;;15624:17:::1;::::0;-1:-1:-1;;;;;15657:7:0::1;::::0;:12:::1;::::0;:14:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:7;:14;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15697:29;::::0;;;;15720:4:::1;15697:29;::::0;::::1;4842:74:1::0;15624:48:0;;-1:-1:-1;15683:11:0::1;::::0;-1:-1:-1;;;;;15697:14:0;::::1;::::0;::::1;::::0;4815:18:1;;15697:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15737:18;::::0;;;;::::1;::::0;::::1;14052:25:1::0;;;15683:43:0;;-1:-1:-1;;;;;;15737:13:0;::::1;::::0;::::1;::::0;14025:18:1;;15737::0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;13615:1;;15553:210::o:0;38473:127::-;-1:-1:-1;;;;;38571:20:0;;38541:4;38571:20;;;:11;:20;;;;;;52477:3;52467:13;38565:27;52768:112;25943:199;26048:4;26070:42;9160:10;26094:9;26105:6;26070:9;:42::i;40578:110::-;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;40650:14:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;40578:110::o;37284:346::-;20057:15;;-1:-1:-1;;;;;20057:15:0;9160:10;-1:-1:-1;;;;;20041:31:0;;:83;;;-1:-1:-1;20109:15:0;;-1:-1:-1;;;;;20109:15:0;9160:10;-1:-1:-1;;;;;20093:31:0;;20041:83;:127;;;-1:-1:-1;11615:7:0;11642:6;-1:-1:-1;;;;;11642:6:0;9160:10;20145:23;20041:127;20019:160;;;;;;37392:12:::1;37448:20;17235:21;37460:7:::0;37448:11:::1;:20::i;:::-;37419:26;37439:4;37419:11;:26::i;:::-;:49;37415:175;;;37492:20;17235:21;37504:7:::0;37492:11:::1;:20::i;:::-;37485:27;;37415:175;;;37552:26;37572:4;37552:11;:26::i;:::-;37545:33;;37415:175;37600:22;37617:4;37600:16;:22::i;50198:306::-:0;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;50313:30;;::::1;50305:63;;;::::0;-1:-1:-1;;;50305:63:0;;10379:2:1;50305:63:0::1;::::0;::::1;10361:21:1::0;10418:2;10398:18;;;10391:30;10457:22;10437:18;;;10430:50;10497:18;;50305:63:0::1;10351:170:1::0;50305:63:0::1;50383:6;50379:118;50395:18:::0;;::::1;50379:118;;;50435:50;9160:10:::0;50464:7:::1;;50472:1;50464:10;;;;;-1:-1:-1::0;;;50464:10:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50476:5;;50482:1;50476:8;;;;;-1:-1:-1::0;;;50476:8:0::1;;;;;;;;;;;;;;;50435:14;:50::i;:::-;50415:3:::0;::::1;::::0;::::1;:::i;:::-;;;;50379:118;;;;50198:306:::0;;;;:::o;34584:1174::-;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;34646:11:::1;::::0;;;::::1;;;34645:12;34637:48;;;::::0;-1:-1:-1;;;34637:48:0;;13053:2:1;34637:48:0::1;::::0;::::1;13035:21:1::0;13092:2;13072:18;;;13065:30;13131:25;13111:18;;;13104:53;13174:18;;34637:48:0::1;13025:173:1::0;34637:48:0::1;34831:15;:34:::0;;;::::1;34767:42;34831:34:::0;;::::1;::::0;;;34876:58:::1;34893:4;34767:42:::0;17235:21:::1;34876:8;:58::i;:::-;34979:16;-1:-1:-1::0;;;;;34979:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34961:70:0::1;;35040:4;35047:16;-1:-1:-1::0;;;;;35047:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34961:110;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;5180:15:1;;;34961:110:0::1;::::0;::::1;5162:34:1::0;5232:15;;5212:18;;;5205:43;5074:18;;34961:110:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34945:13;:126:::0;;;::::1;-1:-1:-1::0;;;;;34945:126:0;;::::1;;::::0;;35082:15:::1;::::0;::::1;:31;35121:21;35166:4;35186:24;35166:4:::0;35186:9:::1;:24::i;:::-;35225:1;35241::::0;35257:7:::1;11615::::0;11642:6;-1:-1:-1;;;;;11642:6:0;;11577:79;35257:7:::1;35082:223;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;5943:15:1;;;35082:223:0::1;::::0;::::1;5925:34:1::0;5975:18;;;5968:34;;;;6018:18;;;6011:34;;;;6061:18;;;6054:34;6125:15;;;6104:19;;;6097:44;35279:15:0::1;6157:19:1::0;;;6150:35;5836:19;;35082:223:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;35316:11:0::1;:18:::0;;35345:22;;;;;;;;-1:-1:-1;35410:14:0::1;:24:::0;;;::::1;35427:7;35410:24;::::0;;17235:21:::1;35445:12;:22:::0;;;35513:16:::1;::::0;35525:3:::1;35513:11;:16::i;:::-;35494;:35:::0;35540:11:::1;:18:::0;;;;;::::1;;::::0;;;35581:12:::1;35569:9;:24:::0;35613:15:::1;35604:6;:24:::0;35691:15:::1;::::0;35639:111:::1;::::0;;;;-1:-1:-1;;;;;35691:15:0;;::::1;35639:111;::::0;::::1;5433:74:1::0;-1:-1:-1;;5523:18:1;;;5516:34;35646:13:0;;;35639:29:::1;::::0;5406:18:1;;35639:111:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36744:96::-:0;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;36808:15:::1;:24:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;36744:96::o;50016:174::-;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;50092:9:::1;:23:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;50092:23:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;50161:20:0;;;:11:::1;50092:23;50161:20:::0;;;;;50149:33:::1;::::0;50092:23;50149:5:::1;:33::i;32169:99::-:0;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;32244:6:::1;:16:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;32169:99::o;33334:107::-;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;33419:14:::1;:6:::0;33428:5:::1;33419:14;:::i;:::-;33404:12;:29:::0;-1:-1:-1;33334:107:0:o;37734:157::-;20057:15;;-1:-1:-1;;;;;20057:15:0;9160:10;-1:-1:-1;;;;;20041:31:0;;:83;;;-1:-1:-1;20109:15:0;;-1:-1:-1;;;;;20109:15:0;9160:10;-1:-1:-1;;;;;20093:31:0;;20041:83;:127;;;-1:-1:-1;11615:7:0;11642:6;-1:-1:-1;;;;;11642:6:0;9160:10;20145:23;20041:127;20019:160;;;;;;37819:21:::1;37851:32;37819:21:::0;37851:12:::1;:32::i;35865:161::-:0;11704:6;;-1:-1:-1;;;;;11704:6:0;9160:10;11704:22;11696:67;;;;-1:-1:-1;;;11696:67:0;;10018:2:1;11696:67:0;;;10000:21:1;;;10037:18;;;10030:30;10096:34;10076:18;;;10069:62;10148:18;;11696:67:0;9990:182:1;11696:67:0;-1:-1:-1;;;;;35988:19:0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;35949:69:::1;::::0;35969:4:::1;::::0;35949:5:::1;:69::i;10828:132::-:0;10886:7;10913:39;10917:1;10920;10913:39;;;;;;;;;;;;;;;;;:3;:39::i;27209:369::-;-1:-1:-1;;;;;27336:19:0;;27328:68;;;;-1:-1:-1;;;27328:68:0;;12648:2:1;27328:68:0;;;12630:21:1;12687:2;12667:18;;;12660:30;12726:34;12706:18;;;12699:62;12797:6;12777:18;;;12770:34;12821:19;;27328:68:0;12620:226:1;27328:68:0;-1:-1:-1;;;;;27415:21:0;;27407:68;;;;-1:-1:-1;;;27407:68:0;;8072:2:1;27407:68:0;;;8054:21:1;8111:2;8091:18;;;8084:30;8150:34;8130:18;;;8123:62;8221:4;8201:18;;;8194:32;8243:19;;27407:68:0;8044:224:1;27407:68:0;-1:-1:-1;;;;;27486:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;27538:32;;14052:25:1;;;27538:32:0;;14025:18:1;27538:32:0;;;;;;;27209:369;;;:::o;27586:4465::-;-1:-1:-1;;;;;27708:18:0;;27700:68;;;;-1:-1:-1;;;27700:68:0;;12242:2:1;27700:68:0;;;12224:21:1;12281:2;12261:18;;;12254:30;12320:34;12300:18;;;12293:62;12391:7;12371:18;;;12364:35;12416:19;;27700:68:0;12214:227:1;27700:68:0;-1:-1:-1;;;;;27787:16:0;;27779:64;;;;-1:-1:-1;;;27779:64:0;;7257:2:1;27779:64:0;;;7239:21:1;7296:2;7276:18;;;7269:30;7335:34;7315:18;;;7308:62;7406:5;7386:18;;;7379:33;7429:19;;27779:64:0;7229:225:1;27779:64:0;27871:1;27862:6;:10;27854:64;;;;-1:-1:-1;;;27854:64:0;;10728:2:1;27854:64:0;;;10710:21:1;10767:2;10747:18;;;10740:30;10806:34;10786:18;;;10779:62;10877:11;10857:18;;;10850:39;10906:19;;27854:64:0;10700:231:1;27854:64:0;27941:1;27931:7;:11;;;27953;:15;;;27979:5;:13;;;;;;-1:-1:-1;;;;;28057:15:0;;;;;:11;:15;;;;;;;28004:9;28003:70;;;;;;;;;;;;;;;;;;;;52477:3;52467:13;;;28003:70;;;;;;;;;;;;;52429:3;52419:13;;;28003:70;;;;;;;;;;;;;52381:3;52371:13;;;28003:70;;;;;;;28147:17;;;;;;;;;;52371:13;;;;28084:81;;;;;52419:13;;;;28084:81;;;;;;;;;52467:13;;;;28084:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11642:6;;;28196:15;;;;:45;;-1:-1:-1;11615:7:0;11642:6;-1:-1:-1;;;;;28228:13:0;;;11642:6;;28228:13;;28196:45;:83;;;;-1:-1:-1;;;;;;28258:21:0;;28274:4;28258:21;;28196:83;:110;;;;-1:-1:-1;28297:9:0;;;;;;;28296:10;28196:110;:139;;;;-1:-1:-1;28324:11:0;;;;;;;28323:12;28196:139;28178:3821;;;28389:5;;;;;;;28388:6;:39;;;;-1:-1:-1;28420:7:0;;;;;;;28419:8;28388:39;28362:109;;;;-1:-1:-1;;;28362:109:0;;11906:2:1;28362:109:0;;;11888:21:1;11945:1;11925:18;;;11918:29;11983:10;11963:18;;;11956:38;12011:18;;28362:109:0;11878:157:1;28362:109:0;28631:5;:12;;;;;;;;-1:-1:-1;;;;;28755:12:0;;28631;28755;;;28631:5;28755:12;;;;;:22;;28771:6;;28631:12;28755:22;;28771:6;;28755:22;:::i;:::-;;;;-1:-1:-1;;28825:13:0;;-1:-1:-1;;;;;28817:21:0;;;28825:13;;28817:21;:55;;;;-1:-1:-1;28856:15:0;;-1:-1:-1;;;;;28842:30:0;;;28856:15;;28842:30;;28817:55;28813:3016;;;28981:15;;;;;;;28978:117;;;29029:8;;;;;;;;29041:12;29029:24;;29021:54;;;;-1:-1:-1;;;29021:54:0;;13405:2:1;29021:54:0;;;13387:21:1;13444:2;13424:18;;;13417:30;13483:19;13463:18;;;13456:47;13520:18;;29021:54:0;13377:167:1;29021:54:0;-1:-1:-1;;;;;29234:15:0;;;;;;:11;:15;;;;;;29162:106;;29198:12;;29162:5;:106::i;:::-;-1:-1:-1;;;;;29144:15:0;;;;;;:11;:15;;;;;:124;29411:9;;29432:12;;29411:18;;17756:1;29411:13;:18::i;:::-;:33;29408:652;;;29573:5;29563:7;:15;29615:1;29601:11;:15;29639:5;:12;;;;;;;;28178:3821;;29408:652;29681:9;;29701:12;;29681:17;;29695:2;29681:13;:17::i;:::-;:32;:50;;;;;29717:14;:12;:14::i;:::-;29677:383;;;29766:5;29756:7;:15;29808:1;29794:11;:15;29832:5;:12;;;;;;;;28178:3821;;29677:383;29983:22;29994:2;29998:6;29983:10;:22::i;:::-;30028:5;:12;;;;;;;;29677:383;28178:3821;;28813:3016;30091:13;;-1:-1:-1;;;;;30085:19:0;;;30091:13;;30085:19;:55;;;;-1:-1:-1;30124:15:0;;-1:-1:-1;;;;;30108:32:0;;;30124:15;;30108:32;;30085:55;30081:1748;;;30187:5;:13;;;;;;;;30307:15;;;30187:13;30307:15;30304:119;;;30355:10;;;;;;;;30369:12;30355:26;;30347:56;;;;-1:-1:-1;;;30347:56:0;;13405:2:1;30347:56:0;;;13387:21:1;13444:2;13424:18;;;13417:30;13483:19;13463:18;;;13456:47;13520:18;;30347:56:0;13377:167:1;30347:56:0;-1:-1:-1;;;;;30563:17:0;;;;;;:11;:17;;;;;;30492:107;;;30527:12;30492:107;;:5;:107::i;:::-;-1:-1:-1;;;;;30472:17:0;;;;;;:11;:17;;;;;:127;30674:12;;30664:22;;;30656:63;;;;-1:-1:-1;;;30656:63:0;;13751:2:1;30656:63:0;;;13733:21:1;13790:2;13770:18;;;13763:30;13829;13809:18;;;13802:58;13877:18;;30656:63:0;13723:178:1;30656:63:0;30846:13;30862:26;30875:4;30881:6;30862:12;:26::i;:::-;30846:42;-1:-1:-1;31048:12:0;30846:42;31058:1;31048:9;:12::i;:::-;31038:7;:22;31152:13;:5;31162:2;31152:9;:13::i;:::-;31138:11;:27;31242:28;31273:26;31293:4;31273:11;:26::i;:::-;31357:19;;31399:11;;31242:57;;-1:-1:-1;31333:43:0;;;;31399:11;;;;;:22;;;;;31414:7;31399:22;:33;;;;-1:-1:-1;31426:6:0;;;;;;;31425:7;31399:33;:50;;;;;31436:13;:11;:13::i;:::-;31395:419;;;31551:34;31568:16;;31551;:34::i;:::-;31637:21;31685:22;;31681:114;;31736:35;31749:21;31736:12;:35::i;:::-;31395:419;;30081:1748;;;28178:3821;;;31956:1;31946:7;:11;;;31972;:15;28178:3821;32011:32;32026:4;32032:2;32036:6;32011:14;:32::i;10342:224::-;10462:7;10498:12;10490:6;;;;10482:29;;;;-1:-1:-1;;;10482:29:0;;;;;;;;:::i;:::-;-1:-1:-1;10522:9:0;10534:5;10538:1;10534;:5;:::i;53251:232::-;53340:17;52381:3;52371:13;;;52477:3;52467:13;;;52371;51589:141;;;53451:24;53439:36;53251:232;-1:-1:-1;;;;;;53251:232:0:o;48112:164::-;48154:7;48175:15;48192;48211:19;:17;:19::i;:::-;48174:56;;-1:-1:-1;48174:56:0;-1:-1:-1;48248:20:0;48174:56;;48248:11;:20::i;:::-;48241:27;;;;48112:164;:::o;39011:644::-;39143:8;;;;;;;:24;;;;-1:-1:-1;39156:11:0;;;;;;;39155:12;39143:24;39139:509;;;39184:48;39206:6;39214:9;39225:6;39184:21;:48::i;39139:509::-;39255:8;;;;;;;39254:9;:24;;;;-1:-1:-1;39267:11:0;;;;;;;39254:24;39250:398;;;39295:46;39315:6;39323:9;39334:6;39295:19;:46::i;39250:398::-;39364:8;;;;;;;39363:9;:25;;;;-1:-1:-1;39377:11:0;;;;;;;39376:12;39363:25;39359:289;;;39405:44;39423:6;39431:9;39442:6;39405:17;:44::i;39359:289::-;39471:8;;;;;;;:23;;;;-1:-1:-1;39483:11:0;;;;;;;39471:23;39467:181;;;39511:48;39533:6;39541:9;39552:6;39511:21;:48::i;39467:181::-;39592:44;39610:6;39618:9;39629:6;39592:17;:44::i;14558:527::-;14673:16;;;14687:1;14673:16;;;;;;;;14634:3;;14606:18;;14673:16;14687:1;14673:16;;;;;;;;;;-1:-1:-1;14673:16:0;14649:40;;14710:3;14700:4;14705:1;14700:7;;;;;;-1:-1:-1;;;14700:7:0;;;;;;;;;-1:-1:-1;;;;;14700:13:0;;;:7;;;;;;;;;;:13;;;;14734:7;;:14;;;;;;;;:7;;;;;:12;;:14;;;;;14700:7;;14734:14;;;;;:7;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14724:4;14729:1;14724:7;;;;;;-1:-1:-1;;;14724:7:0;;;;;;;;;-1:-1:-1;;;;;14724:24:0;;;:7;;;;;;;;;:24;14781:36;;;;;14811:4;14781:36;;;4842:74:1;14759:19:0;;14781:21;;;;;4815:18:1;;14781:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14856:7;;14828:50;;;;;-1:-1:-1;;;;;14856:7:0;;;14828:50;;;5433:74:1;5523:18;;;5516:34;;;14759:58:0;;-1:-1:-1;14828:19:0;;;;;5406:18:1;;14828:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;14889:7:0;;:188;;;;;-1:-1:-1;;;;;14889:7:0;;;;:58;;:188;;14962:11;;14889:7;;15004:4;;15031;;15051:15;;14889:188;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14558:527;;;;:::o;37899:221::-;-1:-1:-1;;;;;37977:13:0;;37953:7;37977:13;;;:8;:13;;;;;;37994:12;37977:29;37973:140;;;-1:-1:-1;;;;;;38030:15:0;;;;;:10;:15;;;;;;;37899:221::o;37973:140::-;38085:16;38097:3;38085:11;:16::i;10198:136::-;10256:7;10283:43;10287:1;10290;10283:43;;;;;;;;;;;;;;;;;:3;:43::i;15884:391::-;16013:6;15988:21;:31;;15966:110;;;;-1:-1:-1;;;15966:110:0;;9258:2:1;15966:110:0;;;9240:21:1;9297:2;9277:18;;;9270:30;9336:31;9316:18;;;9309:59;9385:18;;15966:110:0;9230:179:1;15966:110:0;16090:12;16108:9;-1:-1:-1;;;;;16108:14:0;16130:6;16108:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16089:52;;;16174:7;16152:115;;;;-1:-1:-1;;;16152:115:0;;8831:2:1;16152:115:0;;;8813:21:1;8870:2;8850:18;;;8843:30;8909:34;8889:18;;;8882:62;8980:28;8960:18;;;8953:56;9026:19;;16152:115:0;8803:248:1;38128:183:0;-1:-1:-1;;;;;38214:16:0;;38184:7;38214:16;;;:11;:16;;;;;;52477:3;52467:13;38204:48;;;-1:-1:-1;;;;;;38240:12:0;;;;;:7;:12;;;;;;;38128:183::o;38204:48::-;-1:-1:-1;;;;;38290:12:0;;;;;;:7;:12;;;;;;38270:33;;:19;:33::i;32276:483::-;19917:6;:13;;;;;;;;32378:16:::1;::::0;;32392:1:::1;32378:16:::0;;;;;::::1;::::0;;-1:-1:-1;;32378:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;32378:16:0::1;32354:40;;32423:4;32405;32410:1;32405:7;;;;;;-1:-1:-1::0;;;32405:7:0::1;;;;;;;;;-1:-1:-1::0;;;;;32405:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;32449:15:::1;::::0;:22:::1;::::0;;;;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;32405:7;;32449:22;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32439:4;32444:1;32439:7;;;;;;-1:-1:-1::0;;;32439:7:0::1;;;;;;;;;-1:-1:-1::0;;;;;32439:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;32514:15:::1;::::0;32482:62:::1;::::0;32499:4:::1;::::0;32514:15:::1;32532:11:::0;32482:8:::1;:62::i;:::-;32555:15;::::0;:196:::1;::::0;;;;-1:-1:-1;;;;;32555:15:0;;::::1;::::0;:66:::1;::::0;:196:::1;::::0;32636:11;;32555:15:::1;::::0;32678:4;;32705::::1;::::0;32725:15:::1;::::0;32555:196:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;19953:6:0;:14;;;;;;-1:-1:-1;;;;32276:483:0:o;53491:232::-;53580:17;52381:3;52371:13;;;52429:3;52419:13;;;52371;51589:141;;;53691:24;51327:411;32767:437;32978:15;;;32946:110;;-1:-1:-1;;;;;32978:15:0;;;;33008:37;;:19;:6;17953:2;33008:10;:19::i;:::-;:23;;:37::i;:::-;32946:17;:110::i;:::-;33119:15;;33087:109;;-1:-1:-1;;;;;33119:15:0;33149:36;18060:2;33149:18;:6;17996:1;33149:10;:18::i;10968:223::-;11088:7;11123:12;11116:5;11108:28;;;;-1:-1:-1;;;11108:28:0;;;;;;;;:::i;:::-;-1:-1:-1;11147:9:0;11159:5;11163:1;11159;:5;:::i;53731:232::-;53823:17;52381:3;52371:13;;;52429:3;52419:13;;;52477:3;52467:13;;;51589:141;;;53931:24;51327:411;10011:179;10069:7;;10101:5;10105:1;10101;:5;:::i;:::-;10089:17;;10130:1;10125;:6;;10117:46;;;;-1:-1:-1;;;10117:46:0;;8475:2:1;10117:46:0;;;8457:21:1;8514:2;8494:18;;;8487:30;8553:29;8533:18;;;8526:57;8600:18;;10117:46:0;8447:177:1;36476:150:0;36602:16;;36522:4;;36602:16;;36589:9;:29;;36582:36;;36476:150;:::o;33698:329::-;33823:12;;33813:6;:22;;33805:63;;;;-1:-1:-1;;;33805:63:0;;13751:2:1;33805:63:0;;;13733:21:1;13790:2;13770:18;;;13763:30;13829;13809:18;;;13802:58;13877:18;;33805:63:0;13723:178:1;33805:63:0;33952:16;;33942:6;33924:15;33936:2;33924:11;:15::i;:::-;:24;;;;:::i;:::-;:44;;33902:117;;;;-1:-1:-1;;;33902:117:0;;11554:2:1;33902:117:0;;;11536:21:1;11593:2;11573:18;;;11566:30;11632:25;11612:18;;;11605:53;11675:18;;33902:117:0;11526:173:1;41040:1675:0;-1:-1:-1;;;;;41295:19:0;;41116:16;41295:19;;;:11;:19;;;;;;41116:16;;52477:3;52467:13;41116:16;41326:730;-1:-1:-1;;;;;41395:14:0;;;;;;:6;:14;;;;;:21;41382:34;;41326:730;;;-1:-1:-1;;;;;41515:14:0;;41502:10;41515:14;;;:6;:14;;;;;:26;;41530:10;;41515:26;;;;-1:-1:-1;;;41515:26:0;;;;;;;;;;;;;;;;;41502:39;;41556:11;41570:7;:15;41578:6;-1:-1:-1;;;;;41570:15:0;-1:-1:-1;;;;;41570:15:0;;;;;;;;;;;;41586:10;41570:27;;;;;;-1:-1:-1;;;41570:27:0;;;;;;;;;;;;;;;;;41556:41;;41631:15;41616:2;41621:7;41616:12;;;;:::i;:::-;:30;41612:433;;;41734:4;41731:156;;;41763:17;41777:3;41763:17;;:::i;:::-;;;41612:433;;41731:156;41843:24;41863:3;41843:19;:24::i;:::-;41829:38;;;;:::i;41612:433::-;42024:5;;;;41612:433;41326:730;;41431:12;;;;;:::i;:::-;;;;41326:730;;;-1:-1:-1;;;;;;42262:14:0;;;;;;:6;:14;;;;;;42249:27;;42246:462;;;42304:1;42293:12;;42246:462;;;-1:-1:-1;;;;;42407:14:0;;42390;42407;;;:6;:14;;;;;;:30;;42426:10;42407:18;:30::i;:::-;42390:47;-1:-1:-1;42553:29:0;42575:6;42553:17;42390:47;42564:5;42553:10;:17::i;:29::-;42542:40;;42639:5;42628:8;:16;42625:72;;;42676:5;42665:16;;42625:72;42246:462;;41040:1675;;;;;;:::o;36307:161::-;36445:15;;36352:4;;36445:15;;;;;36432:9;:28;;36425:35;;36307:161;:::o;48284:605::-;48382:7;;48335;;;;17235:21;48335:7;48436:338;48460:9;:16;48456:20;;48436:338;;;48544:7;48520;:21;48528:9;48538:1;48528:12;;;;;;-1:-1:-1;;;48528:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48528:12:0;48520:21;;;;;;;;;;;;;:31;;:83;;;48596:7;48572;:21;48580:9;48590:1;48580:12;;;;;;-1:-1:-1;;;48580:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48580:12:0;48572:21;;;;;;;;;;;;;:31;48520:83;48498:146;;;-1:-1:-1;;48627:7:0;;;17235:21;;-1:-1:-1;48284:605:0;-1:-1:-1;;48284:605:0:o;48498:146::-;48669:34;48681:7;:21;48689:9;48699:1;48689:12;;;;;;-1:-1:-1;;;48689:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48689:12:0;48681:21;;;;;;;;;;;;;48669:7;;:11;:34::i;:::-;48659:44;;48728:34;48740:7;:21;48748:9;48758:1;48748:12;;;;;;-1:-1:-1;;;48748:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48748:12:0;48740:21;;;;;;;;;;;;;48728:7;;:11;:34::i;:::-;48718:44;-1:-1:-1;48478:3:0;;;;:::i;:::-;;;;48436:338;;;-1:-1:-1;48798:7:0;;:20;;17235:21;48798:11;:20::i;:::-;48788:7;:30;48784:61;;;-1:-1:-1;;48828:7:0;;;17235:21;;-1:-1:-1;48284:605:0;-1:-1:-1;48284:605:0:o;48784:61::-;48864:7;;48873;;-1:-1:-1;48284:605:0;-1:-1:-1;48284:605:0:o;44464:837::-;44604:5;;;;;;;44600:694;;;44626:40;44639:6;44647:9;44658:7;44626:12;:40::i;44600:694::-;44710:15;44740:23;44778:12;44805:23;44843:12;44870:18;44902:19;44913:7;44902:10;:19::i;:::-;44695:226;;;;;;;;;;;;44932:38;44943:9;44954:15;44932:10;:38::i;:::-;-1:-1:-1;;;;;44999:15:0;;;;;;:7;:15;;;;;;:28;;45019:7;44999:19;:28::i;:::-;-1:-1:-1;;;;;44981:15:0;;;;;;:7;:15;;;;;;;;:46;;;;45056:7;:15;;;;:28;;45076:7;45056:19;:28::i;:::-;-1:-1:-1;;;;;45038:15:0;;;;;;;:7;:15;;;;;;:46;;;;45116:18;;;;;;;:39;;45139:15;45116:22;:39::i;:::-;-1:-1:-1;;;;;45095:18:0;;;;;;:7;:18;;;;;:60;45166:22;45177:10;45166;:22::i;:::-;45199:23;45211:4;45217;45199:11;:23::i;:::-;45255:9;-1:-1:-1;;;;;45238:44:0;45247:6;-1:-1:-1;;;;;45238:44:0;;45266:15;45238:44;;;;14052:25:1;;14040:2;14025:18;;14007:76;45238:44:0;;;;;;;;44600:694;;;;;;44464:837;;;:::o;43556:900::-;43694:5;;;;;;;43690:759;;;43716:40;43729:6;43737:9;43748:7;43716:12;:40::i;43690:759::-;43785:40;43798:6;43806:9;43817:7;43785:12;:40::i;:::-;43851:15;43881:23;43919:12;43946:23;43984:12;44011:18;44043:19;44054:7;44043:10;:19::i;:::-;43836:226;;;;;;;;;;;;44073:38;44084:9;44095:15;44073:10;:38::i;:::-;-1:-1:-1;;;;;44140:15:0;;;;;;:7;:15;;;;;;:28;;44160:7;44140:19;:28::i;:::-;-1:-1:-1;;;;;44122:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;44200:18;;;;;:7;:18;;;;;:39;;44223:15;44200:22;:39::i;:::-;-1:-1:-1;;;;;44179:18:0;;;;;;:7;:18;;;;;;;;:60;;;;44271:7;:18;;;;:39;;44294:15;44271:22;:39::i;42723:825::-;42894:5;;;;;;;42890:641;;;42916:40;42929:6;42937:9;42948:7;42916:12;:40::i;42890:641::-;43004:15;43034:23;43072:12;43099:23;43137:12;43164:18;43196:19;43207:7;43196:10;:19::i;:::-;42989:226;;;;;;;;;;;;43226:38;43237:9;43248:15;43226:10;:38::i;:::-;-1:-1:-1;;;;;43293:15:0;;;;;;:7;:15;;;;;;:28;;43313:7;43293:19;:28::i;45309:908::-;45449:5;;;;;;;45445:765;;;45471:40;45484:6;45492:9;45503:7;45471:12;:40::i;45445:765::-;45555:15;45585:23;45623:12;45650:23;45688:12;45715:18;45747:19;45758:7;45747:10;:19::i;:::-;45540:226;;;;;;;;;;;;45777:38;45788:9;45799:15;45777:10;:38::i;:::-;-1:-1:-1;;;;;45844:15:0;;;;;;:7;:15;;;;;;:28;;45864:7;45844:19;:28::i;:::-;-1:-1:-1;;;;;45826:15:0;;;;;;:7;:15;;;;;;;;:46;;;;45901:7;:15;;;;:28;;45921:7;45901:19;:28::i;10574:246::-;10632:7;10656:6;10652:47;;-1:-1:-1;10686:1:0;10679:8;;10652:47;10709:9;10721:5;10725:1;10721;:5;:::i;:::-;10709:17;-1:-1:-1;10754:1:0;10745:5;10749:1;10709:17;10745:5;:::i;:::-;:10;10737:56;;;;-1:-1:-1;;;10737:56:0;;9616:2:1;10737:56:0;;;9598:21:1;9655:2;9635:18;;;9628:30;9694:34;9674:18;;;9667:62;9765:3;9745:18;;;9738:31;9786:19;;10737:56:0;9588:223:1;39716:714:0;39915:1;39945:7;39889:23;39979:28;39945:7;39915:1;39979:11;:28::i;:::-;-1:-1:-1;;;;;40063:19:0;;;;;;:8;:19;;;;;;;;40085:12;40063:34;;40132:7;:18;;;;;;39963:44;;-1:-1:-1;40132:31:0;;40155:7;40132:22;:31::i;:::-;-1:-1:-1;;;;;40108:21:0;;;;;;;:10;:21;;;;;;;;:55;;;;40225:15;;;;;:7;:15;;;;;:28;;40245:7;40225:19;:28::i;:::-;-1:-1:-1;;;;;40207:15:0;;;;;;;:7;:15;;;;;;:46;;;;40285:18;;;;;;;:39;;40308:15;40285:22;:39::i;:::-;-1:-1:-1;;;;;40264:18:0;;;;;;:7;:18;;;;;:60;40335:17;40346:5;40335:10;:17::i;:::-;40385:9;-1:-1:-1;;;;;40368:44:0;40377:6;-1:-1:-1;;;;;40368:44:0;;40396:15;40368:44;;;;14052:25:1;;14040:2;14025:18;;14007:76;40368:44:0;;;;;;;;39716:714;;;;;;:::o;46380:742::-;46480:7;46502;46524;46546;46568;46590;46640:23;46678:12;46705:18;46737:20;46749:7;46737:11;:20::i;:::-;46625:132;;;;;;46769:15;46786:23;46811:12;46827:113;46853:7;46875:4;46894:10;46919;:8;:10::i;:::-;46827:11;:113::i;:::-;46768:172;;;;-1:-1:-1;46768:172:0;;-1:-1:-1;47044:15:0;;-1:-1:-1;47074:4:0;;-1:-1:-1;47093:10:0;;-1:-1:-1;46380:742:0;;-1:-1:-1;;;;;46380:742:0:o;40696:336::-;40810:5;;;;;;;40806:219;;;-1:-1:-1;;;;;40919:17:0;;;;;;;;:6;:17;;;;;;;;:39;;;;;;;;;;;;;;40942:15;40919:39;;;40973:18;;;:7;:18;;;;:40;;;;;;;;;;;;;40696:336::o;49485:358::-;49544:19;49566:10;:8;:10::i;:::-;49544:32;-1:-1:-1;49587:18:0;49608:27;:10;49544:32;49608:14;:27::i;:::-;49687:4;49671:22;;;;:7;:22;;;;;;49587:48;;-1:-1:-1;49671:38:0;;49587:48;49671:26;:38::i;:::-;49662:4;49646:22;;;;:7;:22;;;;;;;;:63;;;;49730:11;:26;;;;52477:3;52467:13;49720:115;;;49813:4;49797:22;;;;:7;:22;;;;;;:38;;49824:10;49797:26;:38::i;:::-;49788:4;49772:22;;;;:7;:22;;;;;:63;49485:358;;;:::o;46225:147::-;46303:7;;:17;;46315:4;46303:11;:17::i;:::-;46293:7;:27;46344:10;;:20;;46359:4;46344:14;:20::i;:::-;46331:10;:33;-1:-1:-1;;46225:147:0:o;47130:412::-;47231:7;47253;47275;47310:12;47325:28;47345:7;47325:19;:28::i;:::-;47310:43;;47364:18;47385:26;47403:7;47385:17;:26::i;:::-;47364:47;-1:-1:-1;47422:23:0;47448:33;47364:47;47448:17;:7;47460:4;47448:11;:17::i;:::-;:21;;:33::i;:::-;47422:59;47517:4;;-1:-1:-1;47523:10:0;;-1:-1:-1;47130:412:0;;-1:-1:-1;;;47130:412:0:o;47550:554::-;47749:7;;;;47846:24;:7;47858:11;47846;:24::i;:::-;47828:42;-1:-1:-1;47881:12:0;47896:21;:4;47905:11;47896:8;:21::i;:::-;47881:36;-1:-1:-1;47928:18:0;47949:27;:10;47964:11;47949:14;:27::i;:::-;47928:48;-1:-1:-1;47987:23:0;48013:33;47928:48;48013:17;:7;48025:4;48013:11;:17::i;:33::-;48065:7;;;;-1:-1:-1;48091:4:0;;-1:-1:-1;47550:554:0;;-1:-1:-1;;;;;;;47550:554:0:o;48897:170::-;48992:7;49024:35;49053:5;49024:24;49036:11;;49024:7;:11;;:24;;;;:::i;49075:132::-;49141:7;49168:31;49193:5;49168:20;49180:7;;49168;:11;;:20;;;;:::i;14:395:1:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;239:18;228:30;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;382:3;375:4;365:6;362:1;358:14;350:6;346:27;342:38;339:47;336:2;;;399:1;396;389:12;336:2;98:311;;;;;:::o;414:257::-;473:6;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;591:9;578:23;610:31;635:5;610:31;:::i;676:261::-;746:6;799:2;787:9;778:7;774:23;770:32;767:2;;;820:6;812;805:22;767:2;857:9;851:16;876:31;901:5;876:31;:::i;942:398::-;1010:6;1018;1071:2;1059:9;1050:7;1046:23;1042:32;1039:2;;;1092:6;1084;1077:22;1039:2;1136:9;1123:23;1155:31;1180:5;1155:31;:::i;:::-;1205:5;-1:-1:-1;1262:2:1;1247:18;;1234:32;1275:33;1234:32;1275:33;:::i;:::-;1327:7;1317:17;;;1029:311;;;;;:::o;1345:466::-;1422:6;1430;1438;1491:2;1479:9;1470:7;1466:23;1462:32;1459:2;;;1512:6;1504;1497:22;1459:2;1556:9;1543:23;1575:31;1600:5;1575:31;:::i;:::-;1625:5;-1:-1:-1;1682:2:1;1667:18;;1654:32;1695:33;1654:32;1695:33;:::i;:::-;1449:362;;1747:7;;-1:-1:-1;;;1801:2:1;1786:18;;;;1773:32;;1449:362::o;1816:325::-;1884:6;1892;1945:2;1933:9;1924:7;1920:23;1916:32;1913:2;;;1966:6;1958;1951:22;1913:2;2010:9;1997:23;2029:31;2054:5;2029:31;:::i;:::-;2079:5;2131:2;2116:18;;;;2103:32;;-1:-1:-1;;;1903:238:1:o;2146:803::-;2268:6;2276;2284;2292;2345:2;2333:9;2324:7;2320:23;2316:32;2313:2;;;2366:6;2358;2351:22;2313:2;2411:9;2398:23;2440:18;2481:2;2473:6;2470:14;2467:2;;;2502:6;2494;2487:22;2467:2;2546:70;2608:7;2599:6;2588:9;2584:22;2546:70;:::i;:::-;2635:8;;-1:-1:-1;2520:96:1;-1:-1:-1;2723:2:1;2708:18;;2695:32;;-1:-1:-1;2739:16:1;;;2736:2;;;2773:6;2765;2758:22;2736:2;;2817:72;2881:7;2870:8;2859:9;2855:24;2817:72;:::i;:::-;2303:646;;;;-1:-1:-1;2908:8:1;-1:-1:-1;;;;2303:646:1:o;2954:251::-;3010:6;3063:2;3051:9;3042:7;3038:23;3034:32;3031:2;;;3084:6;3076;3069:22;3031:2;3128:9;3115:23;3147:28;3169:5;3147:28;:::i;3210:255::-;3277:6;3330:2;3318:9;3309:7;3305:23;3301:32;3298:2;;;3351:6;3343;3336:22;3298:2;3388:9;3382:16;3407:28;3429:5;3407:28;:::i;3470:190::-;3529:6;3582:2;3570:9;3561:7;3557:23;3553:32;3550:2;;;3603:6;3595;3588:22;3550:2;-1:-1:-1;3631:23:1;;3540:120;-1:-1:-1;3540:120:1:o;3665:194::-;3735:6;3788:2;3776:9;3767:7;3763:23;3759:32;3756:2;;;3809:6;3801;3794:22;3756:2;-1:-1:-1;3837:16:1;;3746:113;-1:-1:-1;3746:113:1:o;3864:316::-;3952:6;3960;3968;4021:2;4009:9;4000:7;3996:23;3992:32;3989:2;;;4042:6;4034;4027:22;3989:2;4076:9;4070:16;4060:26;;4126:2;4115:9;4111:18;4105:25;4095:35;;4170:2;4159:9;4155:18;4149:25;4139:35;;3979:201;;;;;:::o;4185:296::-;4243:6;4296:2;4284:9;4275:7;4271:23;4267:32;4264:2;;;4317:6;4309;4302:22;4264:2;4361:9;4348:23;4411:10;4404:5;4400:22;4393:5;4390:33;4380:2;;4442:6;4434;4427:22;6388:662;6500:4;6529:2;6558;6547:9;6540:21;6590:6;6584:13;6633:6;6628:2;6617:9;6613:18;6606:34;6658:4;6671:140;6685:6;6682:1;6679:13;6671:140;;;6780:14;;;6776:23;;6770:30;6746:17;;;6765:2;6742:26;6735:66;6700:10;;6671:140;;;6829:6;6826:1;6823:13;6820:2;;;6899:4;6894:2;6885:6;6874:9;6870:22;6866:31;6859:45;6820:2;-1:-1:-1;6966:2:1;6954:15;6971:66;6950:88;6935:104;;;;7041:2;6931:113;;6509:541;-1:-1:-1;;;6509:541:1:o;14088:1029::-;14350:4;14398:3;14387:9;14383:19;14429:6;14418:9;14411:25;14455:2;14493:6;14488:2;14477:9;14473:18;14466:34;14536:3;14531:2;14520:9;14516:18;14509:31;14560:6;14595;14589:13;14626:6;14618;14611:22;14664:3;14653:9;14649:19;14642:26;;14703:2;14695:6;14691:15;14677:29;;14724:4;14737:218;14751:6;14748:1;14745:13;14737:218;;;14816:13;;-1:-1:-1;;;;;14812:62:1;14800:75;;14930:15;;;;14895:12;;;;14773:1;14766:9;14737:218;;;-1:-1:-1;;;;;;;15011:55:1;;;;15006:2;14991:18;;14984:83;-1:-1:-1;;;15098:3:1;15083:19;15076:35;14972:3;14359:758;-1:-1:-1;;;14359:758:1:o;15311:128::-;15351:3;15382:1;15378:6;15375:1;15372:13;15369:2;;;15388:18;;:::i;:::-;-1:-1:-1;15424:9:1;;15359:80::o;15444:274::-;15484:1;15510;15500:2;;-1:-1:-1;;;15542:1:1;15535:88;15646:4;15643:1;15636:15;15674:4;15671:1;15664:15;15500:2;-1:-1:-1;15703:9:1;;15490:228::o;15723:::-;15763:7;15889:1;-1:-1:-1;;15817:74:1;15814:1;15811:81;15806:1;15799:9;15792:17;15788:105;15785:2;;;15896:18;;:::i;:::-;-1:-1:-1;15936:9:1;;15775:176::o;15956:125::-;15996:4;16024:1;16021;16018:8;16015:2;;;16029:18;;:::i;:::-;-1:-1:-1;16066:9:1;;16005:76::o;16086:195::-;16125:3;-1:-1:-1;;16149:5:1;16146:77;16143:2;;;16226:18;;:::i;:::-;-1:-1:-1;16273:1:1;16262:13;;16133:148::o;16286:184::-;-1:-1:-1;;;16335:1:1;16328:88;16435:4;16432:1;16425:15;16459:4;16456:1;16449:15;16475:154;-1:-1:-1;;;;;16554:5:1;16550:54;16543:5;16540:65;16530:2;;16619:1;16616;16609:12;16634:118;16720:5;16713:13;16706:21;16699:5;16696:32;16686:2;;16742:1;16739;16732:12

Swarm Source

ipfs://e1bbaa5138b85395b8c4eb02f41ce2c7f63f6b73da2939684233313017d9bb2d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.