Token Terareum

 

Overview [ERC-20]

Max Total Supply:
100,000,000,000,000,000 TERA

Holders:
10,540 (0.00%)

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Terareum is a centralized multifunctional web3 exchange for desktop, ios, and Android applications. Terareum exchange provides users with Deep encryption, Multi-layer security, and a transparent platform to trade, swap, buy and sell cryptocurrency

# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Terareum

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

pragma solidity 0.8.0;

// SPDX-License-Identifier: Unlicensed
interface IERC20 {
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

    event Reflection(uint256 rFee, uint256 rAmount, uint256 rTransferAmount);
    event TotalFee(uint256 tFee);
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @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"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

    function geUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    //Locks the contract for owner for the amount of time provided
    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }

    //Unlocks the contract for owner when _lockTime is exceeds
    function unlock() public virtual {
        require(
            _previousOwner == msg.sender,
            "You don't have permission to unlock"
        );
        require(block.timestamp > _lockTime, "Contract is locked until 7 days");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

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

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

    mapping(address => bool) private _isExcludedFromFee;

    mapping(address => bool) private _isExcluded;
    address[] private _excluded;

    address public BURN_ADDRESS = 0x0000000000000000000000000000000000000000;
    address public MARKET_ADDRESS = 0xd27Aed4D22A6AC0B36FfF66fb682c067CD38E1B4;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 100000 * 10**12 * 10**18;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = "Terareum";
    string private _symbol = "TERA";
    uint8 private _decimals = 18;

    uint256 public _taxFee = 3; 
    uint256 private _previousTaxFee = _taxFee;

    uint256 public _burnFee = 3; 
    uint256 private _previousBurnFee = _burnFee;

    uint256 public _marketFee = 3; 
    uint256 private _previousMarketFee = _marketFee;

    event TransferBurn(
        address indexed from,
        address indexed burnAddress,
        uint256 value
    );
    event TransferMarket(
        address indexed from,
        address indexed marketAddress,
        uint256 value
    );

    constructor() {
        _rOwned[_msgSender()] = _rTotal;

        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcluded[address(this)] = true;

        _isExcludedFromFee[BURN_ADDRESS] = true;
        _isExcluded[BURN_ADDRESS] = true;

        _isExcludedFromFee[MARKET_ADDRESS] = true;
        _isExcluded[MARKET_ADDRESS] = true;

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

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

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

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

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

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

    function transfer(address recipient, uint256 amount)
        public
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        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;
    }

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

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

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

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

    function totalBurned() public view returns (uint256) {
        return balanceOf(BURN_ADDRESS);
    }

    function totalMarketBalance() public view returns (uint256) {
        return balanceOf(MARKET_ADDRESS);
    } 

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

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

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

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

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

    function setTaxFeePercent(uint256 taxFee) external onlyOwner {
        _taxFee = taxFee;
    }

    function setBurnFeePercent(uint256 burnFee) external onlyOwner {
        _burnFee = burnFee;
    }

    function setMarketFeePercent(uint256 marketFee) external onlyOwner {
        _marketFee = marketFee;
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    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
        )
    {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tBurn,
            uint256 tMarket
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tBurn,
            tMarket,
            _getRate()
        );
        return (
            rAmount,
            rTransferAmount,
            rFee,
            tTransferAmount,
            tFee,
            tBurn,
            tMarket
        );
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tBurn = calculateBurnFee(tAmount);
        uint256 tMarket = calculateMarketFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tBurn).sub(tMarket);
        return (tTransferAmount, tFee, tBurn, tMarket);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tBurn,
        uint256 tMarket,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rBurn = tBurn.mul(currentRate);
        uint256 rMarket = tMarket.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rBurn).sub(rMarket);
        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 calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10**2);
    }

    function calculateBurnFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_burnFee).div(10**2);
    }

    function calculateMarketFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_marketFee).div(10**2);
    }

    function removeAllFee() private {
        if (_taxFee == 0) return;

        _previousTaxFee = _taxFee;
        _taxFee = 0;

        _previousBurnFee = _burnFee;
        _burnFee = 0;

        _previousMarketFee = _marketFee;
        _marketFee = 0;
    }

    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _marketFee = _previousMarketFee;
        _burnFee = _previousBurnFee;
    }

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

    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");

        //indicates if fee should be deducted from transfer
        bool takeFee = true;

        //if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }

        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from, to, amount, takeFee);
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        if (!takeFee) removeAllFee();

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

        if (!takeFee) restoreAllFee();
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tBurn,
            uint256 tMarket
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _reflectFee(rFee, tFee);
        _transferMarketFee(tMarket);
        _transferBurnFee(tBurn);
        emit TransferBurn(sender, BURN_ADDRESS, tBurn);
        emit TransferMarket(sender, MARKET_ADDRESS, tMarket);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tBurn,
            uint256 tMarket
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _reflectFee(rFee, tFee);
        _transferMarketFee(tMarket);
        _transferBurnFee(tBurn);
        emit TransferBurn(sender, BURN_ADDRESS, tBurn);
        emit TransferMarket(sender, MARKET_ADDRESS, tMarket);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tBurn,
            uint256 tMarket
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _reflectFee(rFee, tFee);
        _transferMarketFee(tMarket);
        _transferBurnFee(tBurn);
        emit TransferBurn(sender, BURN_ADDRESS, tBurn);
        emit TransferMarket(sender, MARKET_ADDRESS, tMarket);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tBurn,
            uint256 tMarket
        ) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _reflectFee(rFee, tFee);
        emit TransferBurn(sender, BURN_ADDRESS, tBurn);
        emit TransferMarket(sender, MARKET_ADDRESS, tMarket);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferMarketFee(uint256 tMarket) private {
        uint256 currentRate = _getRate();
        uint256 rMarket = tMarket.mul(currentRate);
        _rOwned[MARKET_ADDRESS] = _rOwned[MARKET_ADDRESS].add(rMarket);
        if (_isExcluded[MARKET_ADDRESS])
            _tOwned[MARKET_ADDRESS] = _tOwned[MARKET_ADDRESS].add(tMarket);
    }

    function _transferBurnFee(uint256 tBurn) private {
        uint256 currentRate = _getRate();
        uint256 rBurn = tBurn.mul(currentRate);
        _rOwned[BURN_ADDRESS] = _rOwned[BURN_ADDRESS].add(rBurn);
        if (_isExcluded[BURN_ADDRESS])
            _tOwned[BURN_ADDRESS] = _tOwned[BURN_ADDRESS].add(tBurn);
    }
}

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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rTransferAmount","type":"uint256"}],"name":"Reflection","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tFee","type":"uint256"}],"name":"TotalFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"burnAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"marketAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferMarket","type":"event"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MARKET_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"burnFee","type":"uint256"}],"name":"setBurnFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketFee","type":"uint256"}],"name":"setMarketFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMarketBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d27aed4d22a6ac0b36fff66fb682c067cd38e1b4600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506e13426172c74d822b878fe800000000600b55600b54600019620000c09190620007c6565b600019620000cf91906200074b565b600c556040518060400160405280600881526020017f546572617265756d000000000000000000000000000000000000000000000000815250600e90805190602001906200011f9291906200066d565b506040518060400160405280600481526020017f5445524100000000000000000000000000000000000000000000000000000000815250600f90805190602001906200016d9291906200066d565b506012601060006101000a81548160ff021916908360ff160217905550600360115560115460125560036013556013546014556003601555601554601655348015620001b857600080fd5b506000620001cb6200063c60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600c5460036000620002806200063c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160066000620002d46200064460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160066000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160066000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005cd6200063c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600b546040516200062e91906200072e565b60405180910390a36200088b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200067b9062000790565b90600052602060002090601f0160209004810192826200069f5760008555620006eb565b82601f10620006ba57805160ff1916838001178555620006eb565b82800160010185558215620006eb579182015b82811115620006ea578251825591602001919060010190620006cd565b5b509050620006fa9190620006fe565b5090565b5b8082111562000719576000816000905550600101620006ff565b5090565b620007288162000786565b82525050565b60006020820190506200074560008301846200071d565b92915050565b6000620007588262000786565b9150620007658362000786565b9250828210156200077b576200077a620007fe565b5b828203905092915050565b6000819050919050565b60006002820490506001821680620007a957607f821691505b60208210811415620007c057620007bf6200085c565b5b50919050565b6000620007d38262000786565b9150620007e08362000786565b925082620007f357620007f26200082d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61502c806200089b6000396000f3fe6080604052600436106102135760003560e01c806370a0823111610118578063b6c52324116100a0578063dd4670641161006f578063dd467064146107d4578063dd62ed3e146107fd578063ea2f0b371461083a578063f2fde38b14610863578063fccc28131461088c5761021a565b8063b6c523241461072a578063c0b0fda214610755578063cea2695814610780578063d89135cd146107a95761021a565b80638da5cb5b116100e75780638da5cb5b1461064357806395d89b411461066e578063a457c2d714610699578063a69df4b5146106d6578063a9059cbb146106ed5761021a565b806370a0823114610587578063715018a6146105c457806384d6ff2f146105db57806388f82020146106065761021a565b80633685d4191161019b578063437823ec1161016a578063437823ec146104905780634549b039146104b957806352390c02146104f65780635342acb41461051f578063683902011461055c5761021a565b80633685d419146103d657806339265989146103ff57806339509351146104285780633b124fe7146104655761021a565b806317c1878a116101e257806317c1878a146102db57806318160ddd1461030657806323b872dd146103315780632d8381191461036e578063313ce567146103ab5761021a565b8063061c82d01461021f57806306fdde0314610248578063095ea7b31461027357806313114a9d146102b05761021a565b3661021a57005b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190614494565b6108b7565b005b34801561025457600080fd5b5061025d610956565b60405161026a9190614a7a565b60405180910390f35b34801561027f57600080fd5b5061029a60048036038101906102959190614458565b6109e8565b6040516102a79190614a5f565b60405180910390f35b3480156102bc57600080fd5b506102c5610a06565b6040516102d29190614c5c565b60405180910390f35b3480156102e757600080fd5b506102f0610a10565b6040516102fd9190614a44565b60405180910390f35b34801561031257600080fd5b5061031b610a36565b6040516103289190614c5c565b60405180910390f35b34801561033d57600080fd5b5061035860048036038101906103539190614409565b610a40565b6040516103659190614a5f565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190614494565b610b19565b6040516103a29190614c5c565b60405180910390f35b3480156103b757600080fd5b506103c0610b87565b6040516103cd9190614c77565b60405180910390f35b3480156103e257600080fd5b506103fd60048036038101906103f891906143a4565b610b9e565b005b34801561040b57600080fd5b5061042660048036038101906104219190614494565b610f85565b005b34801561043457600080fd5b5061044f600480360381019061044a9190614458565b611024565b60405161045c9190614a5f565b60405180910390f35b34801561047157600080fd5b5061047a6110d7565b6040516104879190614c5c565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b291906143a4565b6110dd565b005b3480156104c557600080fd5b506104e060048036038101906104db91906144bd565b6111cd565b6040516104ed9190614c5c565b60405180910390f35b34801561050257600080fd5b5061051d600480360381019061051891906143a4565b611253565b005b34801561052b57600080fd5b50610546600480360381019061054191906143a4565b611507565b6040516105539190614a5f565b60405180910390f35b34801561056857600080fd5b5061057161155d565b60405161057e9190614c5c565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906143a4565b61158f565b6040516105bb9190614c5c565b60405180910390f35b3480156105d057600080fd5b506105d961167a565b005b3480156105e757600080fd5b506105f06117cd565b6040516105fd9190614c5c565b60405180910390f35b34801561061257600080fd5b5061062d600480360381019061062891906143a4565b6117d3565b60405161063a9190614a5f565b60405180910390f35b34801561064f57600080fd5b50610658611829565b6040516106659190614a44565b60405180910390f35b34801561067a57600080fd5b50610683611852565b6040516106909190614a7a565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190614458565b6118e4565b6040516106cd9190614a5f565b60405180910390f35b3480156106e257600080fd5b506106eb6119b1565b005b3480156106f957600080fd5b50610714600480360381019061070f9190614458565b611b85565b6040516107219190614a5f565b60405180910390f35b34801561073657600080fd5b5061073f611ba3565b60405161074c9190614c5c565b60405180910390f35b34801561076157600080fd5b5061076a611bad565b6040516107779190614c5c565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190614494565b611bb3565b005b3480156107b557600080fd5b506107be611c52565b6040516107cb9190614c5c565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f69190614494565b611c84565b005b34801561080957600080fd5b50610824600480360381019061081f91906143cd565b611e4b565b6040516108319190614c5c565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c91906143a4565b611ed2565b005b34801561086f57600080fd5b5061088a600480360381019061088591906143a4565b611fc2565b005b34801561089857600080fd5b506108a1612184565b6040516108ae9190614a44565b60405180910390f35b6108bf6121aa565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094390614b9c565b60405180910390fd5b8060118190555050565b6060600e805461096590614e4b565b80601f016020809104026020016040519081016040528092919081815260200182805461099190614e4b565b80156109de5780601f106109b3576101008083540402835291602001916109de565b820191906000526020600020905b8154815290600101906020018083116109c157829003601f168201915b5050505050905090565b60006109fc6109f56121aa565b84846121b2565b6001905092915050565b6000600d54905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600b54905090565b6000610a4d84848461237d565b610b0e84610a596121aa565b610b0985604051806060016040528060288152602001614faa60289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610abf6121aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125639092919063ffffffff16565b6121b2565b600190509392505050565b6000600c54821115610b60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5790614abc565b60405180910390fd5b6000610b6a6125c7565b9050610b7f81846125f290919063ffffffff16565b915050919050565b6000601060009054906101000a900460ff16905090565b610ba66121aa565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90614b9c565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb690614b3c565b60405180910390fd5b60005b600880549050811015610f81578173ffffffffffffffffffffffffffffffffffffffff1660088281548110610d20577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f6e5760086001600880549050610d7b9190614d8f565b81548110610db2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660088281548110610e17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506008805480610f34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610f81565b8080610f7990614e7d565b915050610cc2565b5050565b610f8d6121aa565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461101a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101190614b9c565b60405180910390fd5b8060158190555050565b60006110cd6110316121aa565b846110c885600560006110426121aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461263c90919063ffffffff16565b6121b2565b6001905092915050565b60115481565b6110e56121aa565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614b9c565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600b54831115611214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120b90614b5c565b60405180910390fd5b816112355760006112248461269a565b50505050505090508091505061124d565b60006112408461269a565b5050505050915050809150505b92915050565b61125b6121aa565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df90614b9c565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90614b3c565b60405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561144957611405600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b19565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506008819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600061158a600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661158f565b905090565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561162a57600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611675565b611672600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b19565b90505b919050565b6116826121aa565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690614b9c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60155481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600f805461186190614e4b565b80601f016020809104026020016040519081016040528092919081815260200182805461188d90614e4b565b80156118da5780601f106118af576101008083540402835291602001916118da565b820191906000526020600020905b8154815290600101906020018083116118bd57829003601f168201915b5050505050905090565b60006119a76118f16121aa565b846119a285604051806060016040528060258152602001614fd2602591396005600061191b6121aa565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125639092919063ffffffff16565b6121b2565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3890614c3c565b60405180910390fd5b6002544211611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90614c1c565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000611b99611b926121aa565b848461237d565b6001905092915050565b6000600254905090565b60135481565b611bbb6121aa565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3f90614b9c565b60405180910390fd5b8060138190555050565b6000611c7f600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661158f565b905090565b611c8c6121aa565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1090614b9c565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508042611dc79190614cae565b600281905550600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611eda6121aa565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5e90614b9c565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611fca6121aa565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e90614b9c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120be90614adc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221990614bfc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228990614afc565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516123709190614c5c565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490614bdc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561245d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245490614a9c565b60405180910390fd5b600081116124a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249790614bbc565b60405180910390fd5b600060019050600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806125475750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561255157600090505b61255d84848484612702565b50505050565b60008383111582906125ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a29190614a7a565b60405180910390fd5b50600083856125ba9190614d8f565b9050809150509392505050565b60008060006125d4612a13565b915091506125eb81836125f290919063ffffffff16565b9250505090565b600061263483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612d5e565b905092915050565b600080828461264b9190614cae565b905083811015612690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268790614b1c565b60405180910390fd5b8091505092915050565b60008060008060008060008060008060006126b48c612dc1565b935093509350935060008060006126d58f8787876126d06125c7565b612e40565b925092509250828282898989899d509d509d509d509d509d509d5050505050505050919395979092949650565b806127105761270f612ef4565b5b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156127b35750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156127c8576127c3848484612f3a565b6129ff565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561286b5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156128805761287b8484846132b6565b6129fe565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156129245750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561293957612934848484613632565b6129fd565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156129db5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156129f0576129eb848484613919565b6129fc565b6129fb848484613632565b5b5b5b5b80612a0d57612a0c613d18565b5b50505050565b6000806000600c5490506000600b54905060005b600880549050811015612d2157826003600060088481548110612a73577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180612b875750816004600060088481548110612b1f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15612b9e57600c54600b5494509450505050612d5a565b612c546003600060088481548110612bdf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484613d3590919063ffffffff16565b9250612d0c6004600060088481548110612c97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483613d3590919063ffffffff16565b91508080612d1990614e7d565b915050612a27565b50612d39600b54600c546125f290919063ffffffff16565b821015612d5157600c54600b54935093505050612d5a565b81819350935050505b9091565b60008083118290612da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9c9190614a7a565b60405180910390fd5b5060008385612db49190614d04565b9050809150509392505050565b6000806000806000612dd286613d7f565b90506000612ddf87613db0565b90506000612dec88613de1565b90506000612e2782612e1985612e0b888e613d3590919063ffffffff16565b613d3590919063ffffffff16565b613d3590919063ffffffff16565b9050808484849750975097509750505050509193509193565b600080600080612e59858a613e1290919063ffffffff16565b90506000612e70868a613e1290919063ffffffff16565b90506000612e87878a613e1290919063ffffffff16565b90506000612e9e888a613e1290919063ffffffff16565b90506000612ed982612ecb85612ebd888a613d3590919063ffffffff16565b613d3590919063ffffffff16565b613d3590919063ffffffff16565b90508481859750975097505050505050955095509592505050565b60006011541415612f0457612f38565b6011546012819055506000601181905550601354601481905550600060138190555060155460168190555060006015819055505b565b6000806000806000806000612f4e8861269a565b9650965096509650965096509650612fae88600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d3590919063ffffffff16565b600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061304387600360008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d3590919063ffffffff16565b600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506130d886600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461263c90919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131258584613e8d565b61312e81613ec7565b61313782614116565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f61a114146810c6557dedd314dae835429358ca71b5ffdccc4ef651238ae0f7d4846040516131b69190614c5c565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f1ef2de947dca47f0da296874d0cde1dff59745188a8f881da87446c12ad170398360405161323d9190614c5c565b60405180910390a38873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516132a29190614c5c565b60405180910390a350505050505050505050565b60008060008060008060006132ca8861269a565b965096509650965096509650965061332a87600360008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d3590919063ffffffff16565b600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506133bf84600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461263c90919063ffffffff16565b600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061345486600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461263c90919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134a18584613e8d565b6134aa81613ec7565b6134b382614116565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f61a114146810c6557dedd314dae835429358ca71b5ffdccc4ef651238ae0f7d4846040516135329190614c5c565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f1ef2de947dca47f0da296874d0cde1dff59745188a8f881da87446c12ad17039836040516135b99190614c5c565b60405180910390a38873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161361e9190614c5c565b60405180910390a350505050505050505050565b60008060008060008060006136468861269a565b96509650965096509650965096506136a687600360008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d3590919063ffffffff16565b600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061373b86600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461263c90919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506137888584613e8d565b61379181613ec7565b61379a82614116565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f61a114146810c6557dedd314dae835429358ca71b5ffdccc4ef651238ae0f7d4846040516138199190614c5c565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f1ef2de947dca47f0da296874d0cde1dff59745188a8f881da87446c12ad17039836040516138a09190614c5c565b60405180910390a38873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516139059190614c5c565b60405180910390a350505050505050505050565b600080600080600080600061392d8861269a565b965096509650965096509650965061398d88600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d3590919063ffffffff16565b600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a2287600360008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613d3590919063ffffffff16565b600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ab784600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461263c90919063ffffffff16565b600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b4c86600360008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461263c90919063ffffffff16565b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b998584613e8d565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f61a114146810c6557dedd314dae835429358ca71b5ffdccc4ef651238ae0f7d484604051613c189190614c5c565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f1ef2de947dca47f0da296874d0cde1dff59745188a8f881da87446c12ad1703983604051613c9f9190614c5c565b60405180910390a38873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051613d049190614c5c565b60405180910390a350505050505050505050565b601254601181905550601654601581905550601454601381905550565b6000613d7783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612563565b905092915050565b6000613da96064613d9b60115485613e1290919063ffffffff16565b6125f290919063ffffffff16565b9050919050565b6000613dda6064613dcc60135485613e1290919063ffffffff16565b6125f290919063ffffffff16565b9050919050565b6000613e0b6064613dfd60155485613e1290919063ffffffff16565b6125f290919063ffffffff16565b9050919050565b600080831415613e255760009050613e87565b60008284613e339190614d35565b9050828482613e429190614d04565b14613e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e7990614b7c565b60405180910390fd5b809150505b92915050565b613ea282600c54613d3590919063ffffffff16565b600c81905550613ebd81600d5461263c90919063ffffffff16565b600d819055505050565b6000613ed16125c7565b90506000613ee88284613e1290919063ffffffff16565b9050613f5e8160036000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461263c90919063ffffffff16565b60036000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060076000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614111576140ab8360046000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461263c90919063ffffffff16565b60046000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b60006141206125c7565b905060006141378284613e1290919063ffffffff16565b90506141ad8160036000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461263c90919063ffffffff16565b60036000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060076000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615614360576142fa8360046000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461263c90919063ffffffff16565b60046000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b60008135905061437481614f64565b92915050565b60008135905061438981614f7b565b92915050565b60008135905061439e81614f92565b92915050565b6000602082840312156143b657600080fd5b60006143c484828501614365565b91505092915050565b600080604083850312156143e057600080fd5b60006143ee85828601614365565b92505060206143ff85828601614365565b9150509250929050565b60008060006060848603121561441e57600080fd5b600061442c86828701614365565b935050602061443d86828701614365565b925050604061444e8682870161438f565b9150509250925092565b6000806040838503121561446b57600080fd5b600061447985828601614365565b925050602061448a8582860161438f565b9150509250929050565b6000602082840312156144a657600080fd5b60006144b48482850161438f565b91505092915050565b600080604083850312156144d057600080fd5b60006144de8582860161438f565b92505060206144ef8582860161437a565b9150509250929050565b61450281614dc3565b82525050565b61451181614dd5565b82525050565b600061452282614c92565b61452c8185614c9d565b935061453c818560208601614e18565b61454581614f53565b840191505092915050565b600061455d602383614c9d565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145c3602a83614c9d565b91507f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008301527f65666c656374696f6e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000614629602683614c9d565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061468f602283614c9d565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146f5601b83614c9d565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614735601b83614c9d565b91507f4163636f756e7420697320616c7265616479206578636c7564656400000000006000830152602082019050919050565b6000614775601f83614c9d565b91507f416d6f756e74206d757374206265206c657373207468616e20737570706c79006000830152602082019050919050565b60006147b5602183614c9d565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061481b602083614c9d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061485b602983614c9d565b91507f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008301527f7468616e207a65726f00000000000000000000000000000000000000000000006020830152604082019050919050565b60006148c1602583614c9d565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614927602483614c9d565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061498d601f83614c9d565b91507f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006000830152602082019050919050565b60006149cd602383614c9d565b91507f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c60008301527f6f636b00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b614a2f81614e01565b82525050565b614a3e81614e0b565b82525050565b6000602082019050614a5960008301846144f9565b92915050565b6000602082019050614a746000830184614508565b92915050565b60006020820190508181036000830152614a948184614517565b905092915050565b60006020820190508181036000830152614ab581614550565b9050919050565b60006020820190508181036000830152614ad5816145b6565b9050919050565b60006020820190508181036000830152614af58161461c565b9050919050565b60006020820190508181036000830152614b1581614682565b9050919050565b60006020820190508181036000830152614b35816146e8565b9050919050565b60006020820190508181036000830152614b5581614728565b9050919050565b60006020820190508181036000830152614b7581614768565b9050919050565b60006020820190508181036000830152614b95816147a8565b9050919050565b60006020820190508181036000830152614bb58161480e565b9050919050565b60006020820190508181036000830152614bd58161484e565b9050919050565b60006020820190508181036000830152614bf5816148b4565b9050919050565b60006020820190508181036000830152614c158161491a565b9050919050565b60006020820190508181036000830152614c3581614980565b9050919050565b60006020820190508181036000830152614c55816149c0565b9050919050565b6000602082019050614c716000830184614a26565b92915050565b6000602082019050614c8c6000830184614a35565b92915050565b600081519050919050565b600082825260208201905092915050565b6000614cb982614e01565b9150614cc483614e01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cf957614cf8614ec6565b5b828201905092915050565b6000614d0f82614e01565b9150614d1a83614e01565b925082614d2a57614d29614ef5565b5b828204905092915050565b6000614d4082614e01565b9150614d4b83614e01565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8457614d83614ec6565b5b828202905092915050565b6000614d9a82614e01565b9150614da583614e01565b925082821015614db857614db7614ec6565b5b828203905092915050565b6000614dce82614de1565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015614e36578082015181840152602081019050614e1b565b83811115614e45576000848401525b50505050565b60006002820490506001821680614e6357607f821691505b60208210811415614e7757614e76614f24565b5b50919050565b6000614e8882614e01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ebb57614eba614ec6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b614f6d81614dc3565b8114614f7857600080fd5b50565b614f8481614dd5565b8114614f8f57600080fd5b50565b614f9b81614e01565b8114614fa657600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122087e60772895fbe49ff32d23a7c164a96ce7b90b68555385e53415a2dd8893aaa64736f6c63430008000033

Deployed ByteCode Sourcemap

18742:17186:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25390:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20700:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21685:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23184:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19264:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20977:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21886:446;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24000:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20886:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24670:477;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25602:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22340:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19659:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25153:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23509:483;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24330:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29610:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23389:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21080:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17339:148;;;;;;;;;;;;;:::i;:::-;;19830:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23056:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16697:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20791:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22648:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18394:341;;;;;;;;;;;;;:::i;:::-;;21286:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17931:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19743:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25494:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23279:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18096:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21493:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25272:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17642:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19185:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25390:96;16919:12;:10;:12::i;:::-;16909:22;;:6;;;;;;;;;;:22;;;16901:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25472:6:::1;25462:7;:16;;;;25390:96:::0;:::o;20700:83::-;20737:13;20770:5;20763:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20700:83;:::o;21685:193::-;21787:4;21809:39;21818:12;:10;:12::i;:::-;21832:7;21841:6;21809:8;:39::i;:::-;21866:4;21859:11;;21685:193;;;;:::o;23184:87::-;23226:7;23253:10;;23246:17;;23184:87;:::o;19264:74::-;;;;;;;;;;;;;:::o;20977:95::-;21030:7;21057;;21050:14;;20977:95;:::o;21886:446::-;22018:4;22035:36;22045:6;22053:9;22064:6;22035:9;:36::i;:::-;22082:220;22105:6;22126:12;:10;:12::i;:::-;22153:138;22209:6;22153:138;;;;;;;;;;;;;;;;;:11;:19;22165:6;22153:19;;;;;;;;;;;;;;;:33;22173:12;:10;:12::i;:::-;22153:33;;;;;;;;;;;;;;;;:37;;:138;;;;;:::i;:::-;22082:8;:220::i;:::-;22320:4;22313:11;;21886:446;;;;;:::o;24000:322::-;24094:7;24152;;24141;:18;;24119:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;24240:19;24262:10;:8;:10::i;:::-;24240:32;;24290:24;24302:11;24290:7;:11;;:24;;;;:::i;:::-;24283:31;;;24000:322;;;:::o;20886:83::-;20927:5;20952:9;;;;;;;;;;;20945:16;;20886:83;:::o;24670:477::-;16919:12;:10;:12::i;:::-;16909:22;;:6;;;;;;;;;;:22;;;16901:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24750:11:::1;:20;24762:7;24750:20;;;;;;;;;;;;;;;;;;;;;;;;;24742:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;24818:9;24813:327;24837:9;:16;;;;24833:1;:20;24813:327;;;24895:7;24879:23;;:9;24889:1;24879:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;24875:254;;;24938:9;24967:1;24948:9;:16;;;;:20;;;;:::i;:::-;24938:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24923:9;24933:1;24923:12;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;25007:1;24988:7;:16;24996:7;24988:16;;;;;;;;;;;;;;;:20;;;;25050:5;25027:11;:20;25039:7;25027:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;25074:9;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25108:5;;24875:254;24855:3;;;;;:::i;:::-;;;;24813:327;;;;24670:477:::0;:::o;25602:108::-;16919:12;:10;:12::i;:::-;16909:22;;:6;;;;;;;;;;:22;;;16901:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25693:9:::1;25680:10;:22;;;;25602:108:::0;:::o;22340:300::-;22455:4;22477:133;22500:12;:10;:12::i;:::-;22527:7;22549:50;22588:10;22549:11;:25;22561:12;:10;:12::i;:::-;22549:25;;;;;;;;;;;;;;;:34;22575:7;22549:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;22477:8;:133::i;:::-;22628:4;22621:11;;22340:300;;;;:::o;19659:26::-;;;;:::o;25153:111::-;16919:12;:10;:12::i;:::-;16909:22;;:6;;;;;;;;;;:22;;;16901:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25252:4:::1;25222:18;:27;25241:7;25222:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;25153:111:::0;:::o;23509:483::-;23627:7;23671;;23660;:18;;23652:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23730:17;23725:260;;23765:15;23796:19;23807:7;23796:10;:19::i;:::-;23764:51;;;;;;;;23837:7;23830:14;;;;;23725:260;23880:23;23917:19;23928:7;23917:10;:19::i;:::-;23877:59;;;;;;;;23958:15;23951:22;;;23509:483;;;;;:::o;24330:332::-;16919:12;:10;:12::i;:::-;16909:22;;:6;;;;;;;;;;:22;;;16901:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24411:11:::1;:20;24423:7;24411:20;;;;;;;;;;;;;;;;;;;;;;;;;24410:21;24402:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;24497:1;24478:7;:16;24486:7;24478:16;;;;;;;;;;;;;;;;:20;24474:109;;;24534:37;24554:7;:16;24562:7;24554:16;;;;;;;;;;;;;;;;24534:19;:37::i;:::-;24515:7;:16;24523:7;24515:16;;;;;;;;;;;;;;;:56;;;;24474:109;24616:4;24593:11;:20;24605:7;24593:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;24631:9;24646:7;24631:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24330:332:::0;:::o;29610:124::-;29675:4;29699:18;:27;29718:7;29699:27;;;;;;;;;;;;;;;;;;;;;;;;;29692:34;;29610:124;;;:::o;23389:111::-;23440:7;23467:25;23477:14;;;;;;;;;;;23467:9;:25::i;:::-;23460:32;;23389:111;:::o;21080:198::-;21146:7;21170:11;:20;21182:7;21170:20;;;;;;;;;;;;;;;;;;;;;;;;;21166:49;;;21199:7;:16;21207:7;21199:16;;;;;;;;;;;;;;;;21192:23;;;;21166:49;21233:37;21253:7;:16;21261:7;21253:16;;;;;;;;;;;;;;;;21233:19;:37::i;:::-;21226:44;;21080:198;;;;:::o;17339:148::-;16919:12;:10;:12::i;:::-;16909:22;;:6;;;;;;;;;;:22;;;16901:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;17446:1:::1;17409:40;;17430:6;::::0;::::1;;;;;;;;17409:40;;;;;;;;;;;;17477:1;17460:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;17339:148::o:0;19830:29::-;;;;:::o;23056:120::-;23124:4;23148:11;:20;23160:7;23148:20;;;;;;;;;;;;;;;;;;;;;;;;;23141:27;;23056:120;;;:::o;16697:79::-;16735:7;16762:6;;;;;;;;;;;16755:13;;16697:79;:::o;20791:87::-;20830:13;20863:7;20856:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20791:87;:::o;22648:400::-;22768:4;22790:228;22813:12;:10;:12::i;:::-;22840:7;22862:145;22919:15;22862:145;;;;;;;;;;;;;;;;;:11;:25;22874:12;:10;:12::i;:::-;22862:25;;;;;;;;;;;;;;;:34;22888:7;22862:34;;;;;;;;;;;;;;;;:38;;:145;;;;;:::i;:::-;22790:8;:228::i;:::-;23036:4;23029:11;;22648:400;;;;:::o;18394:341::-;18478:10;18460:28;;:14;;;;;;;;;;;:28;;;18438:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;18588:9;;18570:15;:27;18562:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;18678:14;;;;;;;;;;;18649:44;;18670:6;;;;;;;;;;18649:44;;;;;;;;;;;;18713:14;;;;;;;;;;;18704:6;;:23;;;;;;;;;;;;;;;;;;18394:341::o;21286:199::-;21391:4;21413:42;21423:12;:10;:12::i;:::-;21437:9;21448:6;21413:9;:42::i;:::-;21473:4;21466:11;;21286:199;;;;:::o;17931:89::-;17976:7;18003:9;;17996:16;;17931:89;:::o;19743:27::-;;;;:::o;25494:100::-;16919:12;:10;:12::i;:::-;16909:22;;:6;;;;;;;;;;:22;;;16901:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25579:7:::1;25568:8;:18;;;;25494:100:::0;:::o;23279:102::-;23323:7;23350:23;23360:12;;;;;;;;;;;23350:9;:23::i;:::-;23343:30;;23279:102;:::o;18096:226::-;16919:12;:10;:12::i;:::-;16909:22;;:6;;;;;;;;;;:22;;;16901:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;18177:6:::1;::::0;::::1;;;;;;;;18160:14;;:23;;;;;;;;;;;;;;;;;;18211:1;18194:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;18254:4;18236:15;:22;;;;:::i;:::-;18224:9;:34;;;;18311:1;18274:40;;18295:6;::::0;::::1;;;;;;;;18274:40;;;;;;;;;;;;18096:226:::0;:::o;21493:184::-;21610:7;21642:11;:18;21654:5;21642:18;;;;;;;;;;;;;;;:27;21661:7;21642:27;;;;;;;;;;;;;;;;21635:34;;21493:184;;;;:::o;25272:110::-;16919:12;:10;:12::i;:::-;16909:22;;:6;;;;;;;;;;:22;;;16901:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;25369:5:::1;25339:18;:27;25358:7;25339:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;25272:110:::0;:::o;17642:281::-;16919:12;:10;:12::i;:::-;16909:22;;:6;;;;;;;;;;:22;;;16901:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;17765:1:::1;17745:22;;:8;:22;;;;17723:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;17878:8;17849:38;;17870:6;::::0;::::1;;;;;;;;17849:38;;;;;;;;;;;;17907:8;17898:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;17642:281:::0;:::o;19185:72::-;;;;;;;;;;;;;:::o;8804:98::-;8857:7;8884:10;8877:17;;8804:98;:::o;29742:371::-;29886:1;29869:19;;:5;:19;;;;29861:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29967:1;29948:21;;:7;:21;;;;29940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30051:6;30021:11;:18;30033:5;30021:18;;;;;;;;;;;;;;;:27;30040:7;30021:27;;;;;;;;;;;;;;;:36;;;;30089:7;30073:32;;30082:5;30073:32;;;30098:6;30073:32;;;;;;:::i;:::-;;;;;;;;29742:371;;;:::o;30121:747::-;30259:1;30243:18;;:4;:18;;;;30235:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30336:1;30322:16;;:2;:16;;;;30314:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;30406:1;30397:6;:10;30389:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;30527:12;30542:4;30527:19;;30647:18;:24;30666:4;30647:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;30675:18;:22;30694:2;30675:22;;;;;;;;;;;;;;;;;;;;;;;;;30647:50;30643:98;;;30724:5;30714:15;;30643:98;30819:41;30834:4;30840:2;30844:6;30852:7;30819:14;:41::i;:::-;30121:747;;;;:::o;4605:226::-;4725:7;4758:1;4753;:6;;4761:12;4745:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;4785:9;4801:1;4797;:5;;;;:::i;:::-;4785:17;;4822:1;4815:8;;;4605:226;;;;;:::o;27931:164::-;27973:7;27994:15;28011;28030:19;:17;:19::i;:::-;27993:56;;;;28067:20;28079:7;28067;:11;;:20;;;;:::i;:::-;28060:27;;;;27931:164;:::o;6037:132::-;6095:7;6122:39;6126:1;6129;6122:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6115:46;;6037:132;;;;:::o;3702:181::-;3760:7;3780:9;3796:1;3792;:5;;;;:::i;:::-;3780:17;;3821:1;3816;:6;;3808:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3874:1;3867:8;;;3702:181;;;;:::o;25966:823::-;26066:7;26088;26110;26132;26154;26176;26198;26248:23;26286:12;26313:13;26341:15;26370:20;26382:7;26370:11;:20::i;:::-;26233:157;;;;;;;;26402:15;26419:23;26444:12;26460:130;26486:7;26508:4;26527:5;26547:7;26569:10;:8;:10::i;:::-;26460:11;:130::i;:::-;26401:189;;;;;;26623:7;26645:15;26675:4;26694:15;26724:4;26743:5;26763:7;26601:180;;;;;;;;;;;;;;;;;;;;;25966:823;;;;;;;;;:::o;30949:838::-;31105:7;31100:28;;31114:14;:12;:14::i;:::-;31100:28;31145:11;:19;31157:6;31145:19;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;31169:11;:22;31181:9;31169:22;;;;;;;;;;;;;;;;;;;;;;;;;31168:23;31145:46;31141:597;;;31208:48;31230:6;31238:9;31249:6;31208:21;:48::i;:::-;31141:597;;;31279:11;:19;31291:6;31279:19;;;;;;;;;;;;;;;;;;;;;;;;;31278:20;:46;;;;;31302:11;:22;31314:9;31302:22;;;;;;;;;;;;;;;;;;;;;;;;;31278:46;31274:464;;;31341:46;31361:6;31369:9;31380:6;31341:19;:46::i;:::-;31274:464;;;31410:11;:19;31422:6;31410:19;;;;;;;;;;;;;;;;;;;;;;;;;31409:20;:47;;;;;31434:11;:22;31446:9;31434:22;;;;;;;;;;;;;;;;;;;;;;;;;31433:23;31409:47;31405:333;;;31473:44;31491:6;31499:9;31510:6;31473:17;:44::i;:::-;31405:333;;;31539:11;:19;31551:6;31539:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;31562:11;:22;31574:9;31562:22;;;;;;;;;;;;;;;;;;;;;;;;;31539:45;31535:203;;;31601:48;31623:6;31631:9;31642:6;31601:21;:48::i;:::-;31535:203;;;31682:44;31700:6;31708:9;31719:6;31682:17;:44::i;:::-;31535:203;31405:333;31274:464;31141:597;31755:7;31750:29;;31764:15;:13;:15::i;:::-;31750:29;30949:838;;;;:::o;28103:605::-;28154:7;28163;28183:15;28201:7;;28183:25;;28219:15;28237:7;;28219:25;;28260:9;28255:338;28279:9;:16;;;;28275:1;:20;28255:338;;;28363:7;28339;:21;28347:9;28357:1;28347:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28339:21;;;;;;;;;;;;;;;;:31;:83;;;;28415:7;28391;:21;28399:9;28409:1;28399:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28391:21;;;;;;;;;;;;;;;;:31;28339:83;28317:146;;;28446:7;;28455;;28438:25;;;;;;;;;28317:146;28488:34;28500:7;:21;28508:9;28518:1;28508:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28500:21;;;;;;;;;;;;;;;;28488:7;:11;;:34;;;;:::i;:::-;28478:44;;28547:34;28559:7;:21;28567:9;28577:1;28567:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28559:21;;;;;;;;;;;;;;;;28547:7;:11;;:34;;;;:::i;:::-;28537:44;;28297:3;;;;;:::i;:::-;;;;28255:338;;;;28617:20;28629:7;;28617;;:11;;:20;;;;:::i;:::-;28607:7;:30;28603:61;;;28647:7;;28656;;28639:25;;;;;;;;28603:61;28683:7;28692;28675:25;;;;;;28103:605;;;:::o;6665:312::-;6785:7;6817:1;6813;:5;6820:12;6805:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6844:9;6860:1;6856;:5;;;;:::i;:::-;6844:17;;6968:1;6961:8;;;6665:312;;;;;:::o;26797:492::-;26898:7;26920;26942;26964;26999:12;27014:24;27030:7;27014:15;:24::i;:::-;26999:39;;27049:13;27065:25;27082:7;27065:16;:25::i;:::-;27049:41;;27101:15;27119:27;27138:7;27119:18;:27::i;:::-;27101:45;;27157:23;27183:41;27216:7;27183:28;27205:5;27183:17;27195:4;27183:7;:11;;:17;;;;:::i;:::-;:21;;:28;;;;:::i;:::-;:32;;:41;;;;:::i;:::-;27157:67;;27243:15;27260:4;27266:5;27273:7;27235:46;;;;;;;;;;;;26797:492;;;;;:::o;27297:626::-;27517:7;27539;27561;27596:15;27614:24;27626:11;27614:7;:11;;:24;;;;:::i;:::-;27596:42;;27649:12;27664:21;27673:11;27664:4;:8;;:21;;;;:::i;:::-;27649:36;;27696:13;27712:22;27722:11;27712:5;:9;;:22;;;;:::i;:::-;27696:38;;27745:15;27763:24;27775:11;27763:7;:11;;:24;;;;:::i;:::-;27745:42;;27798:23;27824:41;27857:7;27824:28;27846:5;27824:17;27836:4;27824:7;:11;;:17;;;;:::i;:::-;:21;;:28;;;;:::i;:::-;:32;;:41;;;;:::i;:::-;27798:67;;27884:7;27893:15;27910:4;27876:39;;;;;;;;;;;27297:626;;;;;;;;;:::o;29170:267::-;29228:1;29217:7;;:12;29213:25;;;29231:7;;29213:25;29268:7;;29250:15;:25;;;;29296:1;29286:7;:11;;;;29329:8;;29310:16;:27;;;;29359:1;29348:8;:12;;;;29394:10;;29373:18;:31;;;;29428:1;29415:10;:14;;;;29170:267;:::o;33494:866::-;33645:15;33675:23;33713:12;33740:23;33778:12;33805:13;33833:15;33862:19;33873:7;33862:10;:19::i;:::-;33630:251;;;;;;;;;;;;;;33910:28;33930:7;33910;:15;33918:6;33910:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;33892:7;:15;33900:6;33892:15;;;;;;;;;;;;;;;:46;;;;33967:28;33987:7;33967;:15;33975:6;33967:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;33949:7;:15;33957:6;33949:15;;;;;;;;;;;;;;;:46;;;;34027:39;34050:15;34027:7;:18;34035:9;34027:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;34006:7;:18;34014:9;34006:18;;;;;;;;;;;;;;;:60;;;;34077:23;34089:4;34095;34077:11;:23::i;:::-;34111:27;34130:7;34111:18;:27::i;:::-;34149:23;34166:5;34149:16;:23::i;:::-;34209:12;;;;;;;;;;;34188:41;;34201:6;34188:41;;;34223:5;34188:41;;;;;;:::i;:::-;;;;;;;;34268:14;;;;;;;;;;;34245:47;;34260:6;34245:47;;;34284:7;34245:47;;;;;;:::i;:::-;;;;;;;;34325:9;34308:44;;34317:6;34308:44;;;34336:15;34308:44;;;;;;:::i;:::-;;;;;;;;33494:866;;;;;;;;;;:::o;32608:878::-;32757:15;32787:23;32825:12;32852:23;32890:12;32917:13;32945:15;32974:19;32985:7;32974:10;:19::i;:::-;32742:251;;;;;;;;;;;;;;33022:28;33042:7;33022;:15;33030:6;33022:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;33004:7;:15;33012:6;33004:15;;;;;;;;;;;;;;;:46;;;;33082:39;33105:15;33082:7;:18;33090:9;33082:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;33061:7;:18;33069:9;33061:18;;;;;;;;;;;;;;;:60;;;;33153:39;33176:15;33153:7;:18;33161:9;33153:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;33132:7;:18;33140:9;33132:18;;;;;;;;;;;;;;;:60;;;;33203:23;33215:4;33221;33203:11;:23::i;:::-;33237:27;33256:7;33237:18;:27::i;:::-;33275:23;33292:5;33275:16;:23::i;:::-;33335:12;;;;;;;;;;;33314:41;;33327:6;33314:41;;;33349:5;33314:41;;;;;;:::i;:::-;;;;;;;;33394:14;;;;;;;;;;;33371:47;;33386:6;33371:47;;;33410:7;33371:47;;;;;;:::i;:::-;;;;;;;;33451:9;33434:44;;33443:6;33434:44;;;33462:15;33434:44;;;;;;:::i;:::-;;;;;;;;32608:878;;;;;;;;;;:::o;31795:805::-;31942:15;31972:23;32010:12;32037:23;32075:12;32102:13;32130:15;32159:19;32170:7;32159:10;:19::i;:::-;31927:251;;;;;;;;;;;;;;32207:28;32227:7;32207;:15;32215:6;32207:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;32189:7;:15;32197:6;32189:15;;;;;;;;;;;;;;;:46;;;;32267:39;32290:15;32267:7;:18;32275:9;32267:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;32246:7;:18;32254:9;32246:18;;;;;;;;;;;;;;;:60;;;;32317:23;32329:4;32335;32317:11;:23::i;:::-;32351:27;32370:7;32351:18;:27::i;:::-;32389:23;32406:5;32389:16;:23::i;:::-;32449:12;;;;;;;;;;;32428:41;;32441:6;32428:41;;;32463:5;32428:41;;;;;;:::i;:::-;;;;;;;;32508:14;;;;;;;;;;;32485:47;;32500:6;32485:47;;;32524:7;32485:47;;;;;;:::i;:::-;;;;;;;;32565:9;32548:44;;32557:6;32548:44;;;32576:15;32548:44;;;;;;:::i;:::-;;;;;;;;31795:805;;;;;;;;;;:::o;34368:865::-;34519:15;34549:23;34587:12;34614:23;34652:12;34679:13;34707:15;34736:19;34747:7;34736:10;:19::i;:::-;34504:251;;;;;;;;;;;;;;34784:28;34804:7;34784;:15;34792:6;34784:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;34766:7;:15;34774:6;34766:15;;;;;;;;;;;;;;;:46;;;;34841:28;34861:7;34841;:15;34849:6;34841:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;34823:7;:15;34831:6;34823:15;;;;;;;;;;;;;;;:46;;;;34901:39;34924:15;34901:7;:18;34909:9;34901:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;34880:7;:18;34888:9;34880:18;;;;;;;;;;;;;;;:60;;;;34972:39;34995:15;34972:7;:18;34980:9;34972:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;34951:7;:18;34959:9;34951:18;;;;;;;;;;;;;;;:60;;;;35022:23;35034:4;35040;35022:11;:23::i;:::-;35082:12;;;;;;;;;;;35061:41;;35074:6;35061:41;;;35096:5;35061:41;;;;;;:::i;:::-;;;;;;;;35141:14;;;;;;;;;;;35118:47;;35133:6;35118:47;;;35157:7;35118:47;;;;;;:::i;:::-;;;;;;;;35198:9;35181:44;;35190:6;35181:44;;;35209:15;35181:44;;;;;;:::i;:::-;;;;;;;;34368:865;;;;;;;;;;:::o;29445:157::-;29499:15;;29489:7;:25;;;;29538:18;;29525:10;:31;;;;29578:16;;29567:8;:27;;;;29445:157::o;4166:136::-;4224:7;4251:43;4255:1;4258;4251:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4244:50;;4166:136;;;;:::o;28716:130::-;28780:7;28807:31;28832:5;28807:20;28819:7;;28807;:11;;:20;;;;:::i;:::-;:24;;:31;;;;:::i;:::-;28800:38;;28716:130;;;:::o;28854:132::-;28919:7;28946:32;28972:5;28946:21;28958:8;;28946:7;:11;;:21;;;;:::i;:::-;:25;;:32;;;;:::i;:::-;28939:39;;28854:132;;;:::o;28994:168::-;29088:7;29120:34;29148:5;29120:23;29132:10;;29120:7;:11;;:23;;;;:::i;:::-;:27;;:34;;;;:::i;:::-;29113:41;;28994:168;;;:::o;5090:471::-;5148:7;5398:1;5393;:6;5389:47;;;5423:1;5416:8;;;;5389:47;5448:9;5464:1;5460;:5;;;;:::i;:::-;5448:17;;5493:1;5488;5484;:5;;;;:::i;:::-;:10;5476:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;5552:1;5545:8;;;5090:471;;;;;:::o;25811:147::-;25889:17;25901:4;25889:7;;:11;;:17;;;;:::i;:::-;25879:7;:27;;;;25930:20;25945:4;25930:10;;:14;;:20;;;;:::i;:::-;25917:10;:33;;;;25811:147;;:::o;35241:349::-;35305:19;35327:10;:8;:10::i;:::-;35305:32;;35348:15;35366:24;35378:11;35366:7;:11;;:24;;;;:::i;:::-;35348:42;;35427:36;35455:7;35427;:23;35435:14;;;;;;;;;;;35427:23;;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;35401:7;:23;35409:14;;;;;;;;;;;35401:23;;;;;;;;;;;;;;;:62;;;;35478:11;:27;35490:14;;;;;;;;;;;35478:27;;;;;;;;;;;;;;;;;;;;;;;;;35474:108;;;35546:36;35574:7;35546;:23;35554:14;;;;;;;;;;;35546:23;;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;35520:7;:23;35528:14;;;;;;;;;;;35520:23;;;;;;;;;;;;;;;:62;;;;35474:108;35241:349;;;:::o;35598:327::-;35658:19;35680:10;:8;:10::i;:::-;35658:32;;35701:13;35717:22;35727:11;35717:5;:9;;:22;;;;:::i;:::-;35701:38;;35774:32;35800:5;35774:7;:21;35782:12;;;;;;;;;;;35774:21;;;;;;;;;;;;;;;;:25;;:32;;;;:::i;:::-;35750:7;:21;35758:12;;;;;;;;;;;35750:21;;;;;;;;;;;;;;;:56;;;;35821:11;:25;35833:12;;;;;;;;;;;35821:25;;;;;;;;;;;;;;;;;;;;;;;;;35817:100;;;35885:32;35911:5;35885:7;:21;35893:12;;;;;;;;;;;35885:21;;;;;;;;;;;;;;;;:25;;:32;;;;:::i;:::-;35861:7;:21;35869:12;;;;;;;;;;;35861:21;;;;;;;;;;;;;;;:56;;;;35817:100;35598:327;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:133::-;;233:6;220:20;211:29;;249:30;273:5;249:30;:::i;:::-;201:84;;;;:::o;291:139::-;;375:6;362:20;353:29;;391:33;418:5;391:33;:::i;:::-;343:87;;;;:::o;436:262::-;;544:2;532:9;523:7;519:23;515:32;512:2;;;560:1;557;550:12;512:2;603:1;628:53;673:7;664:6;653:9;649:22;628:53;:::i;:::-;618:63;;574:117;502:196;;;;:::o;704:407::-;;;829:2;817:9;808:7;804:23;800:32;797:2;;;845:1;842;835:12;797:2;888:1;913:53;958:7;949:6;938:9;934:22;913:53;:::i;:::-;903:63;;859:117;1015:2;1041:53;1086:7;1077:6;1066:9;1062:22;1041:53;:::i;:::-;1031:63;;986:118;787:324;;;;;:::o;1117:552::-;;;;1259:2;1247:9;1238:7;1234:23;1230:32;1227:2;;;1275:1;1272;1265:12;1227:2;1318:1;1343:53;1388:7;1379:6;1368:9;1364:22;1343:53;:::i;:::-;1333:63;;1289:117;1445:2;1471:53;1516:7;1507:6;1496:9;1492:22;1471:53;:::i;:::-;1461:63;;1416:118;1573:2;1599:53;1644:7;1635:6;1624:9;1620:22;1599:53;:::i;:::-;1589:63;;1544:118;1217:452;;;;;:::o;1675:407::-;;;1800:2;1788:9;1779:7;1775:23;1771:32;1768:2;;;1816:1;1813;1806:12;1768:2;1859:1;1884:53;1929:7;1920:6;1909:9;1905:22;1884:53;:::i;:::-;1874:63;;1830:117;1986:2;2012:53;2057:7;2048:6;2037:9;2033:22;2012:53;:::i;:::-;2002:63;;1957:118;1758:324;;;;;:::o;2088:262::-;;2196:2;2184:9;2175:7;2171:23;2167:32;2164:2;;;2212:1;2209;2202:12;2164:2;2255:1;2280:53;2325:7;2316:6;2305:9;2301:22;2280:53;:::i;:::-;2270:63;;2226:117;2154:196;;;;:::o;2356:401::-;;;2478:2;2466:9;2457:7;2453:23;2449:32;2446:2;;;2494:1;2491;2484:12;2446:2;2537:1;2562:53;2607:7;2598:6;2587:9;2583:22;2562:53;:::i;:::-;2552:63;;2508:117;2664:2;2690:50;2732:7;2723:6;2712:9;2708:22;2690:50;:::i;:::-;2680:60;;2635:115;2436:321;;;;;:::o;2763:118::-;2850:24;2868:5;2850:24;:::i;:::-;2845:3;2838:37;2828:53;;:::o;2887:109::-;2968:21;2983:5;2968:21;:::i;:::-;2963:3;2956:34;2946:50;;:::o;3002:364::-;;3118:39;3151:5;3118:39;:::i;:::-;3173:71;3237:6;3232:3;3173:71;:::i;:::-;3166:78;;3253:52;3298:6;3293:3;3286:4;3279:5;3275:16;3253:52;:::i;:::-;3330:29;3352:6;3330:29;:::i;:::-;3325:3;3321:39;3314:46;;3094:272;;;;;:::o;3372:367::-;;3535:67;3599:2;3594:3;3535:67;:::i;:::-;3528:74;;3632:34;3628:1;3623:3;3619:11;3612:55;3698:5;3693:2;3688:3;3684:12;3677:27;3730:2;3725:3;3721:12;3714:19;;3518:221;;;:::o;3745:374::-;;3908:67;3972:2;3967:3;3908:67;:::i;:::-;3901:74;;4005:34;4001:1;3996:3;3992:11;3985:55;4071:12;4066:2;4061:3;4057:12;4050:34;4110:2;4105:3;4101:12;4094:19;;3891:228;;;:::o;4125:370::-;;4288:67;4352:2;4347:3;4288:67;:::i;:::-;4281:74;;4385:34;4381:1;4376:3;4372:11;4365:55;4451:8;4446:2;4441:3;4437:12;4430:30;4486:2;4481:3;4477:12;4470:19;;4271:224;;;:::o;4501:366::-;;4664:67;4728:2;4723:3;4664:67;:::i;:::-;4657:74;;4761:34;4757:1;4752:3;4748:11;4741:55;4827:4;4822:2;4817:3;4813:12;4806:26;4858:2;4853:3;4849:12;4842:19;;4647:220;;;:::o;4873:325::-;;5036:67;5100:2;5095:3;5036:67;:::i;:::-;5029:74;;5133:29;5129:1;5124:3;5120:11;5113:50;5189:2;5184:3;5180:12;5173:19;;5019:179;;;:::o;5204:325::-;;5367:67;5431:2;5426:3;5367:67;:::i;:::-;5360:74;;5464:29;5460:1;5455:3;5451:11;5444:50;5520:2;5515:3;5511:12;5504:19;;5350:179;;;:::o;5535:329::-;;5698:67;5762:2;5757:3;5698:67;:::i;:::-;5691:74;;5795:33;5791:1;5786:3;5782:11;5775:54;5855:2;5850:3;5846:12;5839:19;;5681:183;;;:::o;5870:365::-;;6033:67;6097:2;6092:3;6033:67;:::i;:::-;6026:74;;6130:34;6126:1;6121:3;6117:11;6110:55;6196:3;6191:2;6186:3;6182:12;6175:25;6226:2;6221:3;6217:12;6210:19;;6016:219;;;:::o;6241:330::-;;6404:67;6468:2;6463:3;6404:67;:::i;:::-;6397:74;;6501:34;6497:1;6492:3;6488:11;6481:55;6562:2;6557:3;6553:12;6546:19;;6387:184;;;:::o;6577:373::-;;6740:67;6804:2;6799:3;6740:67;:::i;:::-;6733:74;;6837:34;6833:1;6828:3;6824:11;6817:55;6903:11;6898:2;6893:3;6889:12;6882:33;6941:2;6936:3;6932:12;6925:19;;6723:227;;;:::o;6956:369::-;;7119:67;7183:2;7178:3;7119:67;:::i;:::-;7112:74;;7216:34;7212:1;7207:3;7203:11;7196:55;7282:7;7277:2;7272:3;7268:12;7261:29;7316:2;7311:3;7307:12;7300:19;;7102:223;;;:::o;7331:368::-;;7494:67;7558:2;7553:3;7494:67;:::i;:::-;7487:74;;7591:34;7587:1;7582:3;7578:11;7571:55;7657:6;7652:2;7647:3;7643:12;7636:28;7690:2;7685:3;7681:12;7674:19;;7477:222;;;:::o;7705:329::-;;7868:67;7932:2;7927:3;7868:67;:::i;:::-;7861:74;;7965:33;7961:1;7956:3;7952:11;7945:54;8025:2;8020:3;8016:12;8009:19;;7851:183;;;:::o;8040:367::-;;8203:67;8267:2;8262:3;8203:67;:::i;:::-;8196:74;;8300:34;8296:1;8291:3;8287:11;8280:55;8366:5;8361:2;8356:3;8352:12;8345:27;8398:2;8393:3;8389:12;8382:19;;8186:221;;;:::o;8413:118::-;8500:24;8518:5;8500:24;:::i;:::-;8495:3;8488:37;8478:53;;:::o;8537:112::-;8620:22;8636:5;8620:22;:::i;:::-;8615:3;8608:35;8598:51;;:::o;8655:222::-;;8786:2;8775:9;8771:18;8763:26;;8799:71;8867:1;8856:9;8852:17;8843:6;8799:71;:::i;:::-;8753:124;;;;:::o;8883:210::-;;9008:2;8997:9;8993:18;8985:26;;9021:65;9083:1;9072:9;9068:17;9059:6;9021:65;:::i;:::-;8975:118;;;;:::o;9099:313::-;;9250:2;9239:9;9235:18;9227:26;;9299:9;9293:4;9289:20;9285:1;9274:9;9270:17;9263:47;9327:78;9400:4;9391:6;9327:78;:::i;:::-;9319:86;;9217:195;;;;:::o;9418:419::-;;9622:2;9611:9;9607:18;9599:26;;9671:9;9665:4;9661:20;9657:1;9646:9;9642:17;9635:47;9699:131;9825:4;9699:131;:::i;:::-;9691:139;;9589:248;;;:::o;9843:419::-;;10047:2;10036:9;10032:18;10024:26;;10096:9;10090:4;10086:20;10082:1;10071:9;10067:17;10060:47;10124:131;10250:4;10124:131;:::i;:::-;10116:139;;10014:248;;;:::o;10268:419::-;;10472:2;10461:9;10457:18;10449:26;;10521:9;10515:4;10511:20;10507:1;10496:9;10492:17;10485:47;10549:131;10675:4;10549:131;:::i;:::-;10541:139;;10439:248;;;:::o;10693:419::-;;10897:2;10886:9;10882:18;10874:26;;10946:9;10940:4;10936:20;10932:1;10921:9;10917:17;10910:47;10974:131;11100:4;10974:131;:::i;:::-;10966:139;;10864:248;;;:::o;11118:419::-;;11322:2;11311:9;11307:18;11299:26;;11371:9;11365:4;11361:20;11357:1;11346:9;11342:17;11335:47;11399:131;11525:4;11399:131;:::i;:::-;11391:139;;11289:248;;;:::o;11543:419::-;;11747:2;11736:9;11732:18;11724:26;;11796:9;11790:4;11786:20;11782:1;11771:9;11767:17;11760:47;11824:131;11950:4;11824:131;:::i;:::-;11816:139;;11714:248;;;:::o;11968:419::-;;12172:2;12161:9;12157:18;12149:26;;12221:9;12215:4;12211:20;12207:1;12196:9;12192:17;12185:47;12249:131;12375:4;12249:131;:::i;:::-;12241:139;;12139:248;;;:::o;12393:419::-;;12597:2;12586:9;12582:18;12574:26;;12646:9;12640:4;12636:20;12632:1;12621:9;12617:17;12610:47;12674:131;12800:4;12674:131;:::i;:::-;12666:139;;12564:248;;;:::o;12818:419::-;;13022:2;13011:9;13007:18;12999:26;;13071:9;13065:4;13061:20;13057:1;13046:9;13042:17;13035:47;13099:131;13225:4;13099:131;:::i;:::-;13091:139;;12989:248;;;:::o;13243:419::-;;13447:2;13436:9;13432:18;13424:26;;13496:9;13490:4;13486:20;13482:1;13471:9;13467:17;13460:47;13524:131;13650:4;13524:131;:::i;:::-;13516:139;;13414:248;;;:::o;13668:419::-;;13872:2;13861:9;13857:18;13849:26;;13921:9;13915:4;13911:20;13907:1;13896:9;13892:17;13885:47;13949:131;14075:4;13949:131;:::i;:::-;13941:139;;13839:248;;;:::o;14093:419::-;;14297:2;14286:9;14282:18;14274:26;;14346:9;14340:4;14336:20;14332:1;14321:9;14317:17;14310:47;14374:131;14500:4;14374:131;:::i;:::-;14366:139;;14264:248;;;:::o;14518:419::-;;14722:2;14711:9;14707:18;14699:26;;14771:9;14765:4;14761:20;14757:1;14746:9;14742:17;14735:47;14799:131;14925:4;14799:131;:::i;:::-;14791:139;;14689:248;;;:::o;14943:419::-;;15147:2;15136:9;15132:18;15124:26;;15196:9;15190:4;15186:20;15182:1;15171:9;15167:17;15160:47;15224:131;15350:4;15224:131;:::i;:::-;15216:139;;15114:248;;;:::o;15368:222::-;;15499:2;15488:9;15484:18;15476:26;;15512:71;15580:1;15569:9;15565:17;15556:6;15512:71;:::i;:::-;15466:124;;;;:::o;15596:214::-;;15723:2;15712:9;15708:18;15700:26;;15736:67;15800:1;15789:9;15785:17;15776:6;15736:67;:::i;:::-;15690:120;;;;:::o;15816:99::-;;15902:5;15896:12;15886:22;;15875:40;;;:::o;15921:169::-;;16039:6;16034:3;16027:19;16079:4;16074:3;16070:14;16055:29;;16017:73;;;;:::o;16096:305::-;;16155:20;16173:1;16155:20;:::i;:::-;16150:25;;16189:20;16207:1;16189:20;:::i;:::-;16184:25;;16343:1;16275:66;16271:74;16268:1;16265:81;16262:2;;;16349:18;;:::i;:::-;16262:2;16393:1;16390;16386:9;16379:16;;16140:261;;;;:::o;16407:185::-;;16464:20;16482:1;16464:20;:::i;:::-;16459:25;;16498:20;16516:1;16498:20;:::i;:::-;16493:25;;16537:1;16527:2;;16542:18;;:::i;:::-;16527:2;16584:1;16581;16577:9;16572:14;;16449:143;;;;:::o;16598:348::-;;16661:20;16679:1;16661:20;:::i;:::-;16656:25;;16695:20;16713:1;16695:20;:::i;:::-;16690:25;;16883:1;16815:66;16811:74;16808:1;16805:81;16800:1;16793:9;16786:17;16782:105;16779:2;;;16890:18;;:::i;:::-;16779:2;16938:1;16935;16931:9;16920:20;;16646:300;;;;:::o;16952:191::-;;17012:20;17030:1;17012:20;:::i;:::-;17007:25;;17046:20;17064:1;17046:20;:::i;:::-;17041:25;;17085:1;17082;17079:8;17076:2;;;17090:18;;:::i;:::-;17076:2;17135:1;17132;17128:9;17120:17;;16997:146;;;;:::o;17149:96::-;;17215:24;17233:5;17215:24;:::i;:::-;17204:35;;17194:51;;;:::o;17251:90::-;;17328:5;17321:13;17314:21;17303:32;;17293:48;;;:::o;17347:126::-;;17424:42;17417:5;17413:54;17402:65;;17392:81;;;:::o;17479:77::-;;17545:5;17534:16;;17524:32;;;:::o;17562:86::-;;17637:4;17630:5;17626:16;17615:27;;17605:43;;;:::o;17654:307::-;17722:1;17732:113;17746:6;17743:1;17740:13;17732:113;;;17831:1;17826:3;17822:11;17816:18;17812:1;17807:3;17803:11;17796:39;17768:2;17765:1;17761:10;17756:15;;17732:113;;;17863:6;17860:1;17857:13;17854:2;;;17943:1;17934:6;17929:3;17925:16;17918:27;17854:2;17703:258;;;;:::o;17967:320::-;;18048:1;18042:4;18038:12;18028:22;;18095:1;18089:4;18085:12;18116:18;18106:2;;18172:4;18164:6;18160:17;18150:27;;18106:2;18234;18226:6;18223:14;18203:18;18200:38;18197:2;;;18253:18;;:::i;:::-;18197:2;18018:269;;;;:::o;18293:233::-;;18355:24;18373:5;18355:24;:::i;:::-;18346:33;;18401:66;18394:5;18391:77;18388:2;;;18471:18;;:::i;:::-;18388:2;18518:1;18511:5;18507:13;18500:20;;18336:190;;;:::o;18532:180::-;18580:77;18577:1;18570:88;18677:4;18674:1;18667:15;18701:4;18698:1;18691:15;18718:180;18766:77;18763:1;18756:88;18863:4;18860:1;18853:15;18887:4;18884:1;18877:15;18904:180;18952:77;18949:1;18942:88;19049:4;19046:1;19039:15;19073:4;19070:1;19063:15;19090:102;;19182:2;19178:7;19173:2;19166:5;19162:14;19158:28;19148:38;;19138:54;;;:::o;19198:122::-;19271:24;19289:5;19271:24;:::i;:::-;19264:5;19261:35;19251:2;;19310:1;19307;19300:12;19251:2;19241:79;:::o;19326:116::-;19396:21;19411:5;19396:21;:::i;:::-;19389:5;19386:32;19376:2;;19432:1;19429;19422:12;19376:2;19366:76;:::o;19448:122::-;19521:24;19539:5;19521:24;:::i;:::-;19514:5;19511:35;19501:2;;19560:1;19557;19550:12;19501:2;19491:79;:::o

Swarm Source

ipfs://87e60772895fbe49ff32d23a7c164a96ce7b90b68555385e53415a2dd8893aaa

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.