Token Phenix Finance

DeFi  

Overview CRC20

Price
$0.00 @ 0.000000 CRO
Fully Diluted Market Cap
Total Supply:
2,734,758,281.032545 PHNX

Holders:
6,617 addresses

Transfers:
-

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

OVERVIEW

The Phenix Finance token at a base offers an extremely easy reward system via their token mechanism.


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

Contract Source Code Verified (Exact Match)

Contract Name:
PhenixFinance

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-11
*/

// File: contracts/InterfaceLP.sol

pragma solidity ^0.7.4;


interface InterfaceLP {
    function sync() external;
}

// File: contracts/SafeMathInt.sol

pragma solidity ^0.7.4;


library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != -1 || a != MIN_INT256);

        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }
}

// File: contracts/SafeMath.sol

pragma solidity ^0.7.4;


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

        return c;
    }

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

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

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

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

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: contracts/Ownable.sol

pragma solidity ^0.7.4;


contract Ownable {
    address private _owner;

    event OwnershipRenounced(address indexed previousOwner);

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

    constructor() {
        _owner = msg.sender;
    }

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

    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipRenounced(_owner);
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/IVVSRouter01.sol

pragma solidity ^0.7.4;


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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

// File: contracts/IVVSRouter.sol

pragma solidity ^0.7.4;



interface IVVSRouter is IVVSRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

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

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

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

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

// File: contracts/IVVSFactory.sol

pragma solidity ^0.7.4;


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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// File: contracts/IERC20.sol

pragma solidity ^0.7.4;


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

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

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

    function transfer(address to, uint256 value) external returns (bool);

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

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: contracts/ERC20Detailed.sol

pragma solidity ^0.7.4;



abstract contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor(
        string memory name,
        string memory symbol,
        uint8 decimals
    ) {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

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

// File: contracts/Phenix.sol

pragma solidity ^0.7.4;










contract PhenixFinance is ERC20Detailed, Ownable {
    using SafeMath for uint256;
    using SafeMathInt for int256;

    event Rebase(uint256 indexed totalSupply);

    address[] public pairAddresses;
    address public liquidityReceiver;
    address public phenixFundReserveReceiver;
    bool public initialDistributionFinished;

    mapping(address => bool) _allowTransfer;
    mapping(address => bool) _isFeeExempt;

    uint256 private constant FXP_BASE = 1000000;
    uint256 private constant DECIMALS = 18;
    uint256 private constant MAX_UINT256 = ~uint256(0);
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address private constant ZERO = 0x0000000000000000000000000000000000000000;
    uint256 private constant REBASE_INTERVAL = 86400;
    uint256 private constant INITIAL_FRAGMENTS_SUPPLY =
        300 * 10**6 * 10**DECIMALS;

    uint256 public liquidityFee = 2;
    uint256 public phenixVaultFee = 8;
    uint256 public sellFee = 15;
    uint256 public totalFee = liquidityFee.add(phenixVaultFee);
    uint256 public feeDenominator = 100;

    uint256 public lastRebaseTimestamp = block.timestamp;
    uint256 public lastRebaseDelta = 0;
    uint256 public rebasePercentDelta = (18 * FXP_BASE) / 1000;

    bool public rebaseRX3Enabled = true;
    uint256 public rebaseRX3Multiplier = FXP_BASE;
    uint256 public rebaseMaxRX3Multiplier = FXP_BASE + FXP_BASE / 2;
    uint256 public rebaseRX3MultiplierStep = (1 * FXP_BASE) / 1000;

    IVVSRouter public router;
    bool public swapEnabled = true;
    uint256 private gonSwapThreshold = (TOTAL_GONS * 10) / 10000;
    bool inSwap;

    uint256 private constant TOTAL_GONS =
        MAX_UINT256 - (MAX_UINT256 % INITIAL_FRAGMENTS_SUPPLY);
    uint256 private constant MAX_SUPPLY = ~uint128(0);
    uint256 private _totalSupply;
    uint256 private _gonsPerFragment;
    mapping(address => uint256) private _gonBalances;
    mapping(address => mapping(address => uint256)) private _allowedFragments;
    mapping(address => bool) public taxableAddress;
    mapping(address => bool) public authorizedRebaseAddress;

    constructor() ERC20Detailed("Phenix Finance", "PHNX", uint8(DECIMALS)) {
        router = IVVSRouter(0x145677FC4d9b8F19B5D56d1820c48e0443049a30);

        address _pairAddress = address(
            IVVSFactory(router.factory()).createPair(
                router.WETH(),
                address(this)
            )
        );

        liquidityReceiver = address(msg.sender);
        phenixFundReserveReceiver = address(msg.sender);

        _allowedFragments[address(this)][address(router)] = uint256(-1);

        _totalSupply = INITIAL_FRAGMENTS_SUPPLY;
        _gonBalances[address(msg.sender)] = TOTAL_GONS;
        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);

        _isFeeExempt[address(phenixFundReserveReceiver)] = true;
        _isFeeExempt[address(this)] = true;
        _isFeeExempt[address(msg.sender)] = true;

        taxableAddress[_pairAddress] = true;
        pairAddresses.push(_pairAddress);
        authorizedRebaseAddress[address(msg.sender)] = true;

        emit Transfer(address(0x0), address(msg.sender), _totalSupply);
    }

    /**
     * @dev Swapping switch used to mitigate any calculation
     * issues during swapBack.
     */
    modifier noReentrancy() {
        inSwap = true;
        _;
        inSwap = false;
    }

    modifier initialDistributionLock() {
        require(
            initialDistributionFinished ||
                isOwner() ||
                _allowTransfer[msg.sender],
            "Initial distirbution not finalized."
        );
        _;
    }

    modifier validRecipient(address to) {
        require(to != address(0x0));
        _;
    }

    /**
     * @dev Returns the delta of the next rebase.
     * @return next rebase delta as uint256 value.
     */
    function getNextRebase(uint256 _timestamp) public view returns (uint256) {
        uint256 rebaseTimestampDelta = _timestamp - lastRebaseTimestamp;

        uint256 nextScaledRebaseIntervalPercentage = rebaseTimestampDelta
            .mul(FXP_BASE)
            .div(REBASE_INTERVAL);

        uint256 nextRebaseDelta = _totalSupply
            .mul(rebasePercentDelta)
            .div(FXP_BASE)
            .mul(nextScaledRebaseIntervalPercentage)
            .div(FXP_BASE);

        if (rebaseRX3Enabled == true) {
            nextRebaseDelta = nextRebaseDelta
                .mul(
                    rebaseRX3Multiplier < rebaseMaxRX3Multiplier
                        ? rebaseRX3Multiplier
                        : rebaseMaxRX3Multiplier
                )
                .div(FXP_BASE);
        }

        return nextRebaseDelta;
    }

    /**
     * @dev Rebases total token supply based on the getNextRebase()
     * return result. Rebase is capped when MAX_SUPPLY is reached.
     */
    function _rebase() internal {
        uint256 supplyDelta = getNextRebase(block.timestamp);
        _totalSupply = _totalSupply.add(uint256(supplyDelta));

        if (_totalSupply > MAX_SUPPLY) {
            _totalSupply = MAX_SUPPLY;
        }

        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);

        lastRebaseDelta = supplyDelta;
        lastRebaseTimestamp = block.timestamp;
        rebaseRX3Multiplier = FXP_BASE;

        emit Rebase(_totalSupply);
    }

    /**
     * @dev Executes the internal _rebase() function and then
     * performs the sync() call on all applicable pairAddresses
     */
    function rebaseAndSync() external {
        require(
            authorizedRebaseAddress[msg.sender] == true,
            "Not authroized to execute rebase"
        );

        _rebase();

        for (uint256 i = 0; i < pairAddresses.length; i++) {
            if (taxableAddress[pairAddresses[i]] == true) {
                InterfaceLP(pairAddresses[i]).sync();
            }
        }
    }

    /**
     * @dev Sets the last rebase time to the current block
     * timestamp as means to reset the value.
     */
    function resetLastRebaseTimestamp() external {
        require(
            authorizedRebaseAddress[msg.sender] == true,
            "Not authroized to execute this function."
        );

        lastRebaseTimestamp = block.timestamp;
    }

    /**
     * @dev Returns total token supply. Overrides ERC-20
     * totalSupply() function to return elastic supply.
     */
    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev Transfers amount tokens to an address.
     * @param to Receiver of the transfered tokens.
     * @param value Amount of tokens that are received.
     * @return true
     */
    function transfer(address to, uint256 value)
        external
        override
        validRecipient(to)
        initialDistributionLock
        returns (bool)
    {
        _transferFrom(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Adds LP contract address and removes
     * fees from the given address. Added pair contract tested
     * sync() before adding to see if it is a pair address.
     * Addition will fail if sync() fails.
     * @param _address Update LP contract address.
     */
    function addLPAddress(address _address) external onlyOwner {
        InterfaceLP(_address).sync();

        for (uint256 i = 0; i < pairAddresses.length; i++) {
            require(pairAddresses[i] != _address, "Pair address already added");
        }

        pairAddresses.push(_address);
        taxableAddress[_address] = true;
    }

    /**
     * @dev Returns array of all LP Addresses
     * @return address[] Array of LP Addresses.
     **/
    function getLPAddresses() external view returns (address[] memory) {
        return pairAddresses;
    }

    /**
     * @dev Updates given address' taxable status.
     * @param _address Subject address of taxable state adjustment.
     * @param _status State if address should be taxed.
     */
    function setTaxableAddress(address _address, bool _status)
        external
        onlyOwner
    {
        taxableAddress[_address] = _status;
    }

    /**
     * @dev Updates given address' Authorized Rebase status.
     * @param _address Subject address of Authorized Rebase state adjustment.
     * @param _status State if address should be allowed call rebaseAndSync().
     */
    function setAuthorizedRebaseAddress(address _address, bool _status)
        external
        onlyOwner
    {
        authorizedRebaseAddress[_address] = _status;
    }

    /**
     * @dev Returns spender alloance of an owner address.
     * Overides ERC-20 allowance(address, address) function
     * to return allowed fragments.
     * @param owner Owner address of tokens.
     * @param spender Spender address of tokens.
     * @return uint256 Amount of allowed tokens for the spender to use.
     */
    function allowance(address owner, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowedFragments[owner][spender];
    }

    /**
     * @dev Returns balance of given address. Overrides
     * ERC-20 balanceOf(address) to provide balance based
     * on holder gons and gonsPerFragment.
     * @param who Balance of address.
     * @return uint256 value of address balance.
     */
    function balanceOf(address who) external view override returns (uint256) {
        return _gonBalances[who].div(_gonsPerFragment);
    }

    /**
     * @dev Performs basic token transfer. Used as
     * internal function in _transferFrom(address,
     * address, uint256) function.
     * @param from sender address of transfer.
     * @param to receiver adddress of transfer.
     * @param amount amount of tokens for receiver.
     * @return true.
     */
    function _basicTransfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        uint256 gonAmount = amount.mul(_gonsPerFragment);
        _gonBalances[from] = _gonBalances[from].sub(gonAmount);
        _gonBalances[to] = _gonBalances[to].add(gonAmount);
        return true;
    }

    /**
     * @dev Transfers token from sender address
     * to receiver address. Performs token supply
     * rebase provided it is acceptable. Executes
     * _baseTransfer(address, address, uint256) if
     * swap is in progress.
     * @param sender sender address of transfer.
     * @param to receiver adddress of transfer.
     * @param amount amount of tokens for receiver.
     * @return true.
     */
    function _transferFrom(
        address sender,
        address to,
        uint256 amount
    ) internal returns (bool) {
        if (inSwap) {
            return _basicTransfer(sender, to, amount);
        }

        uint256 gonAmount = amount.mul(_gonsPerFragment);

        if (_shouldSwapBack()) {
            _swapBack();
        }

        if (rebaseRX3Enabled == true) {
            rebaseRX3Multiplier = rebaseRX3Multiplier.add(
                rebaseRX3MultiplierStep
            );
        }

        _gonBalances[sender] = _gonBalances[sender].sub(gonAmount);

        uint256 gonAmountReceived = _shouldTakeFee(sender, to)
            ? _takeFee(sender, to, gonAmount)
            : gonAmount;
        _gonBalances[to] = _gonBalances[to].add(gonAmountReceived);

        emit Transfer(sender, to, gonAmountReceived.div(_gonsPerFragment));

        return true;
    }

    /**
     * @dev Transfers token from sender address
     * to receiver address. Overrides ERC-20
     * transferFrom(address, address, uint256) to
     * check value of allowed fragments that sender
     * can access from the owner (from address).
     * @param from sender address of transfer.
     * @param to receiver adddress of transfer.
     * @param value amount of tokens for receiver.
     * @return true.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external override validRecipient(to) returns (bool) {
        if (_allowedFragments[from][msg.sender] != uint256(-1)) {
            _allowedFragments[from][msg.sender] = _allowedFragments[from][
                msg.sender
            ].sub(value, "Insufficient Allowance");
        }

        _transferFrom(from, to, value);
        return true;
    }

    /**
     * @dev Executes fee allocations and distributes tokens
     * to contract address, phenix vault receiver address, and
     * liquidity receiver address.
     */
    function _swapBack() internal noReentrancy {
        uint256 contractTokenBalance = _gonBalances[address(this)].div(
            _gonsPerFragment
        );
        uint256 amountToLiquify = contractTokenBalance
            .mul(liquidityFee)
            .div(totalFee)
            .div(2);
        uint256 amountToSwap = contractTokenBalance.sub(amountToLiquify);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        uint256 balanceBefore = address(this).balance;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountETH = address(this).balance.sub(balanceBefore);
        uint256 totalETHFee = totalFee.sub(liquidityFee.div(2));

        uint256 amountETHLiquidity = amountETH
            .mul(liquidityFee)
            .div(totalETHFee)
            .div(2);

        if (amountToLiquify > 0) {
            router.addLiquidityETH{value: amountETHLiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                liquidityReceiver,
                block.timestamp
            );
        }

        (bool success, ) = payable(phenixFundReserveReceiver).call{
            value: address(this).balance
        }("");
    }

    /**
     * @dev Calculates swap fee and returns new allocation
     * of swap based on swap conditions. Calculate is based
     * on liquidity fee and phenix vault fee. Sell fee will also
     * be taken into consideration if receiver is pair address.
     * @return uint256 gonAmount that is transfered in the swap.
     */
    function _takeFee(
        address sender,
        address to,
        uint256 gonAmount
    ) internal returns (uint256) {
        uint256 _totalFee = totalFee;
        if (taxableAddress[to] == true) _totalFee = _totalFee.add(sellFee);

        uint256 feeAmount = gonAmount.mul(_totalFee).div(feeDenominator);

        _gonBalances[address(this)] = _gonBalances[address(this)].add(
            feeAmount
        );
        emit Transfer(sender, address(this), feeAmount.div(_gonsPerFragment));

        return gonAmount.sub(feeAmount);
    }

    /**
     * @dev Decreases spender allowance of sender address.
     * @param spender Spender address.
     * @param subtractedValue Amount to reduce spender allowance by.
     * @return bool
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        initialDistributionLock
        returns (bool)
    {
        uint256 oldValue = _allowedFragments[msg.sender][spender];
        if (subtractedValue >= oldValue) {
            _allowedFragments[msg.sender][spender] = 0;
        } else {
            _allowedFragments[msg.sender][spender] = oldValue.sub(
                subtractedValue
            );
        }
        emit Approval(
            msg.sender,
            spender,
            _allowedFragments[msg.sender][spender]
        );
        return true;
    }

    /**
     * @dev Updates router address
     * @param _address address to set for the dex router
     */
    function updateRouter(address _address) external onlyOwner {
        require(address(router) != _address, "Router address already set");
        router = IVVSRouter(_address);
    }

    /**
     * @dev Increases spender allowance of sender address.
     * @param spender Spender address.
     * @param addedValue Amount to increase spender allowance by.
     * @return bool
     */
    function increaseAllowance(address spender, uint256 addedValue)
        external
        initialDistributionLock
        returns (bool)
    {
        _allowedFragments[msg.sender][spender] = _allowedFragments[msg.sender][
            spender
        ].add(addedValue);
        emit Approval(
            msg.sender,
            spender,
            _allowedFragments[msg.sender][spender]
        );
        return true;
    }

    /**
     * @dev Approves spender address to use sender tokens.
     * @param spender Spender address.
     * @param value Amount of tokens spender can access.
     * @return bool
     */
    function approve(address spender, uint256 value)
        external
        override
        initialDistributionLock
        returns (bool)
    {
        _allowedFragments[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Checks if given address is exempt from swap fees.
     * @param _addr Address to check current exemption status.
     * @return bool
     */
    function checkFeeExempt(address _addr) external view returns (bool) {
        return _isFeeExempt[_addr];
    }

    /**
     * @dev Unlocks tokens and sets initialDistributedFinished
     * to true. Only callable from owner address.
     */
    function setInitialDistributionFinished() external onlyOwner {
        initialDistributionFinished = true;
    }

    /**
     * @dev Enables transfers for a specific address.
     * Only callable from owner address.
     * @param _addr Address to enable transfers.
     */
    function enableTransfer(address _addr) external onlyOwner {
        _allowTransfer[_addr] = true;
    }

    /**
     * @dev Sets given address to have exceptions from
     * swap fees. Only callable from owner address.
     * @param _addr Address to set fee exemptions.
     */
    function setFeeExempt(address _addr) external onlyOwner {
        _isFeeExempt[_addr] = true;
    }

    /**
     * @dev Checks if a sender (from) and receiver
     * (to) need swap fees applied in transfer. Used
     * in _transferFrom(address, address, uint256) internal
     * function. Should only apply when user is interacting with
     * the pair (to or from)
     * @param from Sender address of swap
     * @param to Receiver address of swap.
     * @return bool True if fees apply on transfer.
     */
    function _shouldTakeFee(address from, address to)
        internal
        view
        returns (bool)
    {
        return
            (taxableAddress[from] || taxableAddress[to]) &&
            (!_isFeeExempt[from] && !_isFeeExempt[to]);
    }

    /**
     * @dev Updates swap back settings.
     * @param _enabled bool value to determine of swap back is enabled.
     * @param _num uint256 value for the swap back threshhold
     * @param _denom uint256 value used for the threshold deminator
     */
    function setSwapBackSettings(
        bool _enabled,
        uint256 _num,
        uint256 _denom
    ) external onlyOwner {
        swapEnabled = _enabled;
        gonSwapThreshold = TOTAL_GONS.div(_denom).mul(_num);
    }

    /**
     * @dev Updates RX3 Rebase settings.
     * @param _enabled bool value to determine of RX3 Protocol is enabled.
     * @param _rebaseMaxRX3Multiplier uint256 value for the max RX3 Multiplier
     * @param _rebaseRX3MultiplierStep uint256 value used for the RX3 Multiplier Step
     */
    function setRX3Settings(
        bool _enabled,
        uint256 _rebaseMaxRX3Multiplier,
        uint256 _rebaseRX3MultiplierStep
    ) external onlyOwner {
        rebaseRX3Enabled = _enabled;
        rebaseMaxRX3Multiplier = _rebaseMaxRX3Multiplier;
        rebaseRX3MultiplierStep = _rebaseRX3MultiplierStep;
    }

    /**
     * @dev Configures Rebase settings. Sets
     * RebasePercentDelta, and Accuracy.
     * @param _percentage value of rebase percent delta based on a daily interval (18)
     * @param _accuracy defines the value of the rebase delta percentage demoninator (1000)
     */
    function setRebaseSettings(uint256 _percentage, uint256 _accuracy)
        external
        onlyOwner
    {
        rebasePercentDelta = (_percentage * FXP_BASE) / _accuracy;
    }

    /**
     * @dev Check whether the a swap back can be performed.
     * @return bool, true if swapBack is allowed to execute.
     */
    function _shouldSwapBack() internal view returns (bool) {
        return
            taxableAddress[msg.sender] == false &&
            !inSwap &&
            swapEnabled &&
            _gonBalances[address(this)] >= gonSwapThreshold;
    }

    /**
     * @dev Returns current circulating token supply
     * @return uint256, value of total circulating supply.
     */
    function getCirculatingSupply() public view returns (uint256) {
        return
            (TOTAL_GONS.sub(_gonBalances[DEAD]).sub(_gonBalances[ZERO])).div(
                _gonsPerFragment
            );
    }

    function isNotInSwap() external view returns (bool) {
        return !inSwap;
    }

    function checkSwapThreshold() external view returns (uint256) {
        return gonSwapThreshold.div(_gonsPerFragment);
    }

    function setFeeReceivers(
        address _liquidityReceiver,
        address _phenixFundReserveReceiver
    ) external onlyOwner {
        liquidityReceiver = _liquidityReceiver;
        phenixFundReserveReceiver = _phenixFundReserveReceiver;
    }

    function setFees(
        uint256 _liquidityFee,
        uint256 _phenixVaultFee,
        uint256 _sellFee,
        uint256 _feeDenominator
    ) external onlyOwner {
        liquidityFee = _liquidityFee;
        phenixVaultFee = _phenixVaultFee;
        sellFee = _sellFee;
        totalFee = liquidityFee.add(phenixVaultFee);
        feeDenominator = _feeDenominator;
        require(totalFee < feeDenominator / 4);
    }

    function emergencyRecoverETH() external onlyOwner {
        require(address(this).balance > 0, "No ETH to recover.");
        (bool success, ) = address(msg.sender).call{
            value: address(this).balance
        }("");
        require(success, "Failed to recover ETH.");
    }

    function emergencyRecoverToken(address _tokenAddress) external onlyOwner {
        require(
            IERC20(_tokenAddress).balanceOf(address(this)) > 0,
            "No tokens to recover."
        );
        IERC20(_tokenAddress).transfer(
            msg.sender,
            IERC20(_tokenAddress).balanceOf(address(this))
        );
    }

    receive() external payable {}
}

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"}],"name":"OwnershipRenounced","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":"uint256","name":"totalSupply","type":"uint256"}],"name":"Rebase","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":"_address","type":"address"}],"name":"addLPAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedRebaseAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"checkFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkSwapThreshold","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":[],"name":"emergencyRecoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"emergencyRecoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"enableTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getNextRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialDistributionFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isNotInSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebaseDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebaseTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"","type":"uint256"}],"name":"pairAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phenixFundReserveReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phenixVaultFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseAndSync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebaseMaxRX3Multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebasePercentDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseRX3Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseRX3Multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebaseRX3MultiplierStep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetLastRebaseTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IVVSRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAuthorizedRebaseAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityReceiver","type":"address"},{"internalType":"address","name":"_phenixFundReserveReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_phenixVaultFee","type":"uint256"},{"internalType":"uint256","name":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_feeDenominator","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setInitialDistributionFinished","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_rebaseMaxRX3Multiplier","type":"uint256"},{"internalType":"uint256","name":"_rebaseRX3MultiplierStep","type":"uint256"}],"name":"setRX3Settings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"},{"internalType":"uint256","name":"_accuracy","type":"uint256"}],"name":"setRebaseSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"uint256","name":"_denom","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setTaxableAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxableAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","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":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260026008556008600955600f600a55620000316009546008546200045460201b62001e6e1790919060201c565b600b556064600c5542600d556000600e55614650600f556010805460ff19166001179055620f42406011556216e3606012556103e86013556014805460ff60a01b1916600160a01b1790557e068db8bac710cb295e9e1b089a027525460aa64c2f60beb15a6764b6a2339c601555348015620000ac57600080fd5b50604080518082018252600e81526d5068656e69782046696e616e636560901b6020808301918252835180850190945260048452630a0909cb60e31b908401528151919291601291620001039160009190620005a7565b50815162000119906001906020850190620005a7565b506002805460ff191660ff9290921691909117610100600160a81b031916610100330217905550506014805473145677fc4d9b8f19b5d56d1820c48e0443049a306001600160a01b031990911617908190556040805163c45a015560e01b815290516000926001600160a01b03169163c45a0155916004808301926020929190829003018186803b158015620001ae57600080fd5b505afa158015620001c3573d6000803e3d6000fd5b505050506040513d6020811015620001da57600080fd5b5051601454604080516315ab88c960e31b815290516001600160a01b039384169363c9c6539693169163ad5c4648916004808301926020929190829003018186803b1580156200022957600080fd5b505afa1580156200023e573d6000803e3d6000fd5b505050506040513d60208110156200025557600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301525160448083019260209291908290030181600087803b158015620002a557600080fd5b505af1158015620002ba573d6000803e3d6000fd5b505050506040513d6020811015620002d157600080fd5b505160048054336001600160a01b031991821681179092556005805490911682179055306000908152601a602090815260408083206014546001600160a01b03168452825280832060001990556af8277896582678ac0000006017908155938352601982529091206a87b0b4d075b8302fffffff19908190559154929350620003649290620004b6811b62001ecf17901c565b6018556005546001600160a01b0390811660009081526007602090815260408083208054600160ff1991821681179092553085528285208054821683179055338086528386208054831684179055958716808652601b85528386208054831684179055600380548085019091557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319169091179055858552601c845282852080549091169091179055601754815190815290517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35062000653565b600082820183811015620004af576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000620004af83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200050060201b60201c565b60008183620005905760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620005545781810151838201526020016200053a565b50505050905090810190601f168015620005825780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200059d57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620005df57600085556200062a565b82601f10620005fa57805160ff19168380011785556200062a565b828001600101855582156200062a579182015b828111156200062a5782518255916020019190600101906200060d565b50620006389291506200063c565b5090565b5b808211156200063857600081556001016200063d565b61298280620006636000396000f3fe60806040526004361061037a5760003560e01c8063784d20b1116101d1578063b065406911610102578063d1fce264116100a0578063dd62ed3e1161006f578063dd62ed3e14610bd9578063f2fde38b14610c14578063f887ea4014610c47578063fff4348114610c5c57610381565b8063d1fce26414610b2b578063d439979014610b40578063d5938aac14610b73578063d780d4dc14610ba657610381565b8063bdb938e2116100dc578063bdb938e214610a70578063c851cc3214610aab578063c939a4f614610ade578063d088935814610af357610381565b8063b065406914610a1c578063b86a2fd714610a31578063bd94c8dd14610a4657610381565b806399e3b3bd1161016f578063a8688e2a11610149578063a8688e2a14610986578063a9059cbb146109b9578063a92558d0146109f2578063ab92c3f214610a0757610381565b806399e3b3bd146108fd578063a457c2d714610912578063a4b45c001461094b57610381565b80638da5cb5b116101ab5780638da5cb5b146108a95780638f32d59b146108be57806395d89b41146108d357806398118cb4146108e857610381565b8063784d20b11461083157806383b4ac681461086457806389e9616e1461087957610381565b80632d517fdc116102ab578063530ddf64116102495780636fcba377116102235780636fcba3771461077a57806370a08231146107b6578063715018a6146107e9578063749796a5146107fe57610381565b8063530ddf641461073b5780636d351d1a146107505780636ddd17131461076557610381565b8063395093511161028557806339509351146106735780634513e7d0146106ac5780634bfed05c146106c15780634c50855d146106d657610381565b80632d517fdc146105fb578063313ce567146106105780633751ed741461063b57610381565b806323b872dd116103185780632b112e49116102f25780632b112e49146105a75780632b14ca56146105bc5780632b28af1b146105d15780632be6937d146105e657610381565b806323b872dd146104f8578063264d26dd1461053b5780632abf77f51461056c57610381565b8063180b0d7e11610354578063180b0d7e1461049257806318160ddd146104b9578063186e2d77146104ce5780631df4ccfc146104e357610381565b806306fdde031461038657806307f594a314610410578063095ea7b31461044557610381565b3661038157005b600080fd5b34801561039257600080fd5b5061039b610c86565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d55781810151838201526020016103bd565b50505050905090810190601f1680156104025780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041c57600080fd5b506104436004803603602081101561043357600080fd5b50356001600160a01b0316610d1c565b005b34801561045157600080fd5b5061047e6004803603604081101561046857600080fd5b506001600160a01b038135169060200135610ef9565b604080519115158252519081900360200190f35b34801561049e57600080fd5b506104a7610fd4565b60408051918252519081900360200190f35b3480156104c557600080fd5b506104a7610fda565b3480156104da57600080fd5b50610443610fe0565b3480156104ef57600080fd5b506104a76110d4565b34801561050457600080fd5b5061047e6004803603606081101561051b57600080fd5b506001600160a01b038135811691602081013590911690604001356110da565b34801561054757600080fd5b506105506111b4565b604080516001600160a01b039092168252519081900360200190f35b34801561057857600080fd5b506104436004803603604081101561058f57600080fd5b506001600160a01b03813516906020013515156111c3565b3480156105b357600080fd5b506104a76111ff565b3480156105c857600080fd5b506104a7611288565b3480156105dd57600080fd5b506104a761128e565b3480156105f257600080fd5b50610443611294565b34801561060757600080fd5b506104a76112ba565b34801561061c57600080fd5b506106256112c0565b6040805160ff9092168252519081900360200190f35b34801561064757600080fd5b506104436004803603606081101561065e57600080fd5b508035151590602081013590604001356112c9565b34801561067f57600080fd5b5061047e6004803603604081101561069657600080fd5b506001600160a01b0381351690602001356112f4565b3480156106b857600080fd5b506104436113fa565b3480156106cd57600080fd5b506104a7611453565b3480156106e257600080fd5b506106eb611459565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561072757818101518382015260200161070f565b505050509050019250505060405180910390f35b34801561074757600080fd5b506104436114ba565b34801561075c57600080fd5b506104a76115f4565b34801561077157600080fd5b5061047e61160d565b34801561078657600080fd5b506104436004803603608081101561079d57600080fd5b508035906020810135906040810135906060013561161d565b3480156107c257600080fd5b506104a7600480360360208110156107d957600080fd5b50356001600160a01b0316611666565b3480156107f557600080fd5b5061044361168e565b34801561080a57600080fd5b506104436004803603602081101561082157600080fd5b50356001600160a01b03166116ee565b34801561083d57600080fd5b5061047e6004803603602081101561085457600080fd5b50356001600160a01b0316611723565b34801561087057600080fd5b5061047e611738565b34801561088557600080fd5b506104436004803603604081101561089c57600080fd5b5080359060200135611742565b3480156108b557600080fd5b50610550611769565b3480156108ca57600080fd5b5061047e61177d565b3480156108df57600080fd5b5061039b611793565b3480156108f457600080fd5b506104a76117f3565b34801561090957600080fd5b506105506117f9565b34801561091e57600080fd5b5061047e6004803603604081101561093557600080fd5b506001600160a01b038135169060200135611808565b34801561095757600080fd5b506104436004803603604081101561096e57600080fd5b506001600160a01b0381358116916020013516611964565b34801561099257600080fd5b50610443600480360360208110156109a957600080fd5b50356001600160a01b03166119a3565b3480156109c557600080fd5b5061047e600480360360408110156109dc57600080fd5b506001600160a01b038135169060200135611b03565b3480156109fe57600080fd5b506104a7611b9f565b348015610a1357600080fd5b506104a7611ba5565b348015610a2857600080fd5b506104a7611bab565b348015610a3d57600080fd5b506104a7611bb1565b348015610a5257600080fd5b506104a760048036036020811015610a6957600080fd5b5035611bb7565b348015610a7c57600080fd5b5061044360048036036040811015610a9357600080fd5b506001600160a01b0381351690602001351515611c4d565b348015610ab757600080fd5b5061044360048036036020811015610ace57600080fd5b50356001600160a01b0316611c89565b348015610aea57600080fd5b5061047e611d1f565b348015610aff57600080fd5b5061044360048036036060811015610b1657600080fd5b50803515159060208101359060400135611d28565b348015610b3757600080fd5b5061047e611d78565b348015610b4c57600080fd5b5061047e60048036036020811015610b6357600080fd5b50356001600160a01b0316611d88565b348015610b7f57600080fd5b5061044360048036036020811015610b9657600080fd5b50356001600160a01b0316611da6565b348015610bb257600080fd5b5061047e60048036036020811015610bc957600080fd5b50356001600160a01b0316611ddb565b348015610be557600080fd5b506104a760048036036040811015610bfc57600080fd5b506001600160a01b0381358116916020013516611df0565b348015610c2057600080fd5b5061044360048036036020811015610c3757600080fd5b50356001600160a01b0316611e1b565b348015610c5357600080fd5b50610550611e35565b348015610c6857600080fd5b5061055060048036036020811015610c7f57600080fd5b5035611e44565b60008054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d125780601f10610ce757610100808354040283529160200191610d12565b820191906000526020600020905b815481529060010190602001808311610cf557829003601f168201915b5050505050905090565b610d2461177d565b610d2d57600080fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610d7c57600080fd5b505afa158015610d90573d6000803e3d6000fd5b505050506040513d6020811015610da657600080fd5b505111610df2576040805162461bcd60e51b81526020600482015260156024820152742737903a37b5b2b739903a37903932b1b7bb32b91760591b604482015290519081900360640190fd5b806001600160a01b031663a9059cbb33836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e4f57600080fd5b505afa158015610e63573d6000803e3d6000fd5b505050506040513d6020811015610e7957600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610eca57600080fd5b505af1158015610ede573d6000803e3d6000fd5b505050506040513d6020811015610ef457600080fd5b505050565b600554600090600160a01b900460ff1680610f175750610f1761177d565b80610f3157503360009081526006602052604090205460ff165b610f6c5760405162461bcd60e51b81526004018080602001828103825260238152602001806129026023913960400191505060405180910390fd5b336000818152601a602090815260408083206001600160a01b03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b600c5481565b60175490565b610fe861177d565b610ff157600080fd5b6000471161103b576040805162461bcd60e51b815260206004820152601260248201527127379022aa24103a37903932b1b7bb32b91760711b604482015290519081900360640190fd5b604051600090339047908381818185875af1925050503d806000811461107d576040519150601f19603f3d011682016040523d82523d6000602084013e611082565b606091505b50509050806110d1576040805162461bcd60e51b81526020600482015260166024820152752330b4b632b2103a37903932b1b7bb32b91022aa241760511b604482015290519081900360640190fd5b50565b600b5481565b6000826001600160a01b0381166110f057600080fd5b6001600160a01b0385166000908152601a602090815260408083203384529091529020546000191461119d576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0388166000908152601a82528381203382529091529190912054611178918590611f11565b6001600160a01b0386166000908152601a602090815260408083203384529091529020555b6111a8858585611fa8565b50600195945050505050565b6004546001600160a01b031681565b6111cb61177d565b6111d457600080fd5b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b60185460196020527fd2ac945fcc0096878c763e37d6929b78378c1a2defabde8ba7ee5ed1d6e7a5b25461dead60009081527fc73b1d6eda13a615b81c31830292dbbbf5fbb07f472982e223002bd83d5c3dc454909261128392909161127d9190611277906a87b0b4d075b8302fffffff199061210b565b9061210b565b90611ecf565b905090565b600a5481565b600e5481565b61129c61177d565b6112a557600080fd5b6005805460ff60a01b1916600160a01b179055565b60115481565b60025460ff1690565b6112d161177d565b6112da57600080fd5b6010805460ff191693151593909317909255601255601355565b600554600090600160a01b900460ff1680611312575061131261177d565b8061132c57503360009081526006602052604090205460ff165b6113675760405162461bcd60e51b81526004018080602001828103825260238152602001806129026023913960400191505060405180910390fd5b336000908152601a602090815260408083206001600160a01b03871684529091529020546113959083611e6e565b336000818152601a602090815260408083206001600160a01b0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b336000908152601c602052604090205460ff16151560011461144d5760405162461bcd60e51b81526004018080602001828103825260288152602001806129256028913960400191505060405180910390fd5b42600d55565b600f5481565b60606003805480602002602001604051908101604052809291908181526020018280548015610d1257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611493575050505050905090565b336000908152601c602052604090205460ff161515600114611523576040805162461bcd60e51b815260206004820181905260248201527f4e6f742061757468726f697a656420746f206578656375746520726562617365604482015290519081900360640190fd5b61152b61214d565b60005b6003548110156110d157601b60006003838154811061154957fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff161515600114156115ec576003818154811061158857fe5b60009182526020822001546040805160016209351760e01b0319815290516001600160a01b039092169263fff6cae99260048084019382900301818387803b1580156115d357600080fd5b505af11580156115e7573d6000803e3d6000fd5b505050505b60010161152e565b6000611283601854601554611ecf90919063ffffffff16565b601454600160a01b900460ff1681565b61162561177d565b61162e57600080fd5b60088490556009839055600a8290556116478484611e6e565b600b55600c81905560048104600b541061166057600080fd5b50505050565b6018546001600160a01b0382166000908152601960205260408120549091610fce9190611ecf565b61169661177d565b61169f57600080fd5b6002546040516101009091046001600160a01b0316907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260028054610100600160a81b0319169055565b6116f661177d565b6116ff57600080fd5b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b601c6020526000908152604090205460ff1681565b60165460ff161590565b61174a61177d565b61175357600080fd5b80620f424083028161176157fe5b04600f555050565b60025461010090046001600160a01b031690565b60025461010090046001600160a01b0316331490565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d125780601f10610ce757610100808354040283529160200191610d12565b60085481565b6005546001600160a01b031681565b600554600090600160a01b900460ff1680611826575061182661177d565b8061184057503360009081526006602052604090205460ff165b61187b5760405162461bcd60e51b81526004018080602001828103825260238152602001806129026023913960400191505060405180910390fd5b336000908152601a602090815260408083206001600160a01b03871684529091529020548083106118cf57336000908152601a602090815260408083206001600160a01b03881684529091528120556118fe565b6118d9818461210b565b336000908152601a602090815260408083206001600160a01b03891684529091529020555b336000818152601a602090815260408083206001600160a01b0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b61196c61177d565b61197557600080fd5b600480546001600160a01b039384166001600160a01b03199182161790915560058054929093169116179055565b6119ab61177d565b6119b457600080fd5b806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156119ef57600080fd5b505af1158015611a03573d6000803e3d6000fd5b5050505060005b600354811015611a9b57816001600160a01b031660038281548110611a2b57fe5b6000918252602090912001546001600160a01b03161415611a93576040805162461bcd60e51b815260206004820152601a60248201527f50616972206164647265737320616c7265616479206164646564000000000000604482015290519081900360640190fd5b600101611a0a565b506003805460018181019092557fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b039093166001600160a01b0319909316831790556000918252601b6020526040909120805460ff19169091179055565b6000826001600160a01b038116611b1957600080fd5b600554600160a01b900460ff1680611b345750611b3461177d565b80611b4e57503360009081526006602052604090205460ff165b611b895760405162461bcd60e51b81526004018080602001828103825260238152602001806129026023913960400191505060405180910390fd5b611b94338585611fa8565b506001949350505050565b60135481565b60125481565b60095481565b600d5481565b600d54600090820381611bd46201518061127d84620f42406121e4565b90506000611c07620f424061127d84611c01620f424061127d600f546017546121e490919063ffffffff16565b906121e4565b60105490915060ff16151560011415611c4557611c42620f424061127d60125460115410611c3757601254611c3b565b6011545b84906121e4565b90505b949350505050565b611c5561177d565b611c5e57600080fd5b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b611c9161177d565b611c9a57600080fd5b6014546001600160a01b0382811691161415611cfd576040805162461bcd60e51b815260206004820152601a60248201527f526f75746572206164647265737320616c726561647920736574000000000000604482015290519081900360640190fd5b601480546001600160a01b0319166001600160a01b0392909216919091179055565b60105460ff1681565b611d3061177d565b611d3957600080fd5b6014805460ff60a01b1916600160a01b85151502179055611d7082611c01836af8277896582678ac0000006000195b061990611ecf565b601555505050565b600554600160a01b900460ff1681565b6001600160a01b031660009081526007602052604090205460ff1690565b611dae61177d565b611db757600080fd5b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b601b6020526000908152604090205460ff1681565b6001600160a01b039182166000908152601a6020908152604080832093909416825291909152205490565b611e2361177d565b611e2c57600080fd5b6110d18161223d565b6014546001600160a01b031681565b60038181548110611e5457600080fd5b6000918252602090912001546001600160a01b0316905081565b600082820183811015611ec8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000611ec883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506122b7565b60008184841115611fa05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f65578181015183820152602001611f4d565b50505050905090810190601f168015611f925780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60165460009060ff1615611fc857611fc184848461231c565b9050611ec8565b6000611fdf601854846121e490919063ffffffff16565b9050611fe96123ae565b15611ff657611ff6612406565b60105460ff161515600114156120195760135460115461201591611e6e565b6011555b6001600160a01b03851660009081526019602052604090205461203c908261210b565b6001600160a01b0386166000908152601960205260408120919091556120628686612773565b61206c5781612077565b6120778686846127ff565b6001600160a01b03861660009081526019602052604090205490915061209d9082611e6e565b6001600160a01b03808716600081815260196020526040902092909255601854908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906120ee908590611ecf565b60408051918252519081900360200190a350600195945050505050565b6000611ec883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f11565b600061215842611bb7565b6017549091506121689082611e6e565b60178190556001600160801b031015612187576001600160801b036017555b6017546121a2906af8277896582678ac000000600019611d68565b601855600e81905542600d55620f42406011556017546040517fafae32ce2847c13a56ab802c034c27d3c19f1d61be48c424c5df134145cd44d090600090a250565b6000826121f357506000610fce565b8282028284828161220057fe5b0414611ec85760405162461bcd60e51b81526004018080602001828103825260218152602001806128e16021913960400191505060405180910390fd5b6001600160a01b03811661225057600080fd5b6002546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600280546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600081836123065760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611f65578181015183820152602001611f4d565b50600083858161231257fe5b0495945050505050565b600080612334601854846121e490919063ffffffff16565b6001600160a01b03861660009081526019602052604090205490915061235a908261210b565b6001600160a01b0380871660009081526019602052604080822093909355908616815220546123899082611e6e565b6001600160a01b03851660009081526019602052604090205550600190509392505050565b336000908152601b602052604081205460ff161580156123d1575060165460ff16155b80156123e65750601454600160a01b900460ff165b801561128357505060155430600090815260196020526040902054101590565b6016805460ff191660011790556018543060009081526019602052604081205490916124329190611ecf565b90506000612456600261127d600b5461127d600854876121e490919063ffffffff16565b90506000612464838361210b565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061249857fe5b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156124ec57600080fd5b505afa158015612500573d6000803e3d6000fd5b505050506040513d602081101561251657600080fd5b505181518290600190811061252757fe5b6001600160a01b0392831660209182029290920181019190915260145460405163791ac94760e01b8152600481018681526000602483018190523060648401819052426084850181905260a060448601908152895160a487015289514799979097169763791ac947978c9795968c9690939260c49091019187820191028083838b5b838110156125c15781810151838201526020016125a9565b505050509050019650505050505050600060405180830381600087803b1580156125ea57600080fd5b505af11580156125fe573d6000803e3d6000fd5b505050506000612617824761210b90919063ffffffff16565b9050600061263d6126346002600854611ecf90919063ffffffff16565b600b549061210b565b9050600061265f600261127d8461127d600854886121e490919063ffffffff16565b9050861561270957601454600480546040805163f305d71960e01b81523093810193909352602483018b905260006044840181905260648401526001600160a01b0391821660848401524260a48401525192169163f305d71991849160c480830192606092919082900301818588803b1580156126db57600080fd5b505af11580156126ef573d6000803e3d6000fd5b50505050506040513d606081101561270657600080fd5b50505b6005546040516000916001600160a01b03169047908381818185875af1925050503d8060008114612756576040519150601f19603f3d011682016040523d82523d6000602084013e61275b565b606091505b50506016805460ff1916905550505050505050505050565b6001600160a01b0382166000908152601b602052604081205460ff16806127b257506001600160a01b0382166000908152601b602052604090205460ff165b8015611ec857506001600160a01b03831660009081526007602052604090205460ff16158015611ec85750506001600160a01b031660009081526007602052604090205460ff1615919050565b600b546001600160a01b0383166000908152601b602052604081205490919060ff1615156001141561283c57600a54612839908290611e6e565b90505b600c546000906128509061127d86856121e4565b3060009081526019602052604090205490915061286d9082611e6e565b306000818152601960205260409020919091556018546001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906128bb908590611ecf565b60408051918252519081900360200190a36128d6848261210b565b969550505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77496e697469616c20646973746972627574696f6e206e6f742066696e616c697a65642e4e6f742061757468726f697a656420746f206578656375746520746869732066756e6374696f6e2ea2646970667358221220cfa5b583fae8087fd05d9fbb5b60f35867f6610e4ab8b6455287b79474eb04b164736f6c63430007060033

Deployed ByteCode Sourcemap

11923:23291:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11569:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34823:351;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34823:351:0;-1:-1:-1;;;;;34823:351:0;;:::i;:::-;;29140:286;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29140:286:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13004:35;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18488:102;;;;;;;;;;;;;:::i;34525:290::-;;;;;;;;;;;;;:::i;12939:58::-;;;;;;;;;;;;;:::i;24118:457::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24118:457:0;;;;;;;;;;;;;;;;;:::i;12136:32::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;12136:32:0;;;;;;;;;;;;;;20524:172;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20524:172:0;;;;;;;;;;:::i;33369:215::-;;;;;;;;;;;;;:::i;12905:27::-;;;;;;;;;;;;;:::i;13107:34::-;;;;;;;;;;;;;:::i;29854:114::-;;;;;;;;;;;;;:::i;13257:45::-;;;;;;;;;;;;;:::i;11755:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32029:325;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32029:325:0;;;;;;;;;;;;;;:::i;28496:439::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28496:439:0;;;;;;;;:::i;18100:247::-;;;;;;;;;;;;;:::i;13148:58::-;;;;;;;;;;;;;:::i;19813:106::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17561:406;;;;;;;;;;;;;:::i;33685:126::-;;;;;;;;;;;;;:::i;13481:30::-;;;;;;;;;;;;;:::i;34082:435::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34082:435:0;;;;;;;;;;;;;;;;;:::i;21515:138::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21515:138:0;-1:-1:-1;;;;;21515:138:0;;:::i;3290:126::-;;;;;;;;;;;;;:::i;30433:101::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30433:101:0;-1:-1:-1;;;;;30433:101:0;;:::i;14031:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14031:55:0;-1:-1:-1;;;;;14031:55:0;;:::i;33592:85::-;;;;;;;;;;;;;:::i;32649:185::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32649:185:0;;;;;;;:::i;3025:79::-;;;;;;;;;;;;;:::i;3190:92::-;;;;;;;;;;;;;:::i;11660:87::-;;;;;;;;;;;;;:::i;12827:31::-;;;;;;;;;;;;;:::i;12175:40::-;;;;;;;;;;;;;:::i;27349:629::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27349:629:0;;;;;;;;:::i;33819:255::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33819:255:0;;;;;;;;;;:::i;19344:346::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19344:346:0;-1:-1:-1;;;;;19344:346:0;;:::i;18799:248::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18799:248:0;;;;;;;;:::i;13379:62::-;;;;;;;;;;;;;:::i;13309:63::-;;;;;;;;;;;;;:::i;12865:33::-;;;;;;;;;;;;;:::i;13048:52::-;;;;;;;;;;;;;:::i;15888:869::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15888:869:0;;:::i;20123:154::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20123:154:0;;;;;;;;;;:::i;28098:184::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28098:184:0;-1:-1:-1;;;;;28098:184:0;;:::i;13215:35::-;;;;;;;;;;;;;:::i;31488:230::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31488:230:0;;;;;;;;;;;;;;:::i;12222:39::-;;;;;;;;;;;;;:::i;29600:113::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29600:113:0;-1:-1:-1;;;;;29600:113:0;;:::i;30141:105::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30141:105:0;-1:-1:-1;;;;;30141:105:0;;:::i;13978:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13978:46:0;-1:-1:-1;;;;;13978:46:0;;:::i;21048:192::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21048:192:0;;;;;;;;;;:::i;3424:109::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3424:109:0;-1:-1:-1;;;;;3424:109:0;;:::i;13450:24::-;;;;;;;;;;;;;:::i;12099:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12099:30:0;;:::i;11569:83::-;11639:5;11632:12;;;;;;;;-1:-1:-1;;11632:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11606:13;;11632:12;;11639:5;;11632:12;;11639:5;11632:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11569:83;:::o;34823:351::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;34978:1:::1;34936:13;-1:-1:-1::0;;;;;34929:31:0::1;;34969:4;34929:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;34929:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34929:46:0;:50:::1;34907:121;;;::::0;;-1:-1:-1;;;34907:121:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34907:121:0;;;;;;;;;;;;;::::1;;35046:13;-1:-1:-1::0;;;;;35039:30:0::1;;35084:10;35116:13;-1:-1:-1::0;;;;;35109:31:0::1;;35149:4;35109:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;35109:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35109:46:0;35039:127:::1;::::0;;-1:-1:-1;;;;;;35039:127:0::1;::::0;;;;;;-1:-1:-1;;;;;35039:127:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;35109:46:::1;::::0;35039:127;;;;;;;-1:-1:-1;35039:127:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;34823:351:0:o;29140:286::-;15470:27;;29276:4;;-1:-1:-1;;;15470:27:0;;;;;:57;;;15518:9;:7;:9::i;:::-;15470:104;;;-1:-1:-1;15563:10:0;15548:26;;;;:14;:26;;;;;;;;15470:104;15448:189;;;;-1:-1:-1;;;15448:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29316:10:::1;29298:29;::::0;;;:17:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;29298:38:0;::::1;::::0;;;;;;;;;;:46;;;29360:36;;;;;;;29298:38;;29316:10;29360:36:::1;::::0;;;;;;;;;::::1;-1:-1:-1::0;29414:4:0::1;15648:1;29140:286:::0;;;;:::o;13004:35::-;;;;:::o;18488:102::-;18570:12;;18488:102;:::o;34525:290::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;34618:1:::1;34594:21;:25;34586:56;;;::::0;;-1:-1:-1;;;34586:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34586:56:0;;;;;;;;;;;;;::::1;;34672:82;::::0;34654:12:::1;::::0;34680:10:::1;::::0;34718:21:::1;::::0;34654:12;34672:82;34654:12;34672:82;34718:21;34680:10;34672:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34653:101;;;34773:7;34765:42;;;::::0;;-1:-1:-1;;;34765:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34765:42:0;;;;;;;;;;;;;::::1;;3173:1;34525:290::o:0;12939:58::-;;;;:::o;24118:457::-;24261:4;24248:2;-1:-1:-1;;;;;15720:18:0;;15712:27;;;;;;-1:-1:-1;;;;;24282:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;24306:10:::1;24282:35:::0;;;;;;;;-1:-1:-1;;24282:50:0::1;24278:225;;24387:104;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;24387:104:0::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;24387:23:0;::::1;-1:-1:-1::0;24387:23:0;;;:17:::1;:23:::0;;;;;24429:10:::1;24387:67:::0;;;;;;;;;;:104:::1;::::0;24459:5;;24387:71:::1;:104::i;:::-;-1:-1:-1::0;;;;;24349:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;24373:10:::1;24349:35:::0;;;;;;;:142;24278:225:::1;24515:30;24529:4;24535:2;24539:5;24515:13;:30::i;:::-;-1:-1:-1::0;24563:4:0::1;::::0;24118:457;-1:-1:-1;;;;;24118:457:0:o;12136:32::-;;;-1:-1:-1;;;;;12136:32:0;;:::o;20524:172::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;-1:-1:-1;;;;;20645:33:0;;;::::1;;::::0;;;:23:::1;:33;::::0;;;;:43;;-1:-1:-1;;20645:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;20524:172::o;33369:215::-;33545:16;;33502:12;:18;;;;12546:42;33422:7;33478:18;;;;;33422:7;;33462:114;;33545:16;;33463:58;;33502:18;33463:34;;-1:-1:-1;;13652:54:0;33463:14;:34::i;:::-;:38;;:58::i;:::-;33462:64;;:114::i;:::-;33442:134;;33369:215;:::o;12905:27::-;;;;:::o;13107:34::-;;;;:::o;29854:114::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;29926:27:::1;:34:::0;;-1:-1:-1;;;;29926:34:0::1;-1:-1:-1::0;;;29926:34:0::1;::::0;;29854:114::o;13257:45::-;;;;:::o;11755:83::-;11821:9;;;;11755:83;:::o;32029:325::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;32199:16:::1;:27:::0;;-1:-1:-1;;32199:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;32237:22:::1;:48:::0;32296:23:::1;:50:::0;32029:325::o;28496:439::-;15470:27;;28629:4;;-1:-1:-1;;;15470:27:0;;;;;:57;;;15518:9;:7;:9::i;:::-;15470:104;;;-1:-1:-1;15563:10:0;15548:26;;;;:14;:26;;;;;;;;15470:104;15448:189;;;;-1:-1:-1;;;15448:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28710:10:::1;28692:29;::::0;;;:17:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;28692:62:0;::::1;::::0;;;;;;;;:78:::1;::::0;28759:10;28692:66:::1;:78::i;:::-;28669:10;28651:29;::::0;;;:17:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;28651:38:0;::::1;::::0;;;;;;;;;;:119;;;28786;;;;;;28651:38;;28786:119:::1;::::0;;;;;;;;;::::1;-1:-1:-1::0;28923:4:0::1;28496:439:::0;;;;:::o;18100:247::-;18202:10;18178:35;;;;:23;:35;;;;;;;;:43;;:35;:43;18156:133;;;;-1:-1:-1;;;18156:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18324:15;18302:19;:37;18100:247::o;13148:58::-;;;;:::o;19813:106::-;19862:16;19898:13;19891:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19891:20:0;;;;;;;;;;;;;;;;;;;;;;19813:106;:::o;17561:406::-;17652:10;17628:35;;;;:23;:35;;;;;;;;:43;;:35;:43;17606:125;;;;;-1:-1:-1;;;17606:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17744:9;:7;:9::i;:::-;17771;17766:194;17790:13;:20;17786:24;;17766:194;;;17836:14;:32;17851:13;17865:1;17851:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17851:16:0;17836:32;;;;;;;;;;;;;;;:40;;17851:16;17836:40;17832:117;;;17909:13;17923:1;17909:16;;;;;;;;;;;;;;;;;17897:36;;;-1:-1:-1;;;;;;17897:36:0;;;;-1:-1:-1;;;;;17909:16:0;;;;17897:34;;:36;;;;;;;;;;17909:16;;17897:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17832:117;17812:3;;17766:194;;33685:126;33738:7;33765:38;33786:16;;33765;;:20;;:38;;;;:::i;13481:30::-;;;-1:-1:-1;;;13481:30:0;;;;;:::o;34082:435::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;34263:12:::1;:28:::0;;;34302:14:::1;:32:::0;;;34345:7:::1;:18:::0;;;34385:32:::1;34278:13:::0;34319:15;34385:16:::1;:32::i;:::-;34374:8;:43:::0;34428:14:::1;:32:::0;;;34507:1:::1;34445:15:::0;34490:18:::1;34479:8;;:29;34471:38;;;::::0;::::1;;34082:435:::0;;;;:::o;21515:138::-;21628:16;;-1:-1:-1;;;;;21606:17:0;;21579:7;21606:17;;;:12;:17;;;;;;21579:7;;21606:39;;:17;:21;:39::i;3290:126::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;3371:6:::1;::::0;3352:26:::1;::::0;3371:6:::1;::::0;;::::1;-1:-1:-1::0;;;;;3371:6:0::1;::::0;3352:26:::1;::::0;;;::::1;3389:6;:19:::0;;-1:-1:-1;;;;;;3389:19:0::1;::::0;;3290:126::o;30433:101::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;-1:-1:-1;;;;;30500:19:0::1;;::::0;;;:12:::1;:19;::::0;;;;:26;;-1:-1:-1;;30500:26:0::1;30522:4;30500:26;::::0;;30433:101::o;14031:55::-;;;;;;;;;;;;;;;:::o;33592:85::-;33663:6;;;;33662:7;33592:85;:::o;32649:185::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;32817:9:::1;12398:7;32791:11;:22;32790:36;;;;;;32769:18;:57:::0;-1:-1:-1;;32649:185:0:o;3025:79::-;3090:6;;;;;-1:-1:-1;;;;;3090:6:0;;3025:79::o;3190:92::-;3268:6;;;;;-1:-1:-1;;;;;3268:6:0;3254:10;:20;;3190:92::o;11660:87::-;11732:7;11725:14;;;;;;;;-1:-1:-1;;11725:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11699:13;;11725:14;;11732:7;;11725:14;;11732:7;11725:14;;;;;;;;;;;;;;;;;;;;;;;;12827:31;;;;:::o;12175:40::-;;;-1:-1:-1;;;;;12175:40:0;;:::o;27349:629::-;15470:27;;27487:4;;-1:-1:-1;;;15470:27:0;;;;;:57;;;15518:9;:7;:9::i;:::-;15470:104;;;-1:-1:-1;15563:10:0;15548:26;;;;:14;:26;;;;;;;;15470:104;15448:189;;;;-1:-1:-1;;;15448:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27546:10:::1;27509:16;27528:29:::0;;;:17:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;27528:38:0;::::1;::::0;;;;;;;;27581:27;;::::1;27577:237;;27643:10;27666:1;27625:29:::0;;;:17:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;27625:38:0;::::1;::::0;;;;;;;:42;27577:237:::1;;;27741:61;:8:::0;27772:15;27741:12:::1;:61::i;:::-;27718:10;27700:29;::::0;;;:17:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;27700:38:0;::::1;::::0;;;;;;;:102;27577:237:::1;27852:10;27899:29;::::0;;;:17:::1;:29;::::0;;;;;;;-1:-1:-1;;;;;27829:119:0;::::1;27899:38:::0;;;;;;;;;;;27829:119;;;;;;;;;27852:10;27829:119:::1;::::0;;;;;;;;;::::1;-1:-1:-1::0;27966:4:0::1;::::0;27349:629;-1:-1:-1;;;27349:629:0:o;33819:255::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;33963:17:::1;:38:::0;;-1:-1:-1;;;;;33963:38:0;;::::1;-1:-1:-1::0;;;;;;33963:38:0;;::::1;;::::0;;;34012:25:::1;:54:::0;;;;;::::1;::::0;::::1;;::::0;;33819:255::o;19344:346::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;19426:8:::1;-1:-1:-1::0;;;;;19414:26:0::1;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19460:9;19455:145;19479:13;:20:::0;19475:24;::::1;19455:145;;;19549:8;-1:-1:-1::0;;;;;19529:28:0::1;:13;19543:1;19529:16;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;19529:16:0::1;:28;;19521:67;;;::::0;;-1:-1:-1;;;19521:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;19501:3;;19455:145;;;-1:-1:-1::0;19612:13:0::1;:28:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;19612:28:0;;::::1;-1:-1:-1::0;;;;;;19612:28:0;;::::1;::::0;::::1;::::0;;-1:-1:-1;19651:24:0;;;:14:::1;19612:28;19651:24:::0;;;;;:31;;-1:-1:-1;;19651:31:0::1;::::0;;::::1;::::0;;19344:346::o;18799:248::-;18959:4;18904:2;-1:-1:-1;;;;;15720:18:0;;15712:27;;;;;;15470::::1;::::0;-1:-1:-1;;;15470:27:0;::::1;;;::::0;:57:::1;;;15518:9;:7;:9::i;:::-;15470:104;;;-1:-1:-1::0;15563:10:0::1;15548:26;::::0;;;:14:::1;:26;::::0;;;;;::::1;;15470:104;15448:189;;;;-1:-1:-1::0;;;15448:189:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18981:36:::2;18995:10;19007:2;19011:5;18981:13;:36::i;:::-;-1:-1:-1::0;19035:4:0::2;::::0;18799:248;-1:-1:-1;;;;18799:248:0:o;13379:62::-;;;;:::o;13309:63::-;;;;:::o;12865:33::-;;;;:::o;13048:52::-;;;;:::o;15888:869::-;16016:19;;15952:7;;16003:32;;15952:7;16093:83;12719:5;16093:48;16003:32;12398:7;16093:38;:48::i;:83::-;16048:128;;16189:23;16215:160;12398:7;16215:132;16312:34;16215:78;12398:7;16215:50;16246:18;;16215:12;;:30;;:50;;;;:::i;:78::-;:96;;:132::i;:160::-;16392:16;;16189:186;;-1:-1:-1;16392:16:0;;:24;;:16;:24;16388:327;;;16451:252;12398:7;16451:220;16533:22;;16511:19;;:44;:141;;16630:22;;16511:141;;;16583:19;;16511:141;16451:15;;:37;:220::i;:252::-;16433:270;;16388:327;16734:15;15888:869;-1:-1:-1;;;;15888:869:0:o;20123:154::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;-1:-1:-1;;;;;20235:24:0;;;::::1;;::::0;;;:14:::1;:24;::::0;;;;:34;;-1:-1:-1;;20235:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;20123:154::o;28098:184::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;28184:6:::1;::::0;-1:-1:-1;;;;;28176:27:0;;::::1;28184:6:::0;::::1;28176:27;;28168:66;;;::::0;;-1:-1:-1;;;28168:66:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28245:6;:29:::0;;-1:-1:-1;;;;;;28245:29:0::1;-1:-1:-1::0;;;;;28245:29:0;;;::::1;::::0;;;::::1;::::0;;28098:184::o;13215:35::-;;;;;;:::o;31488:230::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;31626:11:::1;:22:::0;;-1:-1:-1;;;;31626:22:0::1;-1:-1:-1::0;;;31626:22:0;::::1;;;;::::0;;31678:32:::1;31705:4:::0;31678:22:::1;31693:6:::0;12792:26;-1:-1:-1;;13667:38:0::1;;13652:54:::0;;31678:14:::1;:22::i;:32::-;31659:16;:51:::0;-1:-1:-1;;;31488:230:0:o;12222:39::-;;;-1:-1:-1;;;12222:39:0;;;;;:::o;29600:113::-;-1:-1:-1;;;;;29686:19:0;29662:4;29686:19;;;:12;:19;;;;;;;;;29600:113::o;30141:105::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;-1:-1:-1;;;;;30210:21:0::1;;::::0;;;:14:::1;:21;::::0;;;;:28;;-1:-1:-1;;30210:28:0::1;30234:4;30210:28;::::0;;30141:105::o;13978:46::-;;;;;;;;;;;;;;;:::o;21048:192::-;-1:-1:-1;;;;;21199:24:0;;;21167:7;21199:24;;;:17;:24;;;;;;;;:33;;;;;;;;;;;;;21048:192::o;3424:109::-;3152:9;:7;:9::i;:::-;3144:18;;;;;;3497:28:::1;3516:8;3497:18;:28::i;13450:24::-:0;;;-1:-1:-1;;;;;13450:24:0;;:::o;12099:30::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12099:30:0;;-1:-1:-1;12099:30:0;:::o;1337:181::-;1395:7;1427:5;;;1451:6;;;;1443:46;;;;;-1:-1:-1;;;1443:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1509:1;1337:181;-1:-1:-1;;;1337:181:0:o;2162:132::-;2220:7;2247:39;2251:1;2254;2247:39;;;;;;;;;;;;;;;;;:3;:39::i;1670:226::-;1790:7;1826:12;1818:6;;;;1810:29;;;;-1:-1:-1;;;1810:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1862:5:0;;;1670:226::o;22762:910::-;22902:6;;22881:4;;22902:6;;22898:80;;;22932:34;22947:6;22955:2;22959:6;22932:14;:34::i;:::-;22925:41;;;;22898:80;22990:17;23010:28;23021:16;;23010:6;:10;;:28;;;;:::i;:::-;22990:48;;23055:17;:15;:17::i;:::-;23051:61;;;23089:11;:9;:11::i;:::-;23128:16;;;;:24;;:16;:24;23124:159;;;23233:23;;23191:19;;:80;;:23;:80::i;:::-;23169:19;:102;23124:159;-1:-1:-1;;;;;23318:20:0;;;;;;:12;:20;;;;;;:35;;23343:9;23318:24;:35::i;:::-;-1:-1:-1;;;;;23295:20:0;;;;;;:12;:20;;;;;:58;;;;23394:26;23308:6;23417:2;23394:14;:26::i;:::-;:98;;23483:9;23394:98;;;23436:31;23445:6;23453:2;23457:9;23436:8;:31::i;:::-;-1:-1:-1;;;;;23522:16:0;;;;;;:12;:16;;;;;;23366:126;;-1:-1:-1;23522:39:0;;23366:126;23522:20;:39::i;:::-;-1:-1:-1;;;;;23503:16:0;;;;;;;:12;:16;;;;;:58;;;;23622:16;;23579:61;;;;;;23600:39;;:17;;:21;:39::i;:::-;23579:61;;;;;;;;;;;;;;;-1:-1:-1;23660:4:0;;22762:910;-1:-1:-1;;;;;22762:910:0:o;1526:136::-;1584:7;1611:43;1615:1;1618;1611:43;;;;;;;;;;;;;;;;;:3;:43::i;16920:487::-;16959:19;16981:30;16995:15;16981:13;:30::i;:::-;17037:12;;16959:52;;-1:-1:-1;17037:38:0;;16959:52;17037:16;:38::i;:::-;17022:12;:53;;;-1:-1:-1;;;;;;17088:83:0;;;-1:-1:-1;;;;;17134:12:0;:25;17088:83;17217:12;;17202:28;;12792:26;-1:-1:-1;;13667:38:0;;17202:28;17183:16;:47;17243:15;:29;;;17305:15;17283:19;:37;12398:7;17331:19;:30;17386:12;;17379:20;;;;-1:-1:-1;;17379:20:0;16920:487;:::o;1904:250::-;1962:7;1986:6;1982:47;;-1:-1:-1;2016:1:0;2009:8;;1982:47;2053:5;;;2057:1;2053;:5;:1;2077:5;;;;;:10;2069:56;;;;-1:-1:-1;;;2069:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3541:187;-1:-1:-1;;;;;3615:22:0;;3607:31;;;;;;3675:6;;3654:38;;-1:-1:-1;;;;;3654:38:0;;;;3675:6;;;;;3654:38;;;;;3703:6;:17;;-1:-1:-1;;;;;3703:17:0;;;;;-1:-1:-1;;;;;;3703:17:0;;;;;;;;;3541:187::o;2302:225::-;2422:7;2457:12;2450:5;2442:28;;;;-1:-1:-1;;;2442:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2481:9;2497:1;2493;:5;;;;;;;2302:225;-1:-1:-1;;;;;2302:225:0:o;21991:339::-;22109:4;22126:17;22146:28;22157:16;;22146:6;:10;;:28;;;;:::i;:::-;-1:-1:-1;;;;;22206:18:0;;;;;;:12;:18;;;;;;22126:48;;-1:-1:-1;22206:33:0;;22126:48;22206:22;:33::i;:::-;-1:-1:-1;;;;;22185:18:0;;;;;;;:12;:18;;;;;;:54;;;;22269:16;;;;;;;:31;;22290:9;22269:20;:31::i;:::-;-1:-1:-1;;;;;22250:16:0;;;;;;:12;:16;;;;;:50;-1:-1:-1;22318:4:0;;-1:-1:-1;21991:339:0;;;;;:::o;32983:246::-;33085:10;33033:4;33070:26;;;:14;:26;;;;;;;;:35;;;:59;;-1:-1:-1;33123:6:0;;;;33122:7;33070:59;:87;;;;-1:-1:-1;33146:11:0;;-1:-1:-1;;;33146:11:0;;;;33070:87;:151;;;;-1:-1:-1;;33205:16:0;;33195:4;33174:27;;;;:12;:27;;;;;;:47;;;32983:246::o;24762:1466::-;15336:6;:13;;-1:-1:-1;;15336:13:0;15345:4;15336:13;;;24893:16:::1;::::0;24868:4:::1;15336:6:::0;24847:27;;;:12:::1;:27;::::0;;;;;15336:6;;24847:73:::1;::::0;:27;:31:::1;:73::i;:::-;24816:104;;24931:23;24957:101;25056:1;24957:80;25028:8;;24957:52;24996:12;;24957:20;:38;;:52;;;;:::i;:101::-;24931:127:::0;-1:-1:-1;25069:20:0::1;25092:41;:20:::0;24931:127;25092:24:::1;:41::i;:::-;25170:16;::::0;;25184:1:::1;25170:16:::0;;;;;::::1;::::0;;25069:64;;-1:-1:-1;25146:21:0::1;::::0;25170:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;25170:16:0::1;25146:40;;25215:4;25197;25202:1;25197:7;;;;;;;;-1:-1:-1::0;;;;;25197:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;25241:6:::1;::::0;:13:::1;::::0;;-1:-1:-1;;;25241:13:0;;;;:6;;;::::1;::::0;:11:::1;::::0;:13:::1;::::0;;::::1;::::0;25197:7;;25241:13;;;;;:6;:13;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25241:13:0;25231:7;;:4;;25236:1:::1;::::0;25231:7;::::1;;;;;-1:-1:-1::0;;;;;25231:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;25325:6:::1;::::0;:188:::1;::::0;-1:-1:-1;;;25325:188:0;;::::1;::::0;::::1;::::0;;;25267:21:::1;25325:188:::0;;;;;;25467:4:::1;25325:188:::0;;;;;;25487:15:::1;25325:188:::0;;;;;;;;;;;;;;;;;;;;;25291:21:::1;::::0;25325:6;;;::::1;::::0;:57:::1;::::0;25397:12;;25267:21;;25440:4;;25325:188;;;;;;;;;;::::1;::::0;::::1;::::0;;;25267:21;25325:188:::1;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25526:17;25546:40;25572:13;25546:21;:25;;:40;;;;:::i;:::-;25526:60;;25597:19;25619:33;25632:19;25649:1;25632:12;;:16;;:19;;;;:::i;:::-;25619:8;::::0;;:12:::1;:33::i;:::-;25597:55;;25665:26;25694:93;25785:1;25694:72;25754:11;25694:41;25722:12;;25694:9;:27;;:41;;;;:::i;:93::-;25665:122:::0;-1:-1:-1;25804:19:0;;25800:292:::1;;25840:6;::::0;26014:17:::1;::::0;;25840:240:::1;::::0;;-1:-1:-1;;;25840:240:0;;25916:4:::1;25840:240:::0;;::::1;::::0;;;;;;;;;;:6:::1;:240:::0;;;;;;;;;;-1:-1:-1;;;;;26014:17:0;;::::1;25840:240:::0;;;;26050:15:::1;25840:240:::0;;;;;:6;::::1;::::0;:22:::1;::::0;25870:18;;25840:240;;;;;::::1;::::0;;;;;;;;25870:18;25840:6;:240;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;25800:292:0::1;26131:25;::::0;26123:97:::1;::::0;26105:12:::1;::::0;-1:-1:-1;;;;;26131:25:0::1;::::0;26184:21:::1;::::0;26105:12;26123:97;26105:12;26123:97;26184:21;26131:25;26123:97:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;15372:6:0;:14;;-1:-1:-1;;15372:14:0;;;-1:-1:-1;;;;;;;;;;24762:1466:0:o;30963:253::-;-1:-1:-1;;;;;31106:20:0;;31063:4;31106:20;;;:14;:20;;;;;;;;;:42;;-1:-1:-1;;;;;;31130:18:0;;;;;;:14;:18;;;;;;;;31106:42;31105:103;;;;-1:-1:-1;;;;;;31168:18:0;;;;;;:12;:18;;;;;;;;31167:19;:40;;;;-1:-1:-1;;;;;;;31191:16:0;;;;;:12;:16;;;;;;;;31190:17;;30963:253;-1:-1:-1;30963:253:0:o;26572:560::-;26729:8;;-1:-1:-1;;;;;26752:18:0;;26689:7;26752:18;;;:14;:18;;;;;;26689:7;;26729:8;26752:18;;:26;;:18;:26;26748:66;;;26806:7;;26792:22;;:9;;:13;:22::i;:::-;26780:34;;26748:66;26876:14;;26827:17;;26847:44;;:24;:9;26861;26847:13;:24::i;:44::-;26955:4;26934:27;;;;:12;:27;;;;;;26827:64;;-1:-1:-1;26934:66:0;;26827:64;26934:31;:66::i;:::-;26925:4;26904:27;;;;:12;:27;;;;;:96;;;;27062:16;;-1:-1:-1;;;;;27016:64:0;;;;;27048:31;;:9;;:13;:31::i;:::-;27016:64;;;;;;;;;;;;;;;27100:24;:9;27114;27100:13;:24::i;:::-;27093:31;26572:560;-1:-1:-1;;;;;;26572:560:0:o

Swarm Source

ipfs://cfa5b583fae8087fd05d9fbb5b60f35867f6610e4ab8b6455287b79474eb04b1
Loading