ETH Price: $3,281.18 (-2.17%)

Token

resonate.finance (RNFI)
 

Overview

Max Total Supply

1,000,000 RNFI

Holders

181

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$1.67

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
33.667811274 RNFI

Value
$0.00 ( ~0 Eth) [0.0034%]
0xe7f56471cc03a781c141b89297f7a7ee6bfbbe29
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Resonate Finance is a revolution project that presents a $RNFI token with multi-functions with mechanism called “Resonate”.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RESONATE

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-21
*/

/*
 * Copyright © 2020 resonate.finance. ALL RIGHTS RESERVED.
 */

pragma solidity ^0.7.0;

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

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

// File: openzeppelin-solidity\contracts\token\ERC20\IERC20.sol

// SPDX-License-Identifier: MIT
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

// File: openzeppelin-solidity\contracts\math\SafeMath.sol

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

// File: openzeppelin-solidity\contracts\utils\Address.sol

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    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);
            }
        }
    }
}

// File: openzeppelin-solidity\contracts\access\Ownable.sol

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

    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;
    }
}


contract RESONATE 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 _isExcluded; 
    address[] private _excluded;    

    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 10**6 * 10**9; 
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = "resonate.finance";
    string private _symbol = "RNFI"; 
    uint8 private _decimals = 9;
    uint256 private _decimals_exponent = 10 ** _decimals;
    uint256 private _max_fee_ratio = 0;
    uint256 private _min_fee_ratio = 0;
    uint256 private _upper_bound_amount = 1800;
    uint256 private _lower_bound_amount = 0;

    constructor() public {
        _rOwned[_msgSender()] = _rTotal;
        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 override view returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public override view 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
        override
        view
        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 isExcluded(address account) public view returns (bool) {
        return _isExcluded[account];
    }

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

    function reflect(uint256 tAmount) public {
        address sender = _msgSender();
        require(
            !_isExcluded[sender],
            "Excluded addresses cannot call this function"
        );
        (uint256 rAmount, , , , ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    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 excludeAccount(address account) external onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeAccount(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }
    
    function setMinFeeRatio(uint256 ratio) external onlyOwner() {
        require(ratio >= 0 && ratio <= 10000, "fee ratio is out of range");
        require(ratio <= _max_fee_ratio, "_min_fee_ratio cannot exceed _max_fee_ratio");
        _min_fee_ratio = ratio;
    }
    
    function setMaxFeeRatio(uint256 ratio) external onlyOwner() {
        require(ratio >= 0 && ratio <= 10000, "fee ratio is out of range");
        require(_min_fee_ratio <= ratio, "_max_fee_ratio cannot be smaller than _min_fee_ratio");
        _max_fee_ratio = ratio;
    }
    
    function setFeeRatio(uint256 min_ratio, uint256 max_ratio) external onlyOwner() {
        require(min_ratio >= 0 && min_ratio <= 10000, "fee ratio is out of range");
        require(max_ratio >= 0 && max_ratio <= 10000, "fee ratio is out of range");
        require(min_ratio <= max_ratio, "min_ratio cannot exceed max_ratio");
        _max_fee_ratio = max_ratio;
        _min_fee_ratio = min_ratio;
    }   
    
    function setUpperBoundAmount(uint256 amount) external onlyOwner() {
        require(amount >= 0 && amount <= (_tTotal/_decimals_exponent), "amount is out of range");
        require(amount >= _lower_bound_amount, "_upper_bound_amount cannot be smaller than _lower_bound_amount");
        _upper_bound_amount = amount;
    }    
    
     function setLowerBoundAmount(uint256 amount) external onlyOwner() {
        require(amount >= 0 && amount <= (_tTotal/_decimals_exponent), "amount is out of range");
        require(_upper_bound_amount >= amount, "_lower_bound_amount cannot be bigger than _lower_bound_amount");
        _lower_bound_amount = amount;
    }     
    
     function setLowerBoundAndUpperBoundAmount(uint256 lower_bound_amount, uint256 upper_bound_amount) external onlyOwner() {
        require(lower_bound_amount >= 0 && lower_bound_amount <= (_tTotal.div(_decimals_exponent)), "amount is out of range");
        require(upper_bound_amount >= 0 && upper_bound_amount <= (_tTotal.div(_decimals_exponent)), "amount is out of range");
        
        require(upper_bound_amount >= lower_bound_amount, "lower_bound_amount cannot be bigger than upper_bound_amount");
        _lower_bound_amount = lower_bound_amount;
        _upper_bound_amount = upper_bound_amount;
    }         
    
    function getMinFeeRatio() public view returns (uint256) {
        return _min_fee_ratio;
    }    
    
    function getMaxFeeRatio() public view returns (uint256) {
        return _max_fee_ratio;
    }

    function getUpperBoundAmount() public view returns (uint256) {
        return _upper_bound_amount;
    }    
    
    function getLowerBoundAmount() public view returns (uint256) {
        return _lower_bound_amount;
    }    
    
    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 sender,
        address recipient,
        uint256 amount
    ) private {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        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);
        }
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

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

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

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee
        ) = _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 Transfer(sender, recipient, tTransferAmount);
    }

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

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

    function _getTValues(uint256 tAmount)
        private
        view
        returns (uint256, uint256)
    {
        uint256 fee_ratio = 0;
        if(tAmount <= _lower_bound_amount.mul(_decimals_exponent))
        {
            fee_ratio = _min_fee_ratio;
        }
        else if(tAmount >= _upper_bound_amount.mul(_decimals_exponent))
        {
            fee_ratio = _max_fee_ratio;
        }
        else
        {
            uint256 diff_amount = tAmount.sub(_lower_bound_amount.mul(_decimals_exponent));
            uint256 max_diff_amount = _upper_bound_amount.sub(_lower_bound_amount);
            max_diff_amount = max_diff_amount.mul(_decimals_exponent);
            uint256 max_diff_ratio = _max_fee_ratio.sub(_min_fee_ratio);
            uint256 fraction = diff_amount.mul(max_diff_ratio).div(max_diff_amount);
            fee_ratio = fraction.add(_min_fee_ratio);
        }
        
        uint256 tFee = tAmount.div(10000).mul(fee_ratio);
        uint256 tTransferAmount = tAmount.sub(tFee);
        return (tTransferAmount, tFee);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee);
        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);
    }
}

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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLowerBoundAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxFeeRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinFeeRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUpperBoundAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","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":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"reflect","outputs":[],"stateMutability":"nonpayable","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":"min_ratio","type":"uint256"},{"internalType":"uint256","name":"max_ratio","type":"uint256"}],"name":"setFeeRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setLowerBoundAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lower_bound_amount","type":"uint256"},{"internalType":"uint256","name":"upper_bound_amount","type":"uint256"}],"name":"setLowerBoundAndUpperBoundAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ratio","type":"uint256"}],"name":"setMaxFeeRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ratio","type":"uint256"}],"name":"setMinFeeRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setUpperBoundAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266038d7ea4c68000600019816200001757fe5b06600019036006556040518060400160405280601081526020017f7265736f6e6174652e66696e616e636500000000000000000000000000000000815250600890805190602001906200006c929190620002a2565b506040518060400160405280600481526020017f524e46490000000000000000000000000000000000000000000000000000000081525060099080519060200190620000ba929190620002a2565b506009600a60006101000a81548160ff021916908360ff160217905550600a60009054906101000a900460ff1660ff16600a0a600b556000600c556000600d55610708600e556000600f553480156200011257600080fd5b506000620001256200029a60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060065460016000620001da6200029a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620002286200029a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef66038d7ea4c680006040518082815260200191505060405180910390a362000348565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002e557805160ff191683800117855562000316565b8280016001018555821562000316579182015b8281111562000315578251825591602001919060010190620002f8565b5b50905062000325919062000329565b5090565b5b80821115620003445760008160009055506001016200032a565b5090565b6143a880620003586000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c8063715018a61161010f578063a9059cbb116100a2578063e8a5043511610071578063e8a50435146108f9578063f2cc0c1814610927578063f2fde38b1461096b578063f84354f1146109af576101e5565b8063a9059cbb1461078b578063c3e5dcbb146107ef578063cba0e99614610827578063dd62ed3e14610881576101e5565b806395d89b41116100de57806395d89b411461063e57806398b7d4be146106c15780639cfdb6db146106f9578063a457c2d714610727576101e5565b8063715018a6146105b4578063727f4614146105be578063894954ec146105ec5780638da5cb5b1461060a576101e5565b806323b872dd116101875780634232e67e116101565780634232e67e146104c25780634549b039146104f05780636d966e761461053e57806370a082311461055c576101e5565b806323b872dd146103775780632d838119146103fb578063313ce5671461043d578063395093511461045e576101e5565b806313114a9d116101c357806313114a9d146102ff57806317706f8c1461031d57806318160ddd1461033b5780632291539014610359576101e5565b8063053ab182146101ea57806306fdde0314610218578063095ea7b31461029b575b600080fd5b6102166004803603602081101561020057600080fd5b81019080803590602001909291905050506109f3565b005b610220610b83565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610260578082015181840152602081019050610245565b50505050905090810190601f16801561028d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e7600480360360408110156102b157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c25565b60405180821515815260200191505060405180910390f35b610307610c43565b6040518082815260200191505060405180910390f35b610325610c4d565b6040518082815260200191505060405180910390f35b610343610c57565b6040518082815260200191505060405180910390f35b610361610c66565b6040518082815260200191505060405180910390f35b6103e36004803603606081101561038d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c70565b60405180821515815260200191505060405180910390f35b6104276004803603602081101561041157600080fd5b8101908080359060200190929190505050610d49565b6040518082815260200191505060405180910390f35b610445610dcd565b604051808260ff16815260200191505060405180910390f35b6104aa6004803603604081101561047457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610de4565b60405180821515815260200191505060405180910390f35b6104ee600480360360208110156104d857600080fd5b8101908080359060200190929190505050610e97565b005b6105286004803603604081101561050657600080fd5b8101908080359060200190929190803515159060200190929190505050611049565b6040518082815260200191505060405180910390f35b610546611103565b6040518082815260200191505060405180910390f35b61059e6004803603602081101561057257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061110d565b6040518082815260200191505060405180910390f35b6105bc6111f8565b005b6105ea600480360360208110156105d457600080fd5b810190808035906020019092919050505061137e565b005b6105f4611540565b6040518082815260200191505060405180910390f35b61061261154a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610646611573565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561068657808201518184015260208101905061066b565b50505050905090810190601f1680156106b35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6106f7600480360360408110156106d757600080fd5b810190808035906020019092919080359060200190929190505050611615565b005b6107256004803603602081101561070f57600080fd5b8101908080359060200190929190505050611852565b005b6107736004803603604081101561073d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a14565b60405180821515815260200191505060405180910390f35b6107d7600480360360408110156107a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ae1565b60405180821515815260200191505060405180910390f35b6108256004803603604081101561080557600080fd5b810190808035906020019092919080359060200190929190505050611aff565b005b6108696004803603602081101561083d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d6e565b60405180821515815260200191505060405180910390f35b6108e36004803603604081101561089757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dc4565b6040518082815260200191505060405180910390f35b6109256004803603602081101561090f57600080fd5b8101908080359060200190929190505050611e4b565b005b6109696004803603602081101561093d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ffd565b005b6109ad6004803603602081101561098157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612317565b005b6109f1600480360360208110156109c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612522565b005b60006109fd6128ac565b9050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610aa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806142e5602c913960400191505060405180910390fd5b6000610aad836128b4565b505050509050610b0581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b5d8160065461290c90919063ffffffff16565b600681905550610b788360075461295690919063ffffffff16565b600781905550505050565b606060088054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c1b5780601f10610bf057610100808354040283529160200191610c1b565b820191906000526020600020905b815481529060010190602001808311610bfe57829003601f168201915b5050505050905090565b6000610c39610c326128ac565b84846129de565b6001905092915050565b6000600754905090565b6000600e54905090565b600066038d7ea4c68000905090565b6000600c54905090565b6000610c7d848484612bd5565b610d3e84610c896128ac565b610d398560405180606001604052806028815260200161421760289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610cef6128ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461302e9092919063ffffffff16565b6129de565b600190509392505050565b6000600654821115610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061410b602a913960400191505060405180910390fd5b6000610db06130ee565b9050610dc5818461311990919063ffffffff16565b915050919050565b6000600a60009054906101000a900460ff16905090565b6000610e8d610df16128ac565b84610e888560036000610e026128ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b6129de565b6001905092915050565b610e9f6128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008110158015610f7257506127108111155b610fe4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f66656520726174696f206973206f7574206f662072616e67650000000000000081525060200191505060405180910390fd5b600c5481111561103f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806140e0602b913960400191505060405180910390fd5b80600d8190555050565b600066038d7ea4c680008311156110c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f416d6f756e74206d757374206265206c657373207468616e20737570706c790081525060200191505060405180910390fd5b816110e75760006110d8846128b4565b505050509050809150506110fd565b60006110f2846128b4565b505050915050809150505b92915050565b6000600d54905090565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111a857600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506111f3565b6111f0600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d49565b90505b919050565b6112006128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113866128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611446576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600081101580156114695750600b5466038d7ea4c680008161146457fe5b048111155b6114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f616d6f756e74206973206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b600f54811015611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806141b8603e913960400191505060405180910390fd5b80600e8190555050565b6000600f54905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561160b5780601f106115e05761010080835404028352916020019161160b565b820191906000526020600020905b8154815290600101906020018083116115ee57829003601f168201915b5050505050905090565b61161d6128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600082101580156116f057506127108211155b611762576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f66656520726174696f206973206f7574206f662072616e67650000000000000081525060200191505060405180910390fd5b6000811015801561177557506127108111155b6117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f66656520726174696f206973206f7574206f662072616e67650000000000000081525060200191505060405180910390fd5b80821115611840576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806140bf6021913960400191505060405180910390fd5b80600c8190555081600d819055505050565b61185a6128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461191a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000811015801561193d5750600b5466038d7ea4c680008161193857fe5b048111155b6119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f616d6f756e74206973206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b80600e541015611a0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180614336603d913960400191505060405180910390fd5b80600f8190555050565b6000611ad7611a216128ac565b84611ad2856040518060600160405280602581526020016143116025913960036000611a4b6128ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461302e9092919063ffffffff16565b6129de565b6001905092915050565b6000611af5611aee6128ac565b8484612bd5565b6001905092915050565b611b076128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008210158015611bf35750611bef600b5466038d7ea4c6800061311990919063ffffffff16565b8211155b611c65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f616d6f756e74206973206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b60008110158015611c915750611c8d600b5466038d7ea4c6800061311990919063ffffffff16565b8111155b611d03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f616d6f756e74206973206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b81811015611d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b81526020018061417d603b913960400191505060405180910390fd5b81600f8190555080600e819055505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611e536128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008110158015611f2657506127108111155b611f98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f66656520726174696f206973206f7574206f662072616e67650000000000000081525060200191505060405180910390fd5b80600d541115611ff3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806142b16034913960400191505060405180910390fd5b80600c8190555050565b6120056128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561225957612215600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d49565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506005819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61231f6128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612465576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806141356026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61252a6128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166126a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4163636f756e7420697320616c7265616479206e6f74206578636c756465640081525060200191505060405180910390fd5b60005b6005805490508110156128a8578173ffffffffffffffffffffffffffffffffffffffff16600582815481106126dd57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561289b5760056001600580549050038154811061273957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005828154811061277157fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600580548061286157fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556128a8565b80806001019150506126ac565b5050565b600033905090565b60008060008060008060006128c888613163565b9150915060006128d66130ee565b905060008060006128e88c86866132c6565b92509250925082828288889a509a509a509a509a5050505050505091939590929450565b600061294e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061302e565b905092915050565b6000808284019050838110156129d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061428d6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061415b6022913960400191505060405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806142686025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ce1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061409c6023913960400191505060405180910390fd5b60008111612d3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061423f6029913960400191505060405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612ddd5750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612df257612ded838383613324565b613029565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612e955750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612eaa57612ea5838383613577565b613028565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612f4e5750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612f6357612f5e8383836137ca565b613027565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130055750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561301a57613015838383613988565b613026565b6130258383836137ca565b5b5b5b5b505050565b60008383111582906130db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156130a0578082015181840152602081019050613085565b50505050905090810190601f1680156130cd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060006130fb613c70565b91509150613112818361311990919063ffffffff16565b9250505090565b600061315b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613f15565b905092915050565b600080600061317f600b54600f54613fdb90919063ffffffff16565b841161318f57600d549050613276565b6131a6600b54600e54613fdb90919063ffffffff16565b84106131b657600c549050613275565b60006131e16131d2600b54600f54613fdb90919063ffffffff16565b8661290c90919063ffffffff16565b905060006131fc600f54600e5461290c90919063ffffffff16565b9050613213600b5482613fdb90919063ffffffff16565b9050600061322e600d54600c5461290c90919063ffffffff16565b90506000613257836132498487613fdb90919063ffffffff16565b61311990919063ffffffff16565b905061326e600d548261295690919063ffffffff16565b9450505050505b5b600061329f826132916127108861311990919063ffffffff16565b613fdb90919063ffffffff16565b905060006132b6828761290c90919063ffffffff16565b9050808294509450505050915091565b6000806000806132df8588613fdb90919063ffffffff16565b905060006132f68688613fdb90919063ffffffff16565b9050600061330d828461290c90919063ffffffff16565b905082818395509550955050505093509350939050565b6000806000806000613335866128b4565b9450945094509450945061339186600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061342685600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134bb84600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135088382614061565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b6000806000806000613588866128b4565b945094509450945094506135e485600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061367982600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061370e84600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061375b8382614061565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b60008060008060006137db866128b4565b9450945094509450945061383785600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138cc84600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139198382614061565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b6000806000806000613999866128b4565b945094509450945094506139f586600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a8a85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b1f82600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bb484600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c018382614061565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b60008060006006549050600066038d7ea4c68000905060005b600580549050811015613ece57826001600060058481548110613ca857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180613d8f5750816002600060058481548110613d2757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15613dab5760065466038d7ea4c6800094509450505050613f11565b613e346001600060058481548110613dbf57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461290c90919063ffffffff16565b9250613ebf6002600060058481548110613e4a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361290c90919063ffffffff16565b91508080600101915050613c89565b50613eeb66038d7ea4c6800060065461311990919063ffffffff16565b821015613f085760065466038d7ea4c68000935093505050613f11565b81819350935050505b9091565b60008083118290613fc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f86578082015181840152602081019050613f6b565b50505050905090810190601f168015613fb35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613fcd57fe5b049050809150509392505050565b600080831415613fee576000905061405b565b6000828402905082848281613fff57fe5b0414614056576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141f66021913960400191505060405180910390fd5b809150505b92915050565b6140768260065461290c90919063ffffffff16565b6006819055506140918160075461295690919063ffffffff16565b600781905550505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573736d696e5f726174696f2063616e6e6f7420657863656564206d61785f726174696f5f6d696e5f6665655f726174696f2063616e6e6f7420657863656564205f6d61785f6665655f726174696f416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573736c6f7765725f626f756e645f616d6f756e742063616e6e6f7420626520626967676572207468616e2075707065725f626f756e645f616d6f756e745f75707065725f626f756e645f616d6f756e742063616e6e6f7420626520736d616c6c6572207468616e205f6c6f7765725f626f756e645f616d6f756e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735f6d61785f6665655f726174696f2063616e6e6f7420626520736d616c6c6572207468616e205f6d696e5f6665655f726174696f4578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f5f6c6f7765725f626f756e645f616d6f756e742063616e6e6f7420626520626967676572207468616e205f6c6f7765725f626f756e645f616d6f756e74a2646970667358221220f832ebf60fc359ea245e3ff6b0255fc324b9e9acfd9f21b76e7fe8cfa2551c7a64736f6c63430007000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c8063715018a61161010f578063a9059cbb116100a2578063e8a5043511610071578063e8a50435146108f9578063f2cc0c1814610927578063f2fde38b1461096b578063f84354f1146109af576101e5565b8063a9059cbb1461078b578063c3e5dcbb146107ef578063cba0e99614610827578063dd62ed3e14610881576101e5565b806395d89b41116100de57806395d89b411461063e57806398b7d4be146106c15780639cfdb6db146106f9578063a457c2d714610727576101e5565b8063715018a6146105b4578063727f4614146105be578063894954ec146105ec5780638da5cb5b1461060a576101e5565b806323b872dd116101875780634232e67e116101565780634232e67e146104c25780634549b039146104f05780636d966e761461053e57806370a082311461055c576101e5565b806323b872dd146103775780632d838119146103fb578063313ce5671461043d578063395093511461045e576101e5565b806313114a9d116101c357806313114a9d146102ff57806317706f8c1461031d57806318160ddd1461033b5780632291539014610359576101e5565b8063053ab182146101ea57806306fdde0314610218578063095ea7b31461029b575b600080fd5b6102166004803603602081101561020057600080fd5b81019080803590602001909291905050506109f3565b005b610220610b83565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610260578082015181840152602081019050610245565b50505050905090810190601f16801561028d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e7600480360360408110156102b157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c25565b60405180821515815260200191505060405180910390f35b610307610c43565b6040518082815260200191505060405180910390f35b610325610c4d565b6040518082815260200191505060405180910390f35b610343610c57565b6040518082815260200191505060405180910390f35b610361610c66565b6040518082815260200191505060405180910390f35b6103e36004803603606081101561038d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c70565b60405180821515815260200191505060405180910390f35b6104276004803603602081101561041157600080fd5b8101908080359060200190929190505050610d49565b6040518082815260200191505060405180910390f35b610445610dcd565b604051808260ff16815260200191505060405180910390f35b6104aa6004803603604081101561047457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610de4565b60405180821515815260200191505060405180910390f35b6104ee600480360360208110156104d857600080fd5b8101908080359060200190929190505050610e97565b005b6105286004803603604081101561050657600080fd5b8101908080359060200190929190803515159060200190929190505050611049565b6040518082815260200191505060405180910390f35b610546611103565b6040518082815260200191505060405180910390f35b61059e6004803603602081101561057257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061110d565b6040518082815260200191505060405180910390f35b6105bc6111f8565b005b6105ea600480360360208110156105d457600080fd5b810190808035906020019092919050505061137e565b005b6105f4611540565b6040518082815260200191505060405180910390f35b61061261154a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610646611573565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561068657808201518184015260208101905061066b565b50505050905090810190601f1680156106b35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6106f7600480360360408110156106d757600080fd5b810190808035906020019092919080359060200190929190505050611615565b005b6107256004803603602081101561070f57600080fd5b8101908080359060200190929190505050611852565b005b6107736004803603604081101561073d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a14565b60405180821515815260200191505060405180910390f35b6107d7600480360360408110156107a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ae1565b60405180821515815260200191505060405180910390f35b6108256004803603604081101561080557600080fd5b810190808035906020019092919080359060200190929190505050611aff565b005b6108696004803603602081101561083d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d6e565b60405180821515815260200191505060405180910390f35b6108e36004803603604081101561089757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dc4565b6040518082815260200191505060405180910390f35b6109256004803603602081101561090f57600080fd5b8101908080359060200190929190505050611e4b565b005b6109696004803603602081101561093d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ffd565b005b6109ad6004803603602081101561098157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612317565b005b6109f1600480360360208110156109c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612522565b005b60006109fd6128ac565b9050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610aa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806142e5602c913960400191505060405180910390fd5b6000610aad836128b4565b505050509050610b0581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b5d8160065461290c90919063ffffffff16565b600681905550610b788360075461295690919063ffffffff16565b600781905550505050565b606060088054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c1b5780601f10610bf057610100808354040283529160200191610c1b565b820191906000526020600020905b815481529060010190602001808311610bfe57829003601f168201915b5050505050905090565b6000610c39610c326128ac565b84846129de565b6001905092915050565b6000600754905090565b6000600e54905090565b600066038d7ea4c68000905090565b6000600c54905090565b6000610c7d848484612bd5565b610d3e84610c896128ac565b610d398560405180606001604052806028815260200161421760289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610cef6128ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461302e9092919063ffffffff16565b6129de565b600190509392505050565b6000600654821115610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061410b602a913960400191505060405180910390fd5b6000610db06130ee565b9050610dc5818461311990919063ffffffff16565b915050919050565b6000600a60009054906101000a900460ff16905090565b6000610e8d610df16128ac565b84610e888560036000610e026128ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b6129de565b6001905092915050565b610e9f6128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008110158015610f7257506127108111155b610fe4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f66656520726174696f206973206f7574206f662072616e67650000000000000081525060200191505060405180910390fd5b600c5481111561103f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806140e0602b913960400191505060405180910390fd5b80600d8190555050565b600066038d7ea4c680008311156110c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f416d6f756e74206d757374206265206c657373207468616e20737570706c790081525060200191505060405180910390fd5b816110e75760006110d8846128b4565b505050509050809150506110fd565b60006110f2846128b4565b505050915050809150505b92915050565b6000600d54905090565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111a857600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506111f3565b6111f0600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d49565b90505b919050565b6112006128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6113866128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611446576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600081101580156114695750600b5466038d7ea4c680008161146457fe5b048111155b6114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f616d6f756e74206973206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b600f54811015611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806141b8603e913960400191505060405180910390fd5b80600e8190555050565b6000600f54905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561160b5780601f106115e05761010080835404028352916020019161160b565b820191906000526020600020905b8154815290600101906020018083116115ee57829003601f168201915b5050505050905090565b61161d6128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600082101580156116f057506127108211155b611762576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f66656520726174696f206973206f7574206f662072616e67650000000000000081525060200191505060405180910390fd5b6000811015801561177557506127108111155b6117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f66656520726174696f206973206f7574206f662072616e67650000000000000081525060200191505060405180910390fd5b80821115611840576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806140bf6021913960400191505060405180910390fd5b80600c8190555081600d819055505050565b61185a6128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461191a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000811015801561193d5750600b5466038d7ea4c680008161193857fe5b048111155b6119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f616d6f756e74206973206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b80600e541015611a0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180614336603d913960400191505060405180910390fd5b80600f8190555050565b6000611ad7611a216128ac565b84611ad2856040518060600160405280602581526020016143116025913960036000611a4b6128ac565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461302e9092919063ffffffff16565b6129de565b6001905092915050565b6000611af5611aee6128ac565b8484612bd5565b6001905092915050565b611b076128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008210158015611bf35750611bef600b5466038d7ea4c6800061311990919063ffffffff16565b8211155b611c65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f616d6f756e74206973206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b60008110158015611c915750611c8d600b5466038d7ea4c6800061311990919063ffffffff16565b8111155b611d03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f616d6f756e74206973206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b81811015611d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b81526020018061417d603b913960400191505060405180910390fd5b81600f8190555080600e819055505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611e536128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008110158015611f2657506127108111155b611f98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f66656520726174696f206973206f7574206f662072616e67650000000000000081525060200191505060405180910390fd5b80600d541115611ff3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806142b16034913960400191505060405180910390fd5b80600c8190555050565b6120056128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561225957612215600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d49565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506005819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61231f6128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612465576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806141356026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61252a6128ac565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166126a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4163636f756e7420697320616c7265616479206e6f74206578636c756465640081525060200191505060405180910390fd5b60005b6005805490508110156128a8578173ffffffffffffffffffffffffffffffffffffffff16600582815481106126dd57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561289b5760056001600580549050038154811061273957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166005828154811061277157fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600580548061286157fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556128a8565b80806001019150506126ac565b5050565b600033905090565b60008060008060008060006128c888613163565b9150915060006128d66130ee565b905060008060006128e88c86866132c6565b92509250925082828288889a509a509a509a509a5050505050505091939590929450565b600061294e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061302e565b905092915050565b6000808284019050838110156129d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061428d6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061415b6022913960400191505060405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806142686025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ce1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061409c6023913960400191505060405180910390fd5b60008111612d3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061423f6029913960400191505060405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612ddd5750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612df257612ded838383613324565b613029565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612e955750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612eaa57612ea5838383613577565b613028565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612f4e5750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612f6357612f5e8383836137ca565b613027565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130055750600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561301a57613015838383613988565b613026565b6130258383836137ca565b5b5b5b5b505050565b60008383111582906130db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156130a0578082015181840152602081019050613085565b50505050905090810190601f1680156130cd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060006130fb613c70565b91509150613112818361311990919063ffffffff16565b9250505090565b600061315b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613f15565b905092915050565b600080600061317f600b54600f54613fdb90919063ffffffff16565b841161318f57600d549050613276565b6131a6600b54600e54613fdb90919063ffffffff16565b84106131b657600c549050613275565b60006131e16131d2600b54600f54613fdb90919063ffffffff16565b8661290c90919063ffffffff16565b905060006131fc600f54600e5461290c90919063ffffffff16565b9050613213600b5482613fdb90919063ffffffff16565b9050600061322e600d54600c5461290c90919063ffffffff16565b90506000613257836132498487613fdb90919063ffffffff16565b61311990919063ffffffff16565b905061326e600d548261295690919063ffffffff16565b9450505050505b5b600061329f826132916127108861311990919063ffffffff16565b613fdb90919063ffffffff16565b905060006132b6828761290c90919063ffffffff16565b9050808294509450505050915091565b6000806000806132df8588613fdb90919063ffffffff16565b905060006132f68688613fdb90919063ffffffff16565b9050600061330d828461290c90919063ffffffff16565b905082818395509550955050505093509350939050565b6000806000806000613335866128b4565b9450945094509450945061339186600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061342685600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134bb84600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135088382614061565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b6000806000806000613588866128b4565b945094509450945094506135e485600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061367982600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061370e84600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061375b8382614061565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b60008060008060006137db866128b4565b9450945094509450945061383785600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138cc84600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139198382614061565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b6000806000806000613999866128b4565b945094509450945094506139f586600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613a8a85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461290c90919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b1f82600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bb484600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461295690919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c018382614061565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050505050565b60008060006006549050600066038d7ea4c68000905060005b600580549050811015613ece57826001600060058481548110613ca857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541180613d8f5750816002600060058481548110613d2757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b15613dab5760065466038d7ea4c6800094509450505050613f11565b613e346001600060058481548110613dbf57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461290c90919063ffffffff16565b9250613ebf6002600060058481548110613e4a57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361290c90919063ffffffff16565b91508080600101915050613c89565b50613eeb66038d7ea4c6800060065461311990919063ffffffff16565b821015613f085760065466038d7ea4c68000935093505050613f11565b81819350935050505b9091565b60008083118290613fc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f86578082015181840152602081019050613f6b565b50505050905090810190601f168015613fb35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613fcd57fe5b049050809150509392505050565b600080831415613fee576000905061405b565b6000828402905082848281613fff57fe5b0414614056576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141f66021913960400191505060405180910390fd5b809150505b92915050565b6140768260065461290c90919063ffffffff16565b6006819055506140918160075461295690919063ffffffff16565b600781905550505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573736d696e5f726174696f2063616e6e6f7420657863656564206d61785f726174696f5f6d696e5f6665655f726174696f2063616e6e6f7420657863656564205f6d61785f6665655f726174696f416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573736c6f7765725f626f756e645f616d6f756e742063616e6e6f7420626520626967676572207468616e2075707065725f626f756e645f616d6f756e745f75707065725f626f756e645f616d6f756e742063616e6e6f7420626520736d616c6c6572207468616e205f6c6f7765725f626f756e645f616d6f756e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735f6d61785f6665655f726174696f2063616e6e6f7420626520736d616c6c6572207468616e205f6d696e5f6665655f726174696f4578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f5f6c6f7765725f626f756e645f616d6f756e742063616e6e6f7420626520626967676572207468616e205f6c6f7765725f626f756e645f616d6f756e74a2646970667358221220f832ebf60fc359ea245e3ff6b0255fc324b9e9acfd9f21b76e7fe8cfa2551c7a64736f6c63430007000033

Deployed Bytecode Sourcemap

17652:15439:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21309:417;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18740:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19725:193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21214:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25920:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19017:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25816:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19926:446;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22217:322;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18926:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20380:300;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23382:268;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21734:475;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25704:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19120:198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17096:148;;;:::i;:::-;;24377:327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26042:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16454:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18831:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23951:411;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24721:326;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20688:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19326:199;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25065:618;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21096:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19533:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23662:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22547:333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17399:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22888:482;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21309:417;21361:14;21378:12;:10;:12::i;:::-;21361:29;;21424:11;:19;21436:6;21424:19;;;;;;;;;;;;;;;;;;;;;;;;;21423:20;21401:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21527:15;21554:19;21565:7;21554:10;:19::i;:::-;21526:47;;;;;;21602:28;21622:7;21602;:15;21610:6;21602:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;21584:7;:15;21592:6;21584:15;;;;;;;;;;;;;;;:46;;;;21651:20;21663:7;21651;;:11;;:20;;;;:::i;:::-;21641:7;:30;;;;21695:23;21710:7;21695:10;;:14;;:23;;;;:::i;:::-;21682:10;:36;;;;21309:417;;;:::o;18740:83::-;18777:13;18810:5;18803:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18740:83;:::o;19725:193::-;19827:4;19849:39;19858:12;:10;:12::i;:::-;19872:7;19881:6;19849:8;:39::i;:::-;19906:4;19899:11;;19725:193;;;;:::o;21214:87::-;21256:7;21283:10;;21276:17;;21214:87;:::o;25920:106::-;25972:7;25999:19;;25992:26;;25920:106;:::o;19017:95::-;19070:7;18131:13;19090:14;;19017:95;:::o;25816:96::-;25863:7;25890:14;;25883:21;;25816:96;:::o;19926:446::-;20058:4;20075:36;20085:6;20093:9;20104:6;20075:9;:36::i;:::-;20122:220;20145:6;20166:12;:10;:12::i;:::-;20193:138;20249:6;20193:138;;;;;;;;;;;;;;;;;:11;:19;20205:6;20193:19;;;;;;;;;;;;;;;:33;20213:12;:10;:12::i;:::-;20193:33;;;;;;;;;;;;;;;;:37;;:138;;;;;:::i;:::-;20122:8;:220::i;:::-;20360:4;20353:11;;19926:446;;;;;:::o;22217:322::-;22311:7;22369;;22358;:18;;22336:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22457:19;22479:10;:8;:10::i;:::-;22457:32;;22507:24;22519:11;22507:7;:11;;:24;;;;:::i;:::-;22500:31;;;22217:322;;;:::o;18926:83::-;18967:5;18992:9;;;;;;;;;;;18985:16;;18926:83;:::o;20380:300::-;20495:4;20517:133;20540:12;:10;:12::i;:::-;20567:7;20589:50;20628:10;20589:11;:25;20601:12;:10;:12::i;:::-;20589:25;;;;;;;;;;;;;;;:34;20615:7;20589:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;20517:8;:133::i;:::-;20668:4;20661:11;;20380:300;;;;:::o;23382:268::-;16676:12;:10;:12::i;:::-;16666:22;;:6;;;;;;;;;;:22;;;16658:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23470:1:::1;23461:5;:10;;:28;;;;;23484:5;23475;:14;;23461:28;23453:66;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23547:14;;23538:5;:23;;23530:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23637:5;23620:14;:22;;;;23382:268:::0;:::o;21734:475::-;21852:7;18131:13;21885:7;:18;;21877:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21955:17;21950:252;;21990:15;22017:19;22028:7;22017:10;:19::i;:::-;21989:47;;;;;;22058:7;22051:14;;;;;21950:252;22101:23;22134:19;22145:7;22134:10;:19::i;:::-;22098:55;;;;;;22175:15;22168:22;;;21734:475;;;;;:::o;25704:96::-;25751:7;25778:14;;25771:21;;25704:96;:::o;19120:198::-;19186:7;19210:11;:20;19222:7;19210:20;;;;;;;;;;;;;;;;;;;;;;;;;19206:49;;;19239:7;:16;19247:7;19239:16;;;;;;;;;;;;;;;;19232:23;;;;19206:49;19273:37;19293:7;:16;19301:7;19293:16;;;;;;;;;;;;;;;;19273:19;:37::i;:::-;19266:44;;19120:198;;;;:::o;17096:148::-;16676:12;:10;:12::i;:::-;16666:22;;:6;;;;;;;;;;:22;;;16658:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17203:1:::1;17166:40;;17187:6;::::0;::::1;;;;;;;;17166:40;;;;;;;;;;;;17234:1;17217:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;17096:148::o:0;24377:327::-;16676:12;:10;:12::i;:::-;16666:22;;:6;;;;;;;;;;:22;;;16658:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24472:1:::1;24462:6;:11;;:53;;;;;24496:18;;18131:13;24488:26;;;;;;24477:6;:38;;24462:53;24454:88;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24571:19;;24561:6;:29;;24553:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24690:6;24668:19;:28;;;;24377:327:::0;:::o;26042:106::-;26094:7;26121:19;;26114:26;;26042:106;:::o;16454:79::-;16492:7;16519:6;;;;;;;;;;;16512:13;;16454:79;:::o;18831:87::-;18870:13;18903:7;18896:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18831:87;:::o;23951:411::-;16676:12;:10;:12::i;:::-;16666:22;;:6;;;;;;;;;;:22;;;16658:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24063:1:::1;24050:9;:14;;:36;;;;;24081:5;24068:9;:18;;24050:36;24042:74;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24148:1;24135:9;:14;;:36;;;;;24166:5;24153:9;:18;;24135:36;24127:74;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24233:9;24220;:22;;24212:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24308:9;24291:14;:26;;;;24345:9;24328:14;:26;;;;23951:411:::0;;:::o;24721:326::-;16676:12;:10;:12::i;:::-;16666:22;;:6;;;;;;;;;;:22;;;16658:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24816:1:::1;24806:6;:11;;:53;;;;;24840:18;;18131:13;24832:26;;;;;;24821:6;:38;;24806:53;24798:88;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24928:6;24905:19;;:29;;24897:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25033:6;25011:19;:28;;;;24721:326:::0;:::o;20688:400::-;20808:4;20830:228;20853:12;:10;:12::i;:::-;20880:7;20902:145;20959:15;20902:145;;;;;;;;;;;;;;;;;:11;:25;20914:12;:10;:12::i;:::-;20902:25;;;;;;;;;;;;;;;:34;20928:7;20902:34;;;;;;;;;;;;;;;;:38;;:145;;;;;:::i;:::-;20830:8;:228::i;:::-;21076:4;21069:11;;20688:400;;;;:::o;19326:199::-;19431:4;19453:42;19463:12;:10;:12::i;:::-;19477:9;19488:6;19453:9;:42::i;:::-;19513:4;19506:11;;19326:199;;;;:::o;25065:618::-;16676:12;:10;:12::i;:::-;16666:22;;:6;;;;;;;;;;:22;;;16658:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25225:1:::1;25203:18;:23;;:82;;;;;25253:31;25265:18;;18131:13;25253:11;;:31;;;;:::i;:::-;25230:18;:55;;25203:82;25195:117;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;25353:1;25331:18;:23;;:82;;;;;25381:31;25393:18;;18131:13;25381:11;;:31;;;;:::i;:::-;25358:18;:55;;25331:82;25323:117;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;25491:18;25469;:40;;25461:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25606:18;25584:19;:40;;;;25657:18;25635:19;:40;;;;25065:618:::0;;:::o;21096:110::-;21154:4;21178:11;:20;21190:7;21178:20;;;;;;;;;;;;;;;;;;;;;;;;;21171:27;;21096:110;;;:::o;19533:184::-;19650:7;19682:11;:18;19694:5;19682:18;;;;;;;;;;;;;;;:27;19701:7;19682:27;;;;;;;;;;;;;;;;19675:34;;19533:184;;;;:::o;23662:277::-;16676:12;:10;:12::i;:::-;16666:22;;:6;;;;;;;;;;:22;;;16658:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23750:1:::1;23741:5;:10;;:28;;;;;23764:5;23755;:14;;23741:28;23733:66;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23836:5;23818:14;;:23;;23810:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23926:5;23909:14;:22;;;;23662:277:::0;:::o;22547:333::-;16676:12;:10;:12::i;:::-;16666:22;;:6;;;;;;;;;;:22;;;16658:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22629:11:::1;:20;22641:7;22629:20;;;;;;;;;;;;;;;;;;;;;;;;;22628:21;22620:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;22715:1;22696:7;:16;22704:7;22696:16;;;;;;;;;;;;;;;;:20;22692:109;;;22752:37;22772:7;:16;22780:7;22772:16;;;;;;;;;;;;;;;;22752:19;:37::i;:::-;22733:7;:16;22741:7;22733:16;;;;;;;;;;;;;;;:56;;;;22692:109;22834:4;22811:11;:20;22823:7;22811:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;22849:9;22864:7;22849:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22547:333:::0;:::o;17399:244::-;16676:12;:10;:12::i;:::-;16666:22;;:6;;;;;;;;;;:22;;;16658:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17508:1:::1;17488:22;;:8;:22;;;;17480:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17598:8;17569:38;;17590:6;::::0;::::1;;;;;;;;17569:38;;;;;;;;;;;;17627:8;17618:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;17399:244:::0;:::o;22888:482::-;16676:12;:10;:12::i;:::-;16666:22;;:6;;;;;;;;;;:22;;;16658:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22969:11:::1;:20;22981:7;22969:20;;;;;;;;;;;;;;;;;;;;;;;;;22961:64;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23041:9;23036:327;23060:9;:16;;;;23056:1;:20;23036:327;;;23118:7;23102:23;;:9;23112:1;23102:12;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;23098:254;;;23161:9;23190:1;23171:9;:16;;;;:20;23161:31;;;;;;;;;;;;;;;;;;;;;;;;;23146:9;23156:1;23146:12;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;23230:1;23211:7;:16;23219:7;23211:16;;;;;;;;;;;;;;;:20;;;;23273:5;23250:11;:20;23262:7;23250:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;23297:9;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23331:5;;23098:254;23078:3;;;;;;;23036:327;;;;22888:482:::0;:::o;642:106::-;695:15;730:10;723:17;;642:106;:::o;30187:568::-;30287:7;30309;30331;30353;30375;30411:23;30436:12;30452:20;30464:7;30452:11;:20::i;:::-;30410:62;;;;30483:19;30505:10;:8;:10::i;:::-;30483:32;;30527:15;30544:23;30569:12;30585:89;30611:7;30633:4;30652:11;30585;:89::i;:::-;30526:148;;;;;;30693:7;30702:15;30719:4;30725:15;30742:4;30685:62;;;;;;;;;;;;;;;;30187:568;;;;;;;:::o;5175:136::-;5233:7;5260:43;5264:1;5267;5260:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5253:50;;5175:136;;;;:::o;4711:181::-;4769:7;4789:9;4805:1;4801;:5;4789:17;;4830:1;4825;:6;;4817:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4883:1;4876:8;;;4711:181;;;;:::o;26164:369::-;26308:1;26291:19;;:5;:19;;;;26283:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26389:1;26370:21;;:7;:21;;;;26362:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26471:6;26441:11;:18;26453:5;26441:18;;;;;;;;;;;;;;;:27;26460:7;26441:27;;;;;;;;;;;;;;;:36;;;;26509:7;26493:32;;26502:5;26493:32;;;26518:6;26493:32;;;;;;;;;;;;;;;;;;26164:369;;;:::o;26541:965::-;26690:1;26672:20;;:6;:20;;;;26664:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26774:1;26753:23;;:9;:23;;;;26745:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26844:1;26835:6;:10;26827:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26906:11;:19;26918:6;26906:19;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;26930:11;:22;26942:9;26930:22;;;;;;;;;;;;;;;;;;;;;;;;;26929:23;26906:46;26902:597;;;26969:48;26991:6;26999:9;27010:6;26969:21;:48::i;:::-;26902:597;;;27040:11;:19;27052:6;27040:19;;;;;;;;;;;;;;;;;;;;;;;;;27039:20;:46;;;;;27063:11;:22;27075:9;27063:22;;;;;;;;;;;;;;;;;;;;;;;;;27039:46;27035:464;;;27102:46;27122:6;27130:9;27141:6;27102:19;:46::i;:::-;27035:464;;;27171:11;:19;27183:6;27171:19;;;;;;;;;;;;;;;;;;;;;;;;;27170:20;:47;;;;;27195:11;:22;27207:9;27195:22;;;;;;;;;;;;;;;;;;;;;;;;;27194:23;27170:47;27166:333;;;27234:44;27252:6;27260:9;27271:6;27234:17;:44::i;:::-;27166:333;;;27300:11;:19;27312:6;27300:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;27323:11;:22;27335:9;27323:22;;;;;;;;;;;;;;;;;;;;;;;;;27300:45;27296:203;;;27362:48;27384:6;27392:9;27403:6;27362:21;:48::i;:::-;27296:203;;;27443:44;27461:6;27469:9;27480:6;27443:17;:44::i;:::-;27296:203;27166:333;27035:464;26902:597;26541:965;;;:::o;5614:192::-;5700:7;5733:1;5728;:6;;5736:12;5720:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5760:9;5776:1;5772;:5;5760:17;;5797:1;5790:8;;;5614:192;;;;;:::o;32311:164::-;32353:7;32374:15;32391;32410:19;:17;:19::i;:::-;32373:56;;;;32447:20;32459:7;32447;:11;;:20;;;;:::i;:::-;32440:27;;;;32311:164;:::o;7012:132::-;7070:7;7097:39;7101:1;7104;7097:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7090:46;;7012:132;;;;:::o;30763:1082::-;30850:7;30859;30884:17;30930:43;30954:18;;30930:19;;:23;;:43;;;;:::i;:::-;30919:7;:54;30916:758;;31011:14;;30999:26;;30916:758;;;31066:43;31090:18;;31066:19;;:23;;:43;;;;:::i;:::-;31055:7;:54;31052:622;;31147:14;;31135:26;;31052:622;;;31212:19;31234:56;31246:43;31270:18;;31246:19;;:23;;:43;;;;:::i;:::-;31234:7;:11;;:56;;;;:::i;:::-;31212:78;;31305:23;31331:44;31355:19;;31331;;:23;;:44;;;;:::i;:::-;31305:70;;31408:39;31428:18;;31408:15;:19;;:39;;;;:::i;:::-;31390:57;;31462:22;31487:34;31506:14;;31487;;:18;;:34;;;;:::i;:::-;31462:59;;31536:16;31555:52;31591:15;31555:31;31571:14;31555:11;:15;;:31;;;;:::i;:::-;:35;;:52;;;;:::i;:::-;31536:71;;31634:28;31647:14;;31634:8;:12;;:28;;;;:::i;:::-;31622:40;;31052:622;;;;;30916:758;31694:12;31709:33;31732:9;31709:18;31721:5;31709:7;:11;;:18;;;;:::i;:::-;:22;;:33;;;;:::i;:::-;31694:48;;31753:23;31779:17;31791:4;31779:7;:11;;:17;;;;:::i;:::-;31753:43;;31815:15;31832:4;31807:30;;;;;;;30763:1082;;;:::o;31853:450::-;32023:7;32045;32067;32102:15;32120:24;32132:11;32120:7;:11;;:24;;;;:::i;:::-;32102:42;;32155:12;32170:21;32179:11;32170:4;:8;;:21;;;;:::i;:::-;32155:36;;32202:23;32228:17;32240:4;32228:7;:11;;:17;;;;:::i;:::-;32202:43;;32264:7;32273:15;32290:4;32256:39;;;;;;;;;31853:450;;;;;;;:::o;28713:616::-;28864:15;28894:23;28932:12;28959:23;28997:12;29023:19;29034:7;29023:10;:19::i;:::-;28849:193;;;;;;;;;;29071:28;29091:7;29071;:15;29079:6;29071:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;29053:7;:15;29061:6;29053:15;;;;;;;;;;;;;;;:46;;;;29128:28;29148:7;29128;:15;29136:6;29128:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;29110:7;:15;29118:6;29110:15;;;;;;;;;;;;;;;:46;;;;29188:39;29211:15;29188:7;:18;29196:9;29188:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;29167:7;:18;29175:9;29167:18;;;;;;;;;;;;;;;:60;;;;29238:23;29250:4;29256;29238:11;:23::i;:::-;29294:9;29277:44;;29286:6;29277:44;;;29305:15;29277:44;;;;;;;;;;;;;;;;;;28713:616;;;;;;;;:::o;28077:628::-;28226:15;28256:23;28294:12;28321:23;28359:12;28385:19;28396:7;28385:10;:19::i;:::-;28211:193;;;;;;;;;;28433:28;28453:7;28433;:15;28441:6;28433:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;28415:7;:15;28423:6;28415:15;;;;;;;;;;;;;;;:46;;;;28493:39;28516:15;28493:7;:18;28501:9;28493:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;28472:7;:18;28480:9;28472:18;;;;;;;;;;;;;;;:60;;;;28564:39;28587:15;28564:7;:18;28572:9;28564:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;28543:7;:18;28551:9;28543:18;;;;;;;;;;;;;;;:60;;;;28614:23;28626:4;28632;28614:11;:23::i;:::-;28670:9;28653:44;;28662:6;28653:44;;;28681:15;28653:44;;;;;;;;;;;;;;;;;;28077:628;;;;;;;;:::o;27514:555::-;27661:15;27691:23;27729:12;27756:23;27794:12;27820:19;27831:7;27820:10;:19::i;:::-;27646:193;;;;;;;;;;27868:28;27888:7;27868;:15;27876:6;27868:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;27850:7;:15;27858:6;27850:15;;;;;;;;;;;;;;;:46;;;;27928:39;27951:15;27928:7;:18;27936:9;27928:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;27907:7;:18;27915:9;27907:18;;;;;;;;;;;;;;;:60;;;;27978:23;27990:4;27996;27978:11;:23::i;:::-;28034:9;28017:44;;28026:6;28017:44;;;28045:15;28017:44;;;;;;;;;;;;;;;;;;27514:555;;;;;;;;:::o;29337:687::-;29488:15;29518:23;29556:12;29583:23;29621:12;29647:19;29658:7;29647:10;:19::i;:::-;29473:193;;;;;;;;;;29695:28;29715:7;29695;:15;29703:6;29695:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;29677:7;:15;29685:6;29677:15;;;;;;;;;;;;;;;:46;;;;29752:28;29772:7;29752;:15;29760:6;29752:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;29734:7;:15;29742:6;29734:15;;;;;;;;;;;;;;;:46;;;;29812:39;29835:15;29812:7;:18;29820:9;29812:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;29791:7;:18;29799:9;29791:18;;;;;;;;;;;;;;;:60;;;;29883:39;29906:15;29883:7;:18;29891:9;29883:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;29862:7;:18;29870:9;29862:18;;;;;;;;;;;;;;;:60;;;;29933:23;29945:4;29951;29933:11;:23::i;:::-;29989:9;29972:44;;29981:6;29972:44;;;30000:15;29972:44;;;;;;;;;;;;;;;;;;29337:687;;;;;;;;:::o;32483:605::-;32534:7;32543;32563:15;32581:7;;32563:25;;32599:15;18131:13;32599:25;;32640:9;32635:338;32659:9;:16;;;;32655:1;:20;32635:338;;;32743:7;32719;:21;32727:9;32737:1;32727:12;;;;;;;;;;;;;;;;;;;;;;;;;32719:21;;;;;;;;;;;;;;;;:31;:83;;;;32795:7;32771;:21;32779:9;32789:1;32779:12;;;;;;;;;;;;;;;;;;;;;;;;;32771:21;;;;;;;;;;;;;;;;:31;32719:83;32697:146;;;32826:7;;18131:13;32818:25;;;;;;;;;32697:146;32868:34;32880:7;:21;32888:9;32898:1;32888:12;;;;;;;;;;;;;;;;;;;;;;;;;32880:21;;;;;;;;;;;;;;;;32868:7;:11;;:34;;;;:::i;:::-;32858:44;;32927:34;32939:7;:21;32947:9;32957:1;32947:12;;;;;;;;;;;;;;;;;;;;;;;;;32939:21;;;;;;;;;;;;;;;;32927:7;:11;;:34;;;;:::i;:::-;32917:44;;32677:3;;;;;;;32635:338;;;;32997:20;18131:13;32997:7;;:11;;:20;;;;:::i;:::-;32987:7;:30;32983:61;;;33027:7;;18131:13;33019:25;;;;;;;;32983:61;33063:7;33072;33055:25;;;;;;32483:605;;;:::o;7640:278::-;7726:7;7758:1;7754;:5;7761:12;7746:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7785:9;7801:1;7797;:5;;;;;;7785:17;;7909:1;7902:8;;;7640:278;;;;;:::o;6065:471::-;6123:7;6373:1;6368;:6;6364:47;;;6398:1;6391:8;;;;6364:47;6423:9;6439:1;6435;:5;6423:17;;6468:1;6463;6459;:5;;;;;;:10;6451:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6527:1;6520:8;;;6065:471;;;;;:::o;30032:147::-;30110:17;30122:4;30110:7;;:11;;:17;;;;:::i;:::-;30100:7;:27;;;;30151:20;30166:4;30151:10;;:14;;:20;;;;:::i;:::-;30138:10;:33;;;;30032:147;;:::o

Swarm Source

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

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