ETH Price: $3,084.23 (-6.64%)
Gas: 6 Gwei

Contract

0x7cD70b36bA8fcBD888E9C26840b9300aC64D29a9
 

Overview

ETH Balance

0.0368338 ETH

Eth Value

$113.60 (@ $3,084.23/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
0x5a5dcd9d198300792024-05-09 4:23:5956 days ago1715228639IN
0x7cD70b36...aC64D29a9
0 ETH0.000091943.63561437
Transfer190552972024-01-21 12:40:35165 days ago1705840835IN
0x7cD70b36...aC64D29a9
0.025 ETH0.0003227915.33110076
Withdraw NFT188686012023-12-26 8:12:59191 days ago1703578379IN
0x7cD70b36...aC64D29a9
0 ETH0.0027401513.28648862
Swap NF Tfor FT187106332023-12-04 4:31:23213 days ago1701664283IN
0x7cD70b36...aC64D29a9
0 ETH0.0060337333.38441673
Swap F Tfor NFT185804392023-11-15 23:02:35232 days ago1700089355IN
0x7cD70b36...aC64D29a9
0.028 ETH0.0050429834.03285927
Stake NFT185544002023-11-12 7:39:35235 days ago1699774775IN
0x7cD70b36...aC64D29a9
0 ETH0.0069769318.49086357
Swap NF Tfor FT182896132023-10-06 6:15:59272 days ago1696572959IN
0x7cD70b36...aC64D29a9
0 ETH0.00121885.7597988
Withdraw NFT182332632023-09-28 9:12:35280 days ago1695892355IN
0x7cD70b36...aC64D29a9
0 ETH0.001490347.6288842
Swap F Tfor NFT178706322023-08-08 13:54:35331 days ago1691502875IN
0x7cD70b36...aC64D29a9
0.028 ETH0.0036807723.54171189
Withdraw NFT177324982023-07-20 6:08:47350 days ago1689833327IN
0x7cD70b36...aC64D29a9
0 ETH0.0037152114.87375624
Stake NFT176562032023-07-09 12:39:11361 days ago1688906351IN
0x7cD70b36...aC64D29a9
0 ETH0.0036481913.64365702
Set Collection A...176561802023-07-09 12:34:35361 days ago1688906075IN
0x7cD70b36...aC64D29a9
0 ETH0.0006547713.52331667
Withdraw NFT176561422023-07-09 12:26:59361 days ago1688905619IN
0x7cD70b36...aC64D29a9
0 ETH0.0014036613.36592706
Withdraw NFT176561362023-07-09 12:25:47361 days ago1688905547IN
0x7cD70b36...aC64D29a9
0 ETH0.0017852114.25934278
Swap NF Tfor FT175900712023-06-30 5:38:47370 days ago1688103527IN
0x7cD70b36...aC64D29a9
0 ETH0.004348222.27369688
Stake NFT175495432023-06-24 13:01:23376 days ago1687611683IN
0x7cD70b36...aC64D29a9
0 ETH0.0050245314.42680203
Withdraw NFT174845492023-06-15 9:59:35385 days ago1686823175IN
0x7cD70b36...aC64D29a9
0 ETH0.0014583715.6866285
Swap F Tfor NFT174473332023-06-10 4:14:23390 days ago1686370463IN
0x7cD70b36...aC64D29a9
0.04 ETH0.002351518.68925296
Swap F Tfor NFT174465452023-06-10 1:34:23390 days ago1686360863IN
0x7cD70b36...aC64D29a9
0.068 ETH0.0023081116.10437874
Swap F Tfor NFT173854292023-06-01 10:41:11399 days ago1685616071IN
0x7cD70b36...aC64D29a9
0.052 ETH0.0047354623.52183754
Stake NFT173784442023-05-31 11:04:59400 days ago1685531099IN
0x7cD70b36...aC64D29a9
0 ETH0.0089697445.71107073
Set Collection A...173784292023-05-31 11:01:59400 days ago1685530919IN
0x7cD70b36...aC64D29a9
0 ETH0.0019744740.77971085
Stake NFT173783972023-05-31 10:55:35400 days ago1685530535IN
0x7cD70b36...aC64D29a9
0 ETH0.0072925631.15803435
Stake NFT173783402023-05-31 10:44:11400 days ago1685529851IN
0x7cD70b36...aC64D29a9
0 ETH0.0066060235.6377562
Stake NFT173783222023-05-31 10:40:11400 days ago1685529611IN
0x7cD70b36...aC64D29a9
0 ETH0.0060341434.07408201
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
187106332023-12-04 4:31:23213 days ago1701664283
0x7cD70b36...aC64D29a9
0.001248 ETH
185804392023-11-15 23:02:35232 days ago1700089355
0x7cD70b36...aC64D29a9
0.028 ETH
182896132023-10-06 6:15:59272 days ago1696572959
0x7cD70b36...aC64D29a9
0.002304 ETH
182332632023-09-28 9:12:35280 days ago1695892355
0x7cD70b36...aC64D29a9
0.00336 ETH
178706322023-08-08 13:54:35331 days ago1691502875
0x7cD70b36...aC64D29a9
0.028 ETH
175900712023-06-30 5:38:47370 days ago1688103527
0x7cD70b36...aC64D29a9
0.00096 ETH
174473332023-06-10 4:14:23390 days ago1686370463
0x7cD70b36...aC64D29a9
0.04 ETH
174465452023-06-10 1:34:23390 days ago1686360863
0x7cD70b36...aC64D29a9
0.068 ETH
173854292023-06-01 10:41:11399 days ago1685616071
0x7cD70b36...aC64D29a9
0.052 ETH
173722562023-05-30 14:12:11401 days ago1685455931
0x7cD70b36...aC64D29a9
2.6804536 ETH
171280382023-04-26 4:31:11435 days ago1682483471
0x7cD70b36...aC64D29a9
0.00651 ETH
171279852023-04-26 4:20:35435 days ago1682482835
0x7cD70b36...aC64D29a9
0.003276 ETH
171279552023-04-26 4:14:35435 days ago1682482475
0x7cD70b36...aC64D29a9
0.00342 ETH
171150172023-04-24 8:40:11437 days ago1682325611
0x7cD70b36...aC64D29a9
0.0250926 ETH
169468992023-03-31 11:30:23461 days ago1680262223
0x7cD70b36...aC64D29a9
0.002628 ETH
169386162023-03-30 7:35:47462 days ago1680161747
0x7cD70b36...aC64D29a9
0.001 ETH
169112552023-03-26 11:18:35466 days ago1679829515
0x7cD70b36...aC64D29a9
0.002664 ETH
169058202023-03-25 16:59:35467 days ago1679763575
0x7cD70b36...aC64D29a9
0.0027 ETH
168661902023-03-20 3:24:35472 days ago1679282675
0x7cD70b36...aC64D29a9
0.00042 ETH
168661812023-03-20 3:22:47472 days ago1679282567
0x7cD70b36...aC64D29a9
0.0005 ETH
167541262023-03-04 9:15:47488 days ago1677921347
0x7cD70b36...aC64D29a9
0.013 ETH
167487542023-03-03 15:04:35489 days ago1677855875
0x7cD70b36...aC64D29a9
0.05 ETH
167086802023-02-25 23:53:59495 days ago1677369239
0x7cD70b36...aC64D29a9
0.002736 ETH
167085802023-02-25 23:33:47495 days ago1677368027
0x7cD70b36...aC64D29a9
0.00585 ETH
166768242023-02-21 12:18:11499 days ago1676981891
0x7cD70b36...aC64D29a9
0.042 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-25
*/

// File: yomiswap-v2/lib/FixedPointMathLib.sol


pragma solidity =0.8.17;

library FixedPointMathLib {
    uint256 internal constant WAD = 1e18;

    function fmul(
        uint256 x,
        uint256 y,
        uint256 baseUnit
    ) internal pure returns (uint256 z) {
        assembly {
            // Store x * y in z for now.
            z := mul(x, y)

            // Equivalent to require(x == 0 || (x * y) / x == y)
            if iszero(or(iszero(x), eq(div(z, x), y))) {
                revert(0, 0)
            }

            // If baseUnit is zero this will return zero instead of reverting.
            z := div(z, baseUnit)
        }
    }

    function fdiv(
        uint256 x,
        uint256 y,
        uint256 baseUnit
    ) internal pure returns (uint256 z) {
        assembly {
            // Store x * baseUnit in z for now.
            z := mul(x, baseUnit)

            if or(
                // Revert if y is zero to ensure we don't divide by zero below.
                iszero(y),
                // Equivalent to require(x == 0 || (x * baseUnit) / x == baseUnit)
                iszero(or(iszero(x), eq(div(z, x), baseUnit)))
            ) {
                revert(0, 0)
            }

            // We ensure y is not zero above, so there is never division by zero here.
            z := div(z, y)
        }
    }

    function fpow(
        uint256 x,
        uint256 n,
        uint256 baseUnit
    ) internal pure returns (uint256 z) {
        assembly {
            switch x
            case 0 {
                switch n
                case 0 {
                    z := baseUnit
                }
                default {
                    z := 0
                }
            }
            default {
                switch mod(n, 2)
                case 0 {
                    z := baseUnit
                }
                default {
                    z := x
                }
                let half := div(baseUnit, 2)
                for {
                    n := div(n, 2)
                } n {
                    n := div(n, 2)
                } {
                    let xx := mul(x, x)
                    if iszero(eq(div(xx, x), x)) {
                        revert(0, 0)
                    }
                    let xxRound := add(xx, half)
                    if lt(xxRound, xx) {
                        revert(0, 0)
                    }
                    x := div(xxRound, baseUnit)
                    if mod(n, 2) {
                        let zx := mul(z, x)
                        if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) {
                            revert(0, 0)
                        }
                        let zxRound := add(zx, half)
                        if lt(zxRound, zx) {
                            revert(0, 0)
                        }
                        z := div(zxRound, baseUnit)
                    }
                }
            }
        }
    }
}

// File: yomiswap-v2/interfaces/IPool.sol


pragma solidity =0.8.17;

interface IPool {
    //VARIANT
    function collection() external returns (address);

    function bondingCurve() external returns (address);

    function router() external returns (address);

    function paymentToken() external returns (address);

    function protocolFeeRatio() external returns (uint256);

    function buyEventNum() external returns (uint256);

    function sellEventNum() external returns (uint256);

    function stakeNFTprice() external returns (uint256);

    function stakeFTprice() external returns (uint256);

    function totalFTfee() external returns (uint256);

    function totalNFTfee() external returns (uint256);

    function isOtherStake() external returns (bool);

    function isPair() external returns (bool);

    struct UserInfo {
        uint256 initBuyNum;
        uint256 initSellNum;
        uint256 initSellAmount;
        uint256 totalNFTpoint;
        uint256 totalFTpoint;
    }

    struct PoolInfo {
        uint256 spotPrice;
        uint256 delta;
        uint256 spread;
        uint256 buyNum;
        uint256 sellNum;
    }

    function swapFTforNFT(uint256[] memory tokenIds, address user)
        external
        payable
        returns (uint256 protocolFee);

    function swapNFTforFT(
        uint256[] memory tokenIds,
        uint256 minExpectFee,
        address user
    ) external payable returns (uint256 protocolFee);


    function stakeNFT(uint256[] calldata tokenIds, address user) external;

    function withdrawNFT(uint256[] memory tokenIds, address user)
        external
        payable returns(uint256 totalFee);

    //@notice Only Single NonOtherStake
    function withdrawNFTpart(uint256[] calldata tokenIds, address user) external;

    //@notice Only All
    function withdrawFee(address user) external payable;

    //@notice reset Param
    function reset(address bondingCurve, uint256 newSpotPrice, uint256 newDelta, uint256 newSpread, address user) external;

    //@notice withdraw other FT
    function withdrawOtherFT(uint256 amount, address user) external;

    //@notice withdraw other NFT
    function withdrawOtherNFT(address collection, uint256 tokenId, address user)external;

    //GET
    //@notice Only All
    function getCalcBuyInfo(uint256 itemNum, uint256 spotPrice)
        external
        view
        returns (uint256);

    //@notice All
    function getCalcSellInfo(uint256 itemNum, uint256 spotPrice)
        external
        view
        returns (uint256);

    //@notice Only OtherStake
    function getUserStakeNFTfee(address user)
        external
        view
        returns (uint256 userFee);

    //@notice Only OtherStake
    function getUserStakeFTfee(address user)
        external
        view
        returns (uint256 userFee);

    //@notice Only Single NonOtherStake
    function getUserStakeNFTfee() external view returns (uint256 userFee);

    //@notice Only Single NonOtherStake
    function getUserStakeFTfee() external view returns (uint256 userFee);

    //@notice All
    function getPoolInfo() external view returns (PoolInfo memory);

    //@notice All
    function getAllHoldIds() external view returns (uint256[] memory);

    //@notice Only Pair NonOtherStake
    function getUserStakeFee() external view returns (uint256);

    //@notice Only Pair OtherStake
    function getUserStakeFee(address user) external view returns (uint256);

    //@notice Only OtherStake
    function getUserInfo(address user) external view returns (UserInfo memory);

    //@notice Only Non OtherStake
    function getUserInfo() external view returns (UserInfo memory);

    //SET
    //@notice All
    function setRouter(address newRouter) external;

    //@notice All
    function setProtocolFeeRatio(uint256 newProtocolFeeRatio) external;
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.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 meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @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.
 */
abstract 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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: yomiswap-v2/Router.sol


pragma solidity =0.8.17;





contract Router is Ownable {
    using FixedPointMathLib for uint256;
    //@param supporterFeeRatio: ratio of supporter
    uint256 public supporterFeeRatio;

    //@param isCollectionApprove: isApprove of Collection
    mapping(address => bool) private isCollectionApprove;

    //@param isBondingCurve: isApprove of BondingCurve
    mapping(address => bool) private isBondingCurveApprove;

    //@param isPaymentToken: isApprove of PaymentToken
    mapping(address => bool) private isPaymentTokenApprove;

    //@param isFactoryApprove: isApprove of Facotory
    mapping(address => bool) private isFactoryApprove;

    //@param isSupporterApprove: isApprove of Supporter
    mapping(address => bool) private isSupporterApprove;

    //@param totalProtocolFee: total protocol fee per paymentToken
    mapping(address => uint256) public totalFee;

    //@param totalProtocolFee: total protocol fee per paymentToken
    mapping(address => uint256) private totalProtocolFee;

    //@param supporterFee: per supporter and per paymentToken
    mapping(address => mapping(address => uint256)) private supporterFee;

    //STRUCT
    struct input {
        uint256[] tokenIds;
    }

    //@notice only factory address
    modifier onlyFactory() {
        require(isFactoryApprove[msg.sender] == true, "onlyFactory");
        _;
    }

    //EVENT
    event StakeNFT(
        address indexed user,
        address indexed pool,
        uint256[] tokenIds
    );
    event SwapNFTforFT(
        address indexed user,
        address indexed pool,
        uint256[] tokenIds,
        uint256 totalFee,
        address supporter
    );
    event SwapFTforNFT(
        address indexed user,
        address indexed pool,
        uint256[] tokenIds,
        uint256 totalFee,
        address supporter
    );
    event WithdrawNFT(
        address indexed user,
        address indexed pool,
        uint256[] tokenIds,
        uint256 userAmount
    );
    event WithdrawNFTpart(
        address indexed user,
        address indexed pool,
        uint256[] tokenIds
    );
    event WithdrawFee(
        address indexed user,
        address indexed pool,
        uint256 userFee
    );
    event Received(address, uint256);
    event UpdateBondingCurve(address indexed bondingCurve, bool approve);
    event UpdateCollection(address indexed collection, bool approve);
    event UpdatePool(address indexed pool, bool approve);
    event UpdatePoolParam(address indexed pool);
    event UpdatePaymentToken(address indexed paymentToken, bool approve);
    event UpdateFactory(address indexed factory, bool approve);
    event UpdateSupporter(address indexed supporter, bool approve);

    //CONSTRCTO
    constructor(uint256 _supporterFeeRatio) {
      supporterFeeRatio = _supporterFeeRatio;
    }

    //MAIN
    function stakeNFT(address _pool, uint256[] calldata _tokenIds) external {
        IPool(_pool).stakeNFT(_tokenIds, msg.sender);
        emit StakeNFT(msg.sender, _pool, _tokenIds);
    }

    function batchStakeNFT(
        address[] calldata _poolList,
        input[] calldata InputArray
    ) external {
        for (uint256 i = 0; i < _poolList.length; ) {
            IPool(_poolList[i]).stakeNFT(InputArray[i].tokenIds, msg.sender);
            emit StakeNFT(msg.sender, _poolList[i], InputArray[i].tokenIds);
            unchecked {
                ++i;
            }
        }
    }

    //@notice swap NFT → FT
    function swapNFTforFT(
        address _pool,
        uint256[] calldata _tokenIds,
        uint256 _minExpectFee,
        address _supporter
    ) external {
        require(_tokenIds.length > 0, "Not 0");
        IPool.PoolInfo memory _poolInfo = IPool(_pool).getPoolInfo();
        address _paymentToken = IPool(_pool).paymentToken();
        uint256 _totalFee = IPool(_pool).getCalcSellInfo(
            _tokenIds.length,
            _poolInfo.spotPrice
        );

        uint256 _profitAmount = IPool(_pool).swapNFTforFT(
            _tokenIds,
            _minExpectFee,
            msg.sender
        );
        _updateFee(_supporter, _paymentToken, _profitAmount);
        emit SwapNFTforFT(msg.sender, _pool, _tokenIds, _totalFee, _supporter);
    }

    //@notice batchSwapNFTforFT
    function batchSwapNFTforFT(
        address[] calldata _poolList,
        input[] calldata InputArray,
        uint256[] calldata _minExpects,
        address _supporter
    ) external payable {
        for (uint256 i = 0; i < _poolList.length; ) {
            require(InputArray[i].tokenIds.length > 0, "Not 0");
            IPool.PoolInfo memory _poolInfo = IPool(_poolList[i]).getPoolInfo();
            address _paymentToken = IPool(_poolList[i]).paymentToken();
            uint256 _totalFee = IPool(_poolList[i]).getCalcSellInfo(
                InputArray[i].tokenIds.length,
                _poolInfo.spotPrice
            );

            uint256 _profitAmount = IPool(_poolList[i]).swapNFTforFT(
                InputArray[i].tokenIds,
                _minExpects[i],
                msg.sender
            );

            _updateFee(_supporter, _paymentToken, _profitAmount);

            emit SwapNFTforFT(
                msg.sender,
                _poolList[i],
                InputArray[i].tokenIds,
                _totalFee,
                _supporter
            );
            unchecked {
                ++i;
            }
        }
    }

    //@notice swap FT → NFT
    function swapFTforNFT(
        address _pool,
        uint256[] calldata _tokenIds,
        address _supporter
    ) external payable {
        require(_tokenIds.length > 0, "Not 0");
        IPool.PoolInfo memory _poolInfo = IPool(_pool).getPoolInfo();
        address _paymentToken = IPool(_pool).paymentToken();
        uint256 _totalFee = IPool(_pool).getCalcBuyInfo(
            _tokenIds.length,
            _poolInfo.spotPrice
        );

        uint256 _profitAmount = IPool(_pool).swapFTforNFT{value: msg.value}(
            _tokenIds,
            msg.sender
        );
        _updateFee(_supporter, _paymentToken, _profitAmount);
        emit SwapFTforNFT(msg.sender, _pool, _tokenIds, _totalFee, _supporter);
    }

    //@notice batchSwapFTforNFT
    function batchSwapFTforNFT(
        address[] calldata _poolList,
        input[] calldata InputArray,
        address _supporter
    ) external payable {
        uint256 _remainFee = msg.value;
        for (uint256 i = 0; i < _poolList.length; ) {
            require(InputArray[i].tokenIds.length > 0, "Not 0");
            IPool.PoolInfo memory _poolInfo = IPool(_poolList[i]).getPoolInfo();
            address _paymentToken = IPool(_poolList[i]).paymentToken();
            uint256 _totalFee = IPool(_poolList[i]).getCalcBuyInfo(
                InputArray[i].tokenIds.length,
                _poolInfo.spotPrice
            );

            uint256 _profitAmount;
            if (_paymentToken == address(0)) {
                require(_remainFee >= _totalFee, "not enogh value");
                _remainFee -= _totalFee;

                _profitAmount = IPool(_poolList[i]).swapFTforNFT{
                    value: _totalFee
                }(InputArray[i].tokenIds, msg.sender);
            } else {
                _profitAmount = IPool(_poolList[i]).swapFTforNFT(
                    InputArray[i].tokenIds,
                    msg.sender
                );
            }

            _updateFee(_supporter, _paymentToken, _profitAmount);
            emit SwapFTforNFT(
                msg.sender,
                _poolList[i],
                InputArray[i].tokenIds,
                _totalFee,
                _supporter
            );
            unchecked {
                ++i;
            }
        }
        if (_remainFee > 0) {
            payable(msg.sender).transfer(_remainFee);
        }
    }

    //@notice withdraw NFT and Fee
    function withdrawNFT(address _pool, uint256[] calldata _tokenIds) external {
        uint256 _totalFee = IPool(_pool).withdrawNFT(_tokenIds, msg.sender);
        emit WithdrawNFT(msg.sender, _pool, _tokenIds, _totalFee);
    }

    //@notice withdraw part NFT
    function withdrawNFTpart(address _pool, uint256[] calldata _tokenIds) external {
      IPool(_pool).withdrawNFTpart(_tokenIds, msg.sender);
      emit WithdrawNFTpart(msg.sender, _pool, _tokenIds);
    }

    //@notice withdraw protocol fee
    function withdrawProtocolFee(address _paymentToken)
        external
        payable
        onlyOwner
    {
        uint256 _totalFee = totalProtocolFee[_paymentToken];
        uint256 _totalBalance = totalFee[_paymentToken];
        if (_paymentToken == address(0)) {
            //check
            require(_totalFee > 0 || address(this).balance > _totalBalance, "Not Fee");

            //effect
            totalProtocolFee[_paymentToken] = 0;
            totalFee[_paymentToken] -= _totalFee;
            uint256 subProtocolFee = address(this).balance - _totalBalance;
            _totalFee += subProtocolFee;
            
            //intaraction
            payable(msg.sender).transfer(_totalFee);
        } else {
            //check
            require(_totalFee > 0 || IERC20(_paymentToken).balanceOf(address(this)) > totalFee[_paymentToken], "Not Fee");

            //effect
            totalProtocolFee[_paymentToken] = 0;
            totalFee[_paymentToken] -= _totalFee;
            uint256 subProtocolFee = IERC20(_paymentToken).balanceOf(address(this)) - totalFee[_paymentToken];
            _totalFee += subProtocolFee;

            //intaraction
            IERC20(_paymentToken).transfer(msg.sender, _totalFee);
        }
    }

    function withdrawFee(address _pool) external payable {
      IPool(_pool).withdrawFee(msg.sender);
    }

    //@notice withdraw support fee
    function withdrawSupportFee(address _paymentToken) external payable {
        uint256 _totalFee = supporterFee[msg.sender][_paymentToken];

        //check
        require(_totalFee > 0, "Not Fee");

        //effect
        supporterFee[msg.sender][_paymentToken] = 0;
        totalFee[_paymentToken] -= _totalFee;


        //intaraction
        if (_paymentToken == address(0)) {
            payable(msg.sender).transfer(_totalFee);
        } else {
            IERC20(_paymentToken).transfer(msg.sender, _totalFee);
        }
    }

    function reset(
        address _pool,
        address _bondingCurve,
        uint256 _newSpotPrice, 
        uint256 _newDelta, 
        uint256 _newSpread
    ) external {
        IPool(_pool).reset(_bondingCurve,_newSpotPrice,_newDelta,_newSpread, msg.sender);
        emit UpdatePoolParam(_pool);
    }

    function withdrawOtherFT(address _pool,uint256 _amount, address _user) external payable {
      IPool(_pool).withdrawOtherFT(_amount, _user);
    }

    //@notice withdraw FT
    function withdrawOtherNFT(address _pool, address _collection, uint256 _tokenId, address _user)external{
      IPool(_pool).withdrawOtherNFT(_collection, _tokenId, _user);
    }

    //GET
    //@notice get approve of collection
    function getIsCollectionApprove(address _collection)
        external
        view
        returns (bool)
    {
        return isCollectionApprove[_collection];
    }

    //@notice get approve of bonding curve
    function getIsBondingCurveApprove(address _bondingCurve)
        external
        view
        returns (bool)
    {
        return isBondingCurveApprove[_bondingCurve];
    }

    //@notice get approve of bonding curve
    function getIsPaymentTokenApprove(address _paymentToken)
        external
        view
        returns (bool)
    {
        return isPaymentTokenApprove[_paymentToken];
    }

    //@notice get approve of bonding curve
    function getIsFactoryApprove(address _factory)
        external
        view
        returns (bool)
    {
        return isFactoryApprove[_factory];
    }

    //@notice get approve of bonding curve
    function getIsSupporterApprove(address _supporter)
        external
        view
        returns (bool)
    {
        return isSupporterApprove[_supporter];
    }

    //@notice get fee of protocol
    function getTotalProtocolFee(address _paymentToken) external view returns(uint256){
      uint256 _totalFee = totalProtocolFee[_paymentToken];
        if (_paymentToken == address(0)) {
            uint256 subProtocolFee = address(this).balance - totalFee[_paymentToken];
            _totalFee += subProtocolFee;
        } else {
            uint256 subProtocolFee = IERC20(_paymentToken).balanceOf(address(this)) - totalFee[_paymentToken];
            _totalFee += subProtocolFee;
        }
        return _totalFee;
    }

    //@notice get fee of supporter
    function getSupporterFee(address _supporter, address _paymentToken)external view returns(uint256){
      return supporterFee[_supporter][_paymentToken];
    }

    //SET
    //@notice approve for bonding curve
    function setCollectionApprove(address _collection, bool _approve)
        external
        onlyOwner
    {
        isCollectionApprove[_collection] = _approve;
        emit UpdateCollection(_collection, _approve);
    }

    //@notice approve for bonding curve
    function setBondingCurveApprove(address _bondingCurve, bool _approve)
        external
        onlyOwner
    {
        isBondingCurveApprove[_bondingCurve] = _approve;
        emit UpdateBondingCurve(_bondingCurve, _approve);
    }

    //@notice approve for bonding curve
    function setPaymentTokenApprove(address _paymentToken, bool _approve)
        external
        onlyOwner
    {
        isPaymentTokenApprove[_paymentToken] = _approve;
        emit UpdatePaymentToken(_paymentToken, _approve);
    }

    //@notice set approve for factory
    function setFactoryApprove(address _factory, bool _approve)
        external
        onlyOwner
    {
        isFactoryApprove[_factory] = _approve;
        emit UpdateFactory(_factory, _approve);
    }

    //@notice set approve for supporter
    function setSupporterApprove(address _supporter, bool _approve)
        external
        onlyOwner
    {
        isSupporterApprove[_supporter] = _approve;
        emit UpdateSupporter(_supporter, _approve);
    }

    //@notice set protocolFeeRatio for pool
    function setSupporterFeeRatio(
        uint256 _newSupporterFeeRatio
    ) external onlyOwner {
        supporterFeeRatio = _newSupporterFeeRatio;
    }

    //@notice set protocolFeeRatio for pool
    function setPoolProtocolFeeRatio(
        address _pool,
        uint256 _newProtocolFeeRatio
    ) external onlyOwner {
        IPool(_pool).setProtocolFeeRatio(_newProtocolFeeRatio);
    }

    //@notice set protocolFeeRatio
    function setPoolRouter(address _pool, address _newRouter)
        external
        onlyOwner
    {
        IPool(_pool).setRouter(_newRouter);
    }

    //@notice set pool
    function setPool(address _pool, bool _approve) external onlyFactory {
        emit UpdatePool(_pool, _approve);
    }

    //INTERNAL
    //@notice calc update fee
    function _updateFee(
        address _supporter,
        address _paymentToken,
        uint256 _profitAmount
    ) internal {
        totalFee[_paymentToken] += _profitAmount;
        if (_supporter != address(0)) {
            uint256 _supporterFee = _profitAmount.fmul(
                supporterFeeRatio,
                FixedPointMathLib.WAD
            );
            uint256 _protocolFee = _profitAmount - _supporterFee;
            totalProtocolFee[_paymentToken] += _protocolFee;
            supporterFee[_supporter][_paymentToken] += _supporterFee;
        } else if (_supporter == address(0)) {
            totalProtocolFee[_paymentToken] += _profitAmount;
        }
    }

    //@notice receive関数
    fallback() external payable{}
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_supporterFeeRatio","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"StakeNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"totalFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"supporter","type":"address"}],"name":"SwapFTforNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"totalFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"supporter","type":"address"}],"name":"SwapNFTforFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bondingCurve","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"UpdateBondingCurve","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"UpdateCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"factory","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"UpdateFactory","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"paymentToken","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"UpdatePaymentToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"UpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"}],"name":"UpdatePoolParam","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"supporter","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"UpdateSupporter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"userFee","type":"uint256"}],"name":"WithdrawFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"userAmount","type":"uint256"}],"name":"WithdrawNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"WithdrawNFTpart","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address[]","name":"_poolList","type":"address[]"},{"components":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"internalType":"struct Router.input[]","name":"InputArray","type":"tuple[]"}],"name":"batchStakeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_poolList","type":"address[]"},{"components":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"internalType":"struct Router.input[]","name":"InputArray","type":"tuple[]"},{"internalType":"address","name":"_supporter","type":"address"}],"name":"batchSwapFTforNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_poolList","type":"address[]"},{"components":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"internalType":"struct Router.input[]","name":"InputArray","type":"tuple[]"},{"internalType":"uint256[]","name":"_minExpects","type":"uint256[]"},{"internalType":"address","name":"_supporter","type":"address"}],"name":"batchSwapNFTforFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_bondingCurve","type":"address"}],"name":"getIsBondingCurveApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"}],"name":"getIsCollectionApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"getIsFactoryApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentToken","type":"address"}],"name":"getIsPaymentTokenApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_supporter","type":"address"}],"name":"getIsSupporterApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_supporter","type":"address"},{"internalType":"address","name":"_paymentToken","type":"address"}],"name":"getSupporterFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentToken","type":"address"}],"name":"getTotalProtocolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"address","name":"_bondingCurve","type":"address"},{"internalType":"uint256","name":"_newSpotPrice","type":"uint256"},{"internalType":"uint256","name":"_newDelta","type":"uint256"},{"internalType":"uint256","name":"_newSpread","type":"uint256"}],"name":"reset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bondingCurve","type":"address"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"setBondingCurveApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"setCollectionApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"setFactoryApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentToken","type":"address"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"setPaymentTokenApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_newProtocolFeeRatio","type":"uint256"}],"name":"setPoolProtocolFeeRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"address","name":"_newRouter","type":"address"}],"name":"setPoolRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_supporter","type":"address"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"setSupporterApprove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupporterFeeRatio","type":"uint256"}],"name":"setSupporterFeeRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"stakeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supporterFeeRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"address","name":"_supporter","type":"address"}],"name":"swapFTforNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"_minExpectFee","type":"uint256"},{"internalType":"address","name":"_supporter","type":"address"}],"name":"swapNFTforFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"withdrawFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdrawNFTpart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"withdrawOtherFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"address","name":"_collection","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"withdrawOtherNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentToken","type":"address"}],"name":"withdrawProtocolFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentToken","type":"address"}],"name":"withdrawSupportFee","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040516200463638038062004636833981810160405281019062000037919062000171565b620000576200004b6200006560201b60201c565b6200006d60201b60201c565b8060018190555050620001a3565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b6000819050919050565b6200014b8162000136565b81146200015757600080fd5b50565b6000815190506200016b8162000140565b92915050565b6000602082840312156200018a576200018962000131565b5b60006200019a848285016200015a565b91505092915050565b61448380620001b36000396000f3fe6080604052600436106102085760003560e01c80638da5cb5b11610118578063d86ee259116100a0578063f2fde38b1161006f578063f2fde38b1461070f578063f9bb21bf14610738578063fc5a0df514610761578063fc9d16cd1461079e578063fd7bb9b5146107c75761020f565b8063d86ee25914610671578063dd4b533f1461068d578063e1549300146106b6578063ec217ea6146106d25761020f565b80639c9206d2116100e75780639c9206d214610587578063b65bfbf0146105b0578063bc0a0bd0146105ed578063cab5c30e14610618578063ce9061fa146106345761020f565b80638da5cb5b146104e15780639175a5881461050c57806394a36eac146105355780639bdedea51461055e5761020f565b80633d9b66a81161019b5780636a64d3d21161016a5780636a64d3d2146103fe578063715018a61461043b5780637a4fda3d1461045257806386b99ec11461048f5780638d3b6eb3146104b85761020f565b80633d9b66a81461033f57806348f900551461037c5780635617811d146103a5578063668fb6dc146103e25761020f565b806320bec12c116101d757806320bec12c1461029b5780632e091d53146102c457806330d6d64d146102ed57806338e8a1d1146103165761020f565b80630f4c2192146102115780631824d4391461023a57806318892c5d146102635780631ac3ddeb1461027f5761020f565b3661020f57005b005b34801561021d57600080fd5b5061023860048036038101906102339190613485565b6107e3565b005b34801561024657600080fd5b50610261600480360381019061025c91906134c5565b61085a565b005b61027d60048036038101906102789190613616565b6108d1565b005b610299600480360381019061029491906136df565b610d4d565b005b3480156102a757600080fd5b506102c260048036038101906102bd9190613744565b610dbb565b005b3480156102d057600080fd5b506102eb60048036038101906102e69190613784565b610ea0565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613805565b611048565b005b34801561032257600080fd5b5061033d60048036038101906103389190613744565b611123565b005b34801561034b57600080fd5b50610366600480360381019061036191906134c5565b6111d4565b6040516103739190613874565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e919061388f565b61125b565b005b3480156103b157600080fd5b506103cc60048036038101906103c791906136df565b6112d0565b6040516103d99190613874565b60405180910390f35b6103fc60048036038101906103f791906136df565b61148d565b005b34801561040a57600080fd5b50610425600480360381019061042091906136df565b6119a0565b6040516104329190613905565b60405180910390f35b34801561044757600080fd5b506104506119f6565b005b34801561045e57600080fd5b50610479600480360381019061047491906136df565b611a0a565b6040516104869190613874565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190613744565b611a22565b005b3480156104c457600080fd5b506104df60048036038101906104da9190613744565b611ad3565b005b3480156104ed57600080fd5b506104f6611b84565b604051610503919061392f565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190613805565b611bad565b005b34801561054157600080fd5b5061055c6004803603810190610557919061394a565b611c88565b005b34801561056a57600080fd5b5061058560048036038101906105809190613805565b611d45565b005b34801561059357600080fd5b506105ae60048036038101906105a99190613744565b611e38565b005b3480156105bc57600080fd5b506105d760048036038101906105d291906136df565b611ee9565b6040516105e49190613905565b60405180910390f35b3480156105f957600080fd5b50610602611f3f565b60405161060f9190613874565b60405180910390f35b610632600480360381019061062d91906139c5565b611f45565b005b34801561064057600080fd5b5061065b600480360381019061065691906136df565b6121ff565b6040516106689190613905565b60405180910390f35b61068b60048036038101906106869190613a39565b612255565b005b34801561069957600080fd5b506106b460048036038101906106af9190613a8c565b6122c7565b005b6106d060048036038101906106cb91906136df565b612583565b005b3480156106de57600080fd5b506106f960048036038101906106f491906136df565b612823565b6040516107069190613905565b60405180910390f35b34801561071b57600080fd5b50610736600480360381019061073191906136df565b612879565b005b34801561074457600080fd5b5061075f600480360381019061075a9190613b14565b6128fc565b005b34801561076d57600080fd5b50610788600480360381019061078391906136df565b61290e565b6040516107959190613905565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190613744565b612964565b005b6107e160048036038101906107dc9190613b41565b612a15565b005b6107eb613031565b8173ffffffffffffffffffffffffffffffffffffffff166341ede57e826040518263ffffffff1660e01b81526004016108249190613874565b600060405180830381600087803b15801561083e57600080fd5b505af1158015610852573d6000803e3d6000fd5b505050505050565b610862613031565b8173ffffffffffffffffffffffffffffffffffffffff1663c0d78655826040518263ffffffff1660e01b815260040161089b919061392f565b600060405180830381600087803b1580156108b557600080fd5b505af11580156108c9573d6000803e3d6000fd5b505050505050565b60005b87879050811015610d435760008686838181106108f4576108f3613bd6565b5b90506020028101906109069190613c14565b80600001906109159190613c3c565b905011610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094e90613cfc565b60405180910390fd5b600088888381811061096c5761096b613bd6565b5b905060200201602081019061098191906136df565b73ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa1580156109cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ef9190613e4e565b90506000898984818110610a0657610a05613bd6565b5b9050602002016020810190610a1b91906136df565b73ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8b9190613e90565b905060008a8a85818110610aa257610aa1613bd6565b5b9050602002016020810190610ab791906136df565b73ffffffffffffffffffffffffffffffffffffffff166388e5cd1f8a8a87818110610ae557610ae4613bd6565b5b9050602002810190610af79190613c14565b8060000190610b069190613c3c565b905085600001516040518363ffffffff1660e01b8152600401610b2a929190613ebd565b602060405180830381865afa158015610b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6b9190613ee6565b905060008b8b86818110610b8257610b81613bd6565b5b9050602002016020810190610b9791906136df565b73ffffffffffffffffffffffffffffffffffffffff1663244117b48b8b88818110610bc557610bc4613bd6565b5b9050602002810190610bd79190613c14565b8060000190610be69190613c3c565b8b8b8a818110610bf957610bf8613bd6565b5b90506020020135336040518563ffffffff1660e01b8152600401610c209493929190613f8e565b6020604051808303816000875af1158015610c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c639190613ee6565b9050610c708684836130af565b8b8b86818110610c8357610c82613bd6565b5b9050602002016020810190610c9891906136df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8f3673bd023cc34f252b9e7d0a0dd6496592b87006673a974d1d621b5a93e15e8c8c89818110610cf957610cf8613bd6565b5b9050602002810190610d0b9190613c14565b8060000190610d1a9190613c3c565b868b604051610d2c9493929190613f8e565b60405180910390a3846001019450505050506108d4565b5050505050505050565b8073ffffffffffffffffffffffffffffffffffffffff16631ac3ddeb336040518263ffffffff1660e01b8152600401610d86919061392f565b600060405180830381600087803b158015610da057600080fd5b505af1158015610db4573d6000803e3d6000fd5b5050505050565b60011515600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e459061401a565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f16f5dd05aa4fb9d233806a07de5cc48d6893f315e214cce8974b6e951b655c6b82604051610e949190613905565b60405180910390a25050565b60005b8484905081101561104157848482818110610ec157610ec0613bd6565b5b9050602002016020810190610ed691906136df565b73ffffffffffffffffffffffffffffffffffffffff16632f7e0b2e848484818110610f0457610f03613bd6565b5b9050602002810190610f169190613c14565b8060000190610f259190613c3c565b336040518463ffffffff1660e01b8152600401610f449392919061403a565b600060405180830381600087803b158015610f5e57600080fd5b505af1158015610f72573d6000803e3d6000fd5b50505050848482818110610f8957610f88613bd6565b5b9050602002016020810190610f9e91906136df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7c0a46ce3acb6a46fffede953868812e9045bc3e16fb727004e10272ddfad74e858585818110610fff57610ffe613bd6565b5b90506020028101906110119190613c14565b80600001906110209190613c3c565b60405161102e92919061406c565b60405180910390a3806001019050610ea3565b5050505050565b8273ffffffffffffffffffffffffffffffffffffffff1663f968f33b8383336040518463ffffffff1660e01b81526004016110859392919061403a565b600060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff4a476d3c8307c48588449bd904be8e33979939dd8cddeca9a78f6d336311576848460405161111692919061406c565b60405180910390a3505050565b61112b613031565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fc01b4a3b37bda477d1b60e1d10e03272f94fbe6d08b3c72f8a4a7e35bcd93b02826040516111c89190613905565b60405180910390a25050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b8373ffffffffffffffffffffffffffffffffffffffff1663a09f32118484846040518463ffffffff1660e01b815260040161129893929190614090565b600060405180830381600087803b1580156112b257600080fd5b505af11580156112c6573d6000803e3d6000fd5b5050505050505050565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113ac576000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544761139691906140f6565b905080826113a4919061412a565b915050611484565b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611427919061392f565b602060405180830381865afa158015611444573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114689190613ee6565b61147291906140f6565b90508082611480919061412a565b9150505b80915050919050565b611495613031565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116a457600082118061155f57508047115b61159e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611595906141aa565b60405180910390fd5b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461163291906140f6565b925050819055506000814761164791906140f6565b90508083611655919061412a565b92503373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561169d573d6000803e3d6000fd5b505061199b565b600082118061176a5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611727919061392f565b602060405180830381865afa158015611744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117689190613ee6565b115b6117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a0906141aa565b60405180910390fd5b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461183d91906140f6565b925050819055506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118bf919061392f565b602060405180830381865afa1580156118dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119009190613ee6565b61190a91906140f6565b90508083611918919061412a565b92508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b81526004016119559291906141ca565b6020604051808303816000875af1158015611974573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119989190614208565b50505b505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6119fe613031565b611a0860006132ed565b565b60076020528060005260406000206000915090505481565b611a2a613031565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f11b4c2b6450da8949b70f94de747d396f0a4fcedf7ffefe7332d323dd210258a82604051611ac79190613905565b60405180910390a25050565b611adb613031565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fa5863f03ddba3042b23731d7fba300e6f264d1c0cabf85630064d6ecbd01853b82604051611b789190613905565b60405180910390a25050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8273ffffffffffffffffffffffffffffffffffffffff16632f7e0b2e8383336040518463ffffffff1660e01b8152600401611bea9392919061403a565b600060405180830381600087803b158015611c0457600080fd5b505af1158015611c18573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7c0a46ce3acb6a46fffede953868812e9045bc3e16fb727004e10272ddfad74e8484604051611c7b92919061406c565b60405180910390a3505050565b8473ffffffffffffffffffffffffffffffffffffffff1663f829e9fc85858585336040518663ffffffff1660e01b8152600401611cc9959493929190614235565b600060405180830381600087803b158015611ce357600080fd5b505af1158015611cf7573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff167f02f0328fc2c71376910c0a5e2be622213d6eeb426118ef65ae5b3593864b668160405160405180910390a25050505050565b60008373ffffffffffffffffffffffffffffffffffffffff16632c7e49158484336040518463ffffffff1660e01b8152600401611d849392919061403a565b6020604051808303816000875af1158015611da3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc79190613ee6565b90508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcd715c6f851d1dc11755804a0c2e5da8792da275e44c1ee713771d7479bce8fd858585604051611e2a93929190614288565b60405180910390a350505050565b611e40613031565b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f1c3c313576907bc91320c98e637bcadb2f200b2af1b9ba3036662819961ae0d482604051611edd9190613905565b60405180910390a25050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60015481565b60008383905011611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290613cfc565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa158015611fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffc9190613e4e565b905060008573ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af115801561204d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120719190613e90565b905060008673ffffffffffffffffffffffffffffffffffffffff166365b962318787905085600001516040518363ffffffff1660e01b81526004016120b7929190613ebd565b602060405180830381865afa1580156120d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f89190613ee6565b905060008773ffffffffffffffffffffffffffffffffffffffff16634c4cbac4348989336040518563ffffffff1660e01b815260040161213a9392919061403a565b60206040518083038185885af1158015612158573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061217d9190613ee6565b905061218a8584836130af565b8773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2611defd53a4a87419d2078554db30aeaddd9ddfdc5990da2bbdc8d589f5e4d68989868a6040516121ed9493929190613f8e565b60405180910390a35050505050505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b8273ffffffffffffffffffffffffffffffffffffffff1663efb1765983836040518363ffffffff1660e01b81526004016122909291906142ba565b600060405180830381600087803b1580156122aa57600080fd5b505af11580156122be573d6000803e3d6000fd5b50505050505050565b6000848490501161230d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230490613cfc565b60405180910390fd5b60008573ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa15801561235a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237e9190613e4e565b905060008673ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af11580156123cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f39190613e90565b905060008773ffffffffffffffffffffffffffffffffffffffff166388e5cd1f8888905085600001516040518363ffffffff1660e01b8152600401612439929190613ebd565b602060405180830381865afa158015612456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247a9190613ee6565b905060008873ffffffffffffffffffffffffffffffffffffffff1663244117b4898989336040518563ffffffff1660e01b81526004016124bd9493929190613f8e565b6020604051808303816000875af11580156124dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125009190613ee6565b905061250d8584836130af565b8873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8f3673bd023cc34f252b9e7d0a0dd6496592b87006673a974d1d621b5a93e15e8a8a868a6040516125709493929190613f8e565b60405180910390a3505050505050505050565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e906141aa565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461271891906140f6565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361279f573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612799573d6000803e3d6000fd5b5061281f565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016127da9291906141ca565b6020604051808303816000875af11580156127f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281d9190614208565b505b5050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612881613031565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e790614355565b60405180910390fd5b6128f9816132ed565b50565b612904613031565b8060018190555050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61296c613031565b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167ff1a7d235323609d0e57be8421b6b457060a5778dce9db39be3d530b141a3c70982604051612a099190613905565b60405180910390a25050565b600034905060005b86869050811015612fd7576000858583818110612a3d57612a3c613bd6565b5b9050602002810190612a4f9190613c14565b8060000190612a5e9190613c3c565b905011612aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9790613cfc565b60405180910390fd5b6000878783818110612ab557612ab4613bd6565b5b9050602002016020810190612aca91906136df565b73ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa158015612b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b389190613e4e565b90506000888884818110612b4f57612b4e613bd6565b5b9050602002016020810190612b6491906136df565b73ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd49190613e90565b90506000898985818110612beb57612bea613bd6565b5b9050602002016020810190612c0091906136df565b73ffffffffffffffffffffffffffffffffffffffff166365b96231898987818110612c2e57612c2d613bd6565b5b9050602002810190612c409190613c14565b8060000190612c4f9190613c3c565b905085600001516040518363ffffffff1660e01b8152600401612c73929190613ebd565b602060405180830381865afa158015612c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb49190613ee6565b905060008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e1d5781861015612d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d25906143c1565b60405180910390fd5b8186612d3a91906140f6565b95508a8a86818110612d4f57612d4e613bd6565b5b9050602002016020810190612d6491906136df565b73ffffffffffffffffffffffffffffffffffffffff16634c4cbac4838b8b89818110612d9357612d92613bd6565b5b9050602002810190612da59190613c14565b8060000190612db49190613c3c565b336040518563ffffffff1660e01b8152600401612dd39392919061403a565b60206040518083038185885af1158015612df1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612e169190613ee6565b9050612ef9565b8a8a86818110612e3057612e2f613bd6565b5b9050602002016020810190612e4591906136df565b73ffffffffffffffffffffffffffffffffffffffff16634c4cbac48a8a88818110612e7357612e72613bd6565b5b9050602002810190612e859190613c14565b8060000190612e949190613c3c565b336040518463ffffffff1660e01b8152600401612eb39392919061403a565b6020604051808303816000875af1158015612ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef69190613ee6565b90505b612f048784836130af565b8a8a86818110612f1757612f16613bd6565b5b9050602002016020810190612f2c91906136df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2611defd53a4a87419d2078554db30aeaddd9ddfdc5990da2bbdc8d589f5e4d68b8b89818110612f8d57612f8c613bd6565b5b9050602002810190612f9f9190613c14565b8060000190612fae9190613c3c565b868c604051612fc09493929190613f8e565b60405180910390a384600101945050505050612a1d565b506000811115613029573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613027573d6000803e3d6000fd5b505b505050505050565b6130396133b1565b73ffffffffffffffffffffffffffffffffffffffff16613057611b84565b73ffffffffffffffffffffffffffffffffffffffff16146130ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a49061442d565b60405180910390fd5b565b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130fe919061412a565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461325c57600061315a600154670de0b6b3a7640000846133b99092919063ffffffff16565b90506000818361316a91906140f6565b905080600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131bb919061412a565b9250508190555081600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461324e919061412a565b9250508190555050506132e8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036132e75780600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132df919061412a565b925050819055505b5b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000828402905082848204148415176133d157600080fd5b81810490509392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061341c826133f1565b9050919050565b61342c81613411565b811461343757600080fd5b50565b60008135905061344981613423565b92915050565b6000819050919050565b6134628161344f565b811461346d57600080fd5b50565b60008135905061347f81613459565b92915050565b6000806040838503121561349c5761349b6133e7565b5b60006134aa8582860161343a565b92505060206134bb85828601613470565b9150509250929050565b600080604083850312156134dc576134db6133e7565b5b60006134ea8582860161343a565b92505060206134fb8582860161343a565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261352a57613529613505565b5b8235905067ffffffffffffffff8111156135475761354661350a565b5b6020830191508360208202830111156135635761356261350f565b5b9250929050565b60008083601f8401126135805761357f613505565b5b8235905067ffffffffffffffff81111561359d5761359c61350a565b5b6020830191508360208202830111156135b9576135b861350f565b5b9250929050565b60008083601f8401126135d6576135d5613505565b5b8235905067ffffffffffffffff8111156135f3576135f261350a565b5b60208301915083602082028301111561360f5761360e61350f565b5b9250929050565b60008060008060008060006080888a031215613635576136346133e7565b5b600088013567ffffffffffffffff811115613653576136526133ec565b5b61365f8a828b01613514565b9750975050602088013567ffffffffffffffff811115613682576136816133ec565b5b61368e8a828b0161356a565b9550955050604088013567ffffffffffffffff8111156136b1576136b06133ec565b5b6136bd8a828b016135c0565b935093505060606136d08a828b0161343a565b91505092959891949750929550565b6000602082840312156136f5576136f46133e7565b5b60006137038482850161343a565b91505092915050565b60008115159050919050565b6137218161370c565b811461372c57600080fd5b50565b60008135905061373e81613718565b92915050565b6000806040838503121561375b5761375a6133e7565b5b60006137698582860161343a565b925050602061377a8582860161372f565b9150509250929050565b6000806000806040858703121561379e5761379d6133e7565b5b600085013567ffffffffffffffff8111156137bc576137bb6133ec565b5b6137c887828801613514565b9450945050602085013567ffffffffffffffff8111156137eb576137ea6133ec565b5b6137f78782880161356a565b925092505092959194509250565b60008060006040848603121561381e5761381d6133e7565b5b600061382c8682870161343a565b935050602084013567ffffffffffffffff81111561384d5761384c6133ec565b5b613859868287016135c0565b92509250509250925092565b61386e8161344f565b82525050565b60006020820190506138896000830184613865565b92915050565b600080600080608085870312156138a9576138a86133e7565b5b60006138b78782880161343a565b94505060206138c88782880161343a565b93505060406138d987828801613470565b92505060606138ea8782880161343a565b91505092959194509250565b6138ff8161370c565b82525050565b600060208201905061391a60008301846138f6565b92915050565b61392981613411565b82525050565b60006020820190506139446000830184613920565b92915050565b600080600080600060a08688031215613966576139656133e7565b5b60006139748882890161343a565b95505060206139858882890161343a565b945050604061399688828901613470565b93505060606139a788828901613470565b92505060806139b888828901613470565b9150509295509295909350565b600080600080606085870312156139df576139de6133e7565b5b60006139ed8782880161343a565b945050602085013567ffffffffffffffff811115613a0e57613a0d6133ec565b5b613a1a878288016135c0565b93509350506040613a2d8782880161343a565b91505092959194509250565b600080600060608486031215613a5257613a516133e7565b5b6000613a608682870161343a565b9350506020613a7186828701613470565b9250506040613a828682870161343a565b9150509250925092565b600080600080600060808688031215613aa857613aa76133e7565b5b6000613ab68882890161343a565b955050602086013567ffffffffffffffff811115613ad757613ad66133ec565b5b613ae3888289016135c0565b94509450506040613af688828901613470565b9250506060613b078882890161343a565b9150509295509295909350565b600060208284031215613b2a57613b296133e7565b5b6000613b3884828501613470565b91505092915050565b600080600080600060608688031215613b5d57613b5c6133e7565b5b600086013567ffffffffffffffff811115613b7b57613b7a6133ec565b5b613b8788828901613514565b9550955050602086013567ffffffffffffffff811115613baa57613ba96133ec565b5b613bb68882890161356a565b93509350506040613bc98882890161343a565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600082356001602003833603038112613c3057613c2f613c05565b5b80830191505092915050565b60008083356001602003843603038112613c5957613c58613c05565b5b80840192508235915067ffffffffffffffff821115613c7b57613c7a613c0a565b5b602083019250602082023603831315613c9757613c96613c0f565b5b509250929050565b600082825260208201905092915050565b7f4e6f742030000000000000000000000000000000000000000000000000000000600082015250565b6000613ce6600583613c9f565b9150613cf182613cb0565b602082019050919050565b60006020820190508181036000830152613d1581613cd9565b9050919050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d6a82613d21565b810181811067ffffffffffffffff82111715613d8957613d88613d32565b5b80604052505050565b6000613d9c6133dd565b9050613da88282613d61565b919050565b600081519050613dbc81613459565b92915050565b600060a08284031215613dd857613dd7613d1c565b5b613de260a0613d92565b90506000613df284828501613dad565b6000830152506020613e0684828501613dad565b6020830152506040613e1a84828501613dad565b6040830152506060613e2e84828501613dad565b6060830152506080613e4284828501613dad565b60808301525092915050565b600060a08284031215613e6457613e636133e7565b5b6000613e7284828501613dc2565b91505092915050565b600081519050613e8a81613423565b92915050565b600060208284031215613ea657613ea56133e7565b5b6000613eb484828501613e7b565b91505092915050565b6000604082019050613ed26000830185613865565b613edf6020830184613865565b9392505050565b600060208284031215613efc57613efb6133e7565b5b6000613f0a84828501613dad565b91505092915050565b600082825260208201905092915050565b600080fd5b82818337505050565b6000613f3e8385613f13565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613f7157613f70613f24565b5b602083029250613f82838584613f29565b82840190509392505050565b60006060820190508181036000830152613fa9818688613f32565b9050613fb86020830185613865565b613fc56040830184613920565b95945050505050565b7f6f6e6c79466163746f7279000000000000000000000000000000000000000000600082015250565b6000614004600b83613c9f565b915061400f82613fce565b602082019050919050565b6000602082019050818103600083015261403381613ff7565b9050919050565b60006040820190508181036000830152614055818587613f32565b90506140646020830184613920565b949350505050565b60006020820190508181036000830152614087818486613f32565b90509392505050565b60006060820190506140a56000830186613920565b6140b26020830185613865565b6140bf6040830184613920565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141018261344f565b915061410c8361344f565b9250828203905081811115614124576141236140c7565b5b92915050565b60006141358261344f565b91506141408361344f565b9250828201905080821115614158576141576140c7565b5b92915050565b7f4e6f742046656500000000000000000000000000000000000000000000000000600082015250565b6000614194600783613c9f565b915061419f8261415e565b602082019050919050565b600060208201905081810360008301526141c381614187565b9050919050565b60006040820190506141df6000830185613920565b6141ec6020830184613865565b9392505050565b60008151905061420281613718565b92915050565b60006020828403121561421e5761421d6133e7565b5b600061422c848285016141f3565b91505092915050565b600060a08201905061424a6000830188613920565b6142576020830187613865565b6142646040830186613865565b6142716060830185613865565b61427e6080830184613920565b9695505050505050565b600060408201905081810360008301526142a3818587613f32565b90506142b26020830184613865565b949350505050565b60006040820190506142cf6000830185613865565b6142dc6020830184613920565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061433f602683613c9f565b915061434a826142e3565b604082019050919050565b6000602082019050818103600083015261436e81614332565b9050919050565b7f6e6f7420656e6f67682076616c75650000000000000000000000000000000000600082015250565b60006143ab600f83613c9f565b91506143b682614375565b602082019050919050565b600060208201905081810360008301526143da8161439e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614417602083613c9f565b9150614422826143e1565b602082019050919050565b600060208201905081810360008301526144468161440a565b905091905056fea2646970667358221220dda5a4ce2536514f0903596cd3704c0b999a32c2aec1a9e9ff0944a488c65cc664736f6c634300081100330000000000000000000000000000000000000000000000000429d069189e0000

Deployed Bytecode

0x6080604052600436106102085760003560e01c80638da5cb5b11610118578063d86ee259116100a0578063f2fde38b1161006f578063f2fde38b1461070f578063f9bb21bf14610738578063fc5a0df514610761578063fc9d16cd1461079e578063fd7bb9b5146107c75761020f565b8063d86ee25914610671578063dd4b533f1461068d578063e1549300146106b6578063ec217ea6146106d25761020f565b80639c9206d2116100e75780639c9206d214610587578063b65bfbf0146105b0578063bc0a0bd0146105ed578063cab5c30e14610618578063ce9061fa146106345761020f565b80638da5cb5b146104e15780639175a5881461050c57806394a36eac146105355780639bdedea51461055e5761020f565b80633d9b66a81161019b5780636a64d3d21161016a5780636a64d3d2146103fe578063715018a61461043b5780637a4fda3d1461045257806386b99ec11461048f5780638d3b6eb3146104b85761020f565b80633d9b66a81461033f57806348f900551461037c5780635617811d146103a5578063668fb6dc146103e25761020f565b806320bec12c116101d757806320bec12c1461029b5780632e091d53146102c457806330d6d64d146102ed57806338e8a1d1146103165761020f565b80630f4c2192146102115780631824d4391461023a57806318892c5d146102635780631ac3ddeb1461027f5761020f565b3661020f57005b005b34801561021d57600080fd5b5061023860048036038101906102339190613485565b6107e3565b005b34801561024657600080fd5b50610261600480360381019061025c91906134c5565b61085a565b005b61027d60048036038101906102789190613616565b6108d1565b005b610299600480360381019061029491906136df565b610d4d565b005b3480156102a757600080fd5b506102c260048036038101906102bd9190613744565b610dbb565b005b3480156102d057600080fd5b506102eb60048036038101906102e69190613784565b610ea0565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613805565b611048565b005b34801561032257600080fd5b5061033d60048036038101906103389190613744565b611123565b005b34801561034b57600080fd5b50610366600480360381019061036191906134c5565b6111d4565b6040516103739190613874565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e919061388f565b61125b565b005b3480156103b157600080fd5b506103cc60048036038101906103c791906136df565b6112d0565b6040516103d99190613874565b60405180910390f35b6103fc60048036038101906103f791906136df565b61148d565b005b34801561040a57600080fd5b50610425600480360381019061042091906136df565b6119a0565b6040516104329190613905565b60405180910390f35b34801561044757600080fd5b506104506119f6565b005b34801561045e57600080fd5b50610479600480360381019061047491906136df565b611a0a565b6040516104869190613874565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190613744565b611a22565b005b3480156104c457600080fd5b506104df60048036038101906104da9190613744565b611ad3565b005b3480156104ed57600080fd5b506104f6611b84565b604051610503919061392f565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e9190613805565b611bad565b005b34801561054157600080fd5b5061055c6004803603810190610557919061394a565b611c88565b005b34801561056a57600080fd5b5061058560048036038101906105809190613805565b611d45565b005b34801561059357600080fd5b506105ae60048036038101906105a99190613744565b611e38565b005b3480156105bc57600080fd5b506105d760048036038101906105d291906136df565b611ee9565b6040516105e49190613905565b60405180910390f35b3480156105f957600080fd5b50610602611f3f565b60405161060f9190613874565b60405180910390f35b610632600480360381019061062d91906139c5565b611f45565b005b34801561064057600080fd5b5061065b600480360381019061065691906136df565b6121ff565b6040516106689190613905565b60405180910390f35b61068b60048036038101906106869190613a39565b612255565b005b34801561069957600080fd5b506106b460048036038101906106af9190613a8c565b6122c7565b005b6106d060048036038101906106cb91906136df565b612583565b005b3480156106de57600080fd5b506106f960048036038101906106f491906136df565b612823565b6040516107069190613905565b60405180910390f35b34801561071b57600080fd5b50610736600480360381019061073191906136df565b612879565b005b34801561074457600080fd5b5061075f600480360381019061075a9190613b14565b6128fc565b005b34801561076d57600080fd5b50610788600480360381019061078391906136df565b61290e565b6040516107959190613905565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190613744565b612964565b005b6107e160048036038101906107dc9190613b41565b612a15565b005b6107eb613031565b8173ffffffffffffffffffffffffffffffffffffffff166341ede57e826040518263ffffffff1660e01b81526004016108249190613874565b600060405180830381600087803b15801561083e57600080fd5b505af1158015610852573d6000803e3d6000fd5b505050505050565b610862613031565b8173ffffffffffffffffffffffffffffffffffffffff1663c0d78655826040518263ffffffff1660e01b815260040161089b919061392f565b600060405180830381600087803b1580156108b557600080fd5b505af11580156108c9573d6000803e3d6000fd5b505050505050565b60005b87879050811015610d435760008686838181106108f4576108f3613bd6565b5b90506020028101906109069190613c14565b80600001906109159190613c3c565b905011610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094e90613cfc565b60405180910390fd5b600088888381811061096c5761096b613bd6565b5b905060200201602081019061098191906136df565b73ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa1580156109cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ef9190613e4e565b90506000898984818110610a0657610a05613bd6565b5b9050602002016020810190610a1b91906136df565b73ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610a67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8b9190613e90565b905060008a8a85818110610aa257610aa1613bd6565b5b9050602002016020810190610ab791906136df565b73ffffffffffffffffffffffffffffffffffffffff166388e5cd1f8a8a87818110610ae557610ae4613bd6565b5b9050602002810190610af79190613c14565b8060000190610b069190613c3c565b905085600001516040518363ffffffff1660e01b8152600401610b2a929190613ebd565b602060405180830381865afa158015610b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6b9190613ee6565b905060008b8b86818110610b8257610b81613bd6565b5b9050602002016020810190610b9791906136df565b73ffffffffffffffffffffffffffffffffffffffff1663244117b48b8b88818110610bc557610bc4613bd6565b5b9050602002810190610bd79190613c14565b8060000190610be69190613c3c565b8b8b8a818110610bf957610bf8613bd6565b5b90506020020135336040518563ffffffff1660e01b8152600401610c209493929190613f8e565b6020604051808303816000875af1158015610c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c639190613ee6565b9050610c708684836130af565b8b8b86818110610c8357610c82613bd6565b5b9050602002016020810190610c9891906136df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8f3673bd023cc34f252b9e7d0a0dd6496592b87006673a974d1d621b5a93e15e8c8c89818110610cf957610cf8613bd6565b5b9050602002810190610d0b9190613c14565b8060000190610d1a9190613c3c565b868b604051610d2c9493929190613f8e565b60405180910390a3846001019450505050506108d4565b5050505050505050565b8073ffffffffffffffffffffffffffffffffffffffff16631ac3ddeb336040518263ffffffff1660e01b8152600401610d86919061392f565b600060405180830381600087803b158015610da057600080fd5b505af1158015610db4573d6000803e3d6000fd5b5050505050565b60011515600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e459061401a565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f16f5dd05aa4fb9d233806a07de5cc48d6893f315e214cce8974b6e951b655c6b82604051610e949190613905565b60405180910390a25050565b60005b8484905081101561104157848482818110610ec157610ec0613bd6565b5b9050602002016020810190610ed691906136df565b73ffffffffffffffffffffffffffffffffffffffff16632f7e0b2e848484818110610f0457610f03613bd6565b5b9050602002810190610f169190613c14565b8060000190610f259190613c3c565b336040518463ffffffff1660e01b8152600401610f449392919061403a565b600060405180830381600087803b158015610f5e57600080fd5b505af1158015610f72573d6000803e3d6000fd5b50505050848482818110610f8957610f88613bd6565b5b9050602002016020810190610f9e91906136df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7c0a46ce3acb6a46fffede953868812e9045bc3e16fb727004e10272ddfad74e858585818110610fff57610ffe613bd6565b5b90506020028101906110119190613c14565b80600001906110209190613c3c565b60405161102e92919061406c565b60405180910390a3806001019050610ea3565b5050505050565b8273ffffffffffffffffffffffffffffffffffffffff1663f968f33b8383336040518463ffffffff1660e01b81526004016110859392919061403a565b600060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff4a476d3c8307c48588449bd904be8e33979939dd8cddeca9a78f6d336311576848460405161111692919061406c565b60405180910390a3505050565b61112b613031565b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fc01b4a3b37bda477d1b60e1d10e03272f94fbe6d08b3c72f8a4a7e35bcd93b02826040516111c89190613905565b60405180910390a25050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b8373ffffffffffffffffffffffffffffffffffffffff1663a09f32118484846040518463ffffffff1660e01b815260040161129893929190614090565b600060405180830381600087803b1580156112b257600080fd5b505af11580156112c6573d6000803e3d6000fd5b5050505050505050565b600080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113ac576000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544761139691906140f6565b905080826113a4919061412a565b915050611484565b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611427919061392f565b602060405180830381865afa158015611444573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114689190613ee6565b61147291906140f6565b90508082611480919061412a565b9150505b80915050919050565b611495613031565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116a457600082118061155f57508047115b61159e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611595906141aa565b60405180910390fd5b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461163291906140f6565b925050819055506000814761164791906140f6565b90508083611655919061412a565b92503373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561169d573d6000803e3d6000fd5b505061199b565b600082118061176a5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611727919061392f565b602060405180830381865afa158015611744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117689190613ee6565b115b6117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a0906141aa565b60405180910390fd5b6000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461183d91906140f6565b925050819055506000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118bf919061392f565b602060405180830381865afa1580156118dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119009190613ee6565b61190a91906140f6565b90508083611918919061412a565b92508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b81526004016119559291906141ca565b6020604051808303816000875af1158015611974573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119989190614208565b50505b505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6119fe613031565b611a0860006132ed565b565b60076020528060005260406000206000915090505481565b611a2a613031565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f11b4c2b6450da8949b70f94de747d396f0a4fcedf7ffefe7332d323dd210258a82604051611ac79190613905565b60405180910390a25050565b611adb613031565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fa5863f03ddba3042b23731d7fba300e6f264d1c0cabf85630064d6ecbd01853b82604051611b789190613905565b60405180910390a25050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8273ffffffffffffffffffffffffffffffffffffffff16632f7e0b2e8383336040518463ffffffff1660e01b8152600401611bea9392919061403a565b600060405180830381600087803b158015611c0457600080fd5b505af1158015611c18573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7c0a46ce3acb6a46fffede953868812e9045bc3e16fb727004e10272ddfad74e8484604051611c7b92919061406c565b60405180910390a3505050565b8473ffffffffffffffffffffffffffffffffffffffff1663f829e9fc85858585336040518663ffffffff1660e01b8152600401611cc9959493929190614235565b600060405180830381600087803b158015611ce357600080fd5b505af1158015611cf7573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff167f02f0328fc2c71376910c0a5e2be622213d6eeb426118ef65ae5b3593864b668160405160405180910390a25050505050565b60008373ffffffffffffffffffffffffffffffffffffffff16632c7e49158484336040518463ffffffff1660e01b8152600401611d849392919061403a565b6020604051808303816000875af1158015611da3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc79190613ee6565b90508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fcd715c6f851d1dc11755804a0c2e5da8792da275e44c1ee713771d7479bce8fd858585604051611e2a93929190614288565b60405180910390a350505050565b611e40613031565b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f1c3c313576907bc91320c98e637bcadb2f200b2af1b9ba3036662819961ae0d482604051611edd9190613905565b60405180910390a25050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60015481565b60008383905011611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290613cfc565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa158015611fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffc9190613e4e565b905060008573ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af115801561204d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120719190613e90565b905060008673ffffffffffffffffffffffffffffffffffffffff166365b962318787905085600001516040518363ffffffff1660e01b81526004016120b7929190613ebd565b602060405180830381865afa1580156120d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f89190613ee6565b905060008773ffffffffffffffffffffffffffffffffffffffff16634c4cbac4348989336040518563ffffffff1660e01b815260040161213a9392919061403a565b60206040518083038185885af1158015612158573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061217d9190613ee6565b905061218a8584836130af565b8773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2611defd53a4a87419d2078554db30aeaddd9ddfdc5990da2bbdc8d589f5e4d68989868a6040516121ed9493929190613f8e565b60405180910390a35050505050505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b8273ffffffffffffffffffffffffffffffffffffffff1663efb1765983836040518363ffffffff1660e01b81526004016122909291906142ba565b600060405180830381600087803b1580156122aa57600080fd5b505af11580156122be573d6000803e3d6000fd5b50505050505050565b6000848490501161230d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230490613cfc565b60405180910390fd5b60008573ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa15801561235a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237e9190613e4e565b905060008673ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af11580156123cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f39190613e90565b905060008773ffffffffffffffffffffffffffffffffffffffff166388e5cd1f8888905085600001516040518363ffffffff1660e01b8152600401612439929190613ebd565b602060405180830381865afa158015612456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247a9190613ee6565b905060008873ffffffffffffffffffffffffffffffffffffffff1663244117b4898989336040518563ffffffff1660e01b81526004016124bd9493929190613f8e565b6020604051808303816000875af11580156124dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125009190613ee6565b905061250d8584836130af565b8873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8f3673bd023cc34f252b9e7d0a0dd6496592b87006673a974d1d621b5a93e15e8a8a868a6040516125709493929190613f8e565b60405180910390a3505050505050505050565b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e906141aa565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461271891906140f6565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361279f573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612799573d6000803e3d6000fd5b5061281f565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016127da9291906141ca565b6020604051808303816000875af11580156127f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281d9190614208565b505b5050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b612881613031565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e790614355565b60405180910390fd5b6128f9816132ed565b50565b612904613031565b8060018190555050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61296c613031565b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167ff1a7d235323609d0e57be8421b6b457060a5778dce9db39be3d530b141a3c70982604051612a099190613905565b60405180910390a25050565b600034905060005b86869050811015612fd7576000858583818110612a3d57612a3c613bd6565b5b9050602002810190612a4f9190613c14565b8060000190612a5e9190613c3c565b905011612aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9790613cfc565b60405180910390fd5b6000878783818110612ab557612ab4613bd6565b5b9050602002016020810190612aca91906136df565b73ffffffffffffffffffffffffffffffffffffffff166360246c886040518163ffffffff1660e01b815260040160a060405180830381865afa158015612b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b389190613e4e565b90506000888884818110612b4f57612b4e613bd6565b5b9050602002016020810190612b6491906136df565b73ffffffffffffffffffffffffffffffffffffffff16633013ce296040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd49190613e90565b90506000898985818110612beb57612bea613bd6565b5b9050602002016020810190612c0091906136df565b73ffffffffffffffffffffffffffffffffffffffff166365b96231898987818110612c2e57612c2d613bd6565b5b9050602002810190612c409190613c14565b8060000190612c4f9190613c3c565b905085600001516040518363ffffffff1660e01b8152600401612c73929190613ebd565b602060405180830381865afa158015612c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb49190613ee6565b905060008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e1d5781861015612d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d25906143c1565b60405180910390fd5b8186612d3a91906140f6565b95508a8a86818110612d4f57612d4e613bd6565b5b9050602002016020810190612d6491906136df565b73ffffffffffffffffffffffffffffffffffffffff16634c4cbac4838b8b89818110612d9357612d92613bd6565b5b9050602002810190612da59190613c14565b8060000190612db49190613c3c565b336040518563ffffffff1660e01b8152600401612dd39392919061403a565b60206040518083038185885af1158015612df1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612e169190613ee6565b9050612ef9565b8a8a86818110612e3057612e2f613bd6565b5b9050602002016020810190612e4591906136df565b73ffffffffffffffffffffffffffffffffffffffff16634c4cbac48a8a88818110612e7357612e72613bd6565b5b9050602002810190612e859190613c14565b8060000190612e949190613c3c565b336040518463ffffffff1660e01b8152600401612eb39392919061403a565b6020604051808303816000875af1158015612ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef69190613ee6565b90505b612f048784836130af565b8a8a86818110612f1757612f16613bd6565b5b9050602002016020810190612f2c91906136df565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2611defd53a4a87419d2078554db30aeaddd9ddfdc5990da2bbdc8d589f5e4d68b8b89818110612f8d57612f8c613bd6565b5b9050602002810190612f9f9190613c14565b8060000190612fae9190613c3c565b868c604051612fc09493929190613f8e565b60405180910390a384600101945050505050612a1d565b506000811115613029573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613027573d6000803e3d6000fd5b505b505050505050565b6130396133b1565b73ffffffffffffffffffffffffffffffffffffffff16613057611b84565b73ffffffffffffffffffffffffffffffffffffffff16146130ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a49061442d565b60405180910390fd5b565b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130fe919061412a565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461325c57600061315a600154670de0b6b3a7640000846133b99092919063ffffffff16565b90506000818361316a91906140f6565b905080600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131bb919061412a565b9250508190555081600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461324e919061412a565b9250508190555050506132e8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036132e75780600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132df919061412a565b925050819055505b5b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000828402905082848204148415176133d157600080fd5b81810490509392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061341c826133f1565b9050919050565b61342c81613411565b811461343757600080fd5b50565b60008135905061344981613423565b92915050565b6000819050919050565b6134628161344f565b811461346d57600080fd5b50565b60008135905061347f81613459565b92915050565b6000806040838503121561349c5761349b6133e7565b5b60006134aa8582860161343a565b92505060206134bb85828601613470565b9150509250929050565b600080604083850312156134dc576134db6133e7565b5b60006134ea8582860161343a565b92505060206134fb8582860161343a565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261352a57613529613505565b5b8235905067ffffffffffffffff8111156135475761354661350a565b5b6020830191508360208202830111156135635761356261350f565b5b9250929050565b60008083601f8401126135805761357f613505565b5b8235905067ffffffffffffffff81111561359d5761359c61350a565b5b6020830191508360208202830111156135b9576135b861350f565b5b9250929050565b60008083601f8401126135d6576135d5613505565b5b8235905067ffffffffffffffff8111156135f3576135f261350a565b5b60208301915083602082028301111561360f5761360e61350f565b5b9250929050565b60008060008060008060006080888a031215613635576136346133e7565b5b600088013567ffffffffffffffff811115613653576136526133ec565b5b61365f8a828b01613514565b9750975050602088013567ffffffffffffffff811115613682576136816133ec565b5b61368e8a828b0161356a565b9550955050604088013567ffffffffffffffff8111156136b1576136b06133ec565b5b6136bd8a828b016135c0565b935093505060606136d08a828b0161343a565b91505092959891949750929550565b6000602082840312156136f5576136f46133e7565b5b60006137038482850161343a565b91505092915050565b60008115159050919050565b6137218161370c565b811461372c57600080fd5b50565b60008135905061373e81613718565b92915050565b6000806040838503121561375b5761375a6133e7565b5b60006137698582860161343a565b925050602061377a8582860161372f565b9150509250929050565b6000806000806040858703121561379e5761379d6133e7565b5b600085013567ffffffffffffffff8111156137bc576137bb6133ec565b5b6137c887828801613514565b9450945050602085013567ffffffffffffffff8111156137eb576137ea6133ec565b5b6137f78782880161356a565b925092505092959194509250565b60008060006040848603121561381e5761381d6133e7565b5b600061382c8682870161343a565b935050602084013567ffffffffffffffff81111561384d5761384c6133ec565b5b613859868287016135c0565b92509250509250925092565b61386e8161344f565b82525050565b60006020820190506138896000830184613865565b92915050565b600080600080608085870312156138a9576138a86133e7565b5b60006138b78782880161343a565b94505060206138c88782880161343a565b93505060406138d987828801613470565b92505060606138ea8782880161343a565b91505092959194509250565b6138ff8161370c565b82525050565b600060208201905061391a60008301846138f6565b92915050565b61392981613411565b82525050565b60006020820190506139446000830184613920565b92915050565b600080600080600060a08688031215613966576139656133e7565b5b60006139748882890161343a565b95505060206139858882890161343a565b945050604061399688828901613470565b93505060606139a788828901613470565b92505060806139b888828901613470565b9150509295509295909350565b600080600080606085870312156139df576139de6133e7565b5b60006139ed8782880161343a565b945050602085013567ffffffffffffffff811115613a0e57613a0d6133ec565b5b613a1a878288016135c0565b93509350506040613a2d8782880161343a565b91505092959194509250565b600080600060608486031215613a5257613a516133e7565b5b6000613a608682870161343a565b9350506020613a7186828701613470565b9250506040613a828682870161343a565b9150509250925092565b600080600080600060808688031215613aa857613aa76133e7565b5b6000613ab68882890161343a565b955050602086013567ffffffffffffffff811115613ad757613ad66133ec565b5b613ae3888289016135c0565b94509450506040613af688828901613470565b9250506060613b078882890161343a565b9150509295509295909350565b600060208284031215613b2a57613b296133e7565b5b6000613b3884828501613470565b91505092915050565b600080600080600060608688031215613b5d57613b5c6133e7565b5b600086013567ffffffffffffffff811115613b7b57613b7a6133ec565b5b613b8788828901613514565b9550955050602086013567ffffffffffffffff811115613baa57613ba96133ec565b5b613bb68882890161356a565b93509350506040613bc98882890161343a565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600082356001602003833603038112613c3057613c2f613c05565b5b80830191505092915050565b60008083356001602003843603038112613c5957613c58613c05565b5b80840192508235915067ffffffffffffffff821115613c7b57613c7a613c0a565b5b602083019250602082023603831315613c9757613c96613c0f565b5b509250929050565b600082825260208201905092915050565b7f4e6f742030000000000000000000000000000000000000000000000000000000600082015250565b6000613ce6600583613c9f565b9150613cf182613cb0565b602082019050919050565b60006020820190508181036000830152613d1581613cd9565b9050919050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d6a82613d21565b810181811067ffffffffffffffff82111715613d8957613d88613d32565b5b80604052505050565b6000613d9c6133dd565b9050613da88282613d61565b919050565b600081519050613dbc81613459565b92915050565b600060a08284031215613dd857613dd7613d1c565b5b613de260a0613d92565b90506000613df284828501613dad565b6000830152506020613e0684828501613dad565b6020830152506040613e1a84828501613dad565b6040830152506060613e2e84828501613dad565b6060830152506080613e4284828501613dad565b60808301525092915050565b600060a08284031215613e6457613e636133e7565b5b6000613e7284828501613dc2565b91505092915050565b600081519050613e8a81613423565b92915050565b600060208284031215613ea657613ea56133e7565b5b6000613eb484828501613e7b565b91505092915050565b6000604082019050613ed26000830185613865565b613edf6020830184613865565b9392505050565b600060208284031215613efc57613efb6133e7565b5b6000613f0a84828501613dad565b91505092915050565b600082825260208201905092915050565b600080fd5b82818337505050565b6000613f3e8385613f13565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613f7157613f70613f24565b5b602083029250613f82838584613f29565b82840190509392505050565b60006060820190508181036000830152613fa9818688613f32565b9050613fb86020830185613865565b613fc56040830184613920565b95945050505050565b7f6f6e6c79466163746f7279000000000000000000000000000000000000000000600082015250565b6000614004600b83613c9f565b915061400f82613fce565b602082019050919050565b6000602082019050818103600083015261403381613ff7565b9050919050565b60006040820190508181036000830152614055818587613f32565b90506140646020830184613920565b949350505050565b60006020820190508181036000830152614087818486613f32565b90509392505050565b60006060820190506140a56000830186613920565b6140b26020830185613865565b6140bf6040830184613920565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141018261344f565b915061410c8361344f565b9250828203905081811115614124576141236140c7565b5b92915050565b60006141358261344f565b91506141408361344f565b9250828201905080821115614158576141576140c7565b5b92915050565b7f4e6f742046656500000000000000000000000000000000000000000000000000600082015250565b6000614194600783613c9f565b915061419f8261415e565b602082019050919050565b600060208201905081810360008301526141c381614187565b9050919050565b60006040820190506141df6000830185613920565b6141ec6020830184613865565b9392505050565b60008151905061420281613718565b92915050565b60006020828403121561421e5761421d6133e7565b5b600061422c848285016141f3565b91505092915050565b600060a08201905061424a6000830188613920565b6142576020830187613865565b6142646040830186613865565b6142716060830185613865565b61427e6080830184613920565b9695505050505050565b600060408201905081810360008301526142a3818587613f32565b90506142b26020830184613865565b949350505050565b60006040820190506142cf6000830185613865565b6142dc6020830184613920565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061433f602683613c9f565b915061434a826142e3565b604082019050919050565b6000602082019050818103600083015261436e81614332565b9050919050565b7f6e6f7420656e6f67682076616c75650000000000000000000000000000000000600082015250565b60006143ab600f83613c9f565b91506143b682614375565b602082019050919050565b600060208201905081810360008301526143da8161439e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614417602083613c9f565b9150614422826143e1565b602082019050919050565b600060208201905081810360008301526144468161440a565b905091905056fea2646970667358221220dda5a4ce2536514f0903596cd3704c0b999a32c2aec1a9e9ff0944a488c65cc664736f6c63430008110033

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

0000000000000000000000000000000000000000000000000429d069189e0000

-----Decoded View---------------
Arg [0] : _supporterFeeRatio (uint256): 300000000000000000

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000429d069189e0000


Deployed Bytecode Sourcemap

13587:16240:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28426:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28665:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17950:1193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23482:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28850:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16680:409;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21941:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27945:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26625:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24699:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26048:533;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22192:1282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25837:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12697:103;;;;;;;;;;;;;:::i;:::-;;14411:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27405:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12049:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16483:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24192:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21671:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27689:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25161:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13715:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19182:746;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25393:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24515:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17128:781;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23632:552;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25625:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12955:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28217:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24937:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26845:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19969:1658;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28426:195;11935:13;:11;:13::i;:::-;28565:5:::1;28559:32;;;28592:20;28559:54;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28426:195:::0;;:::o;28665:153::-;11935:13;:11;:13::i;:::-;28782:5:::1;28776:22;;;28799:10;28776:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28665:153:::0;;:::o;17950:1193::-;18164:9;18159:977;18183:9;;:16;;18179:1;:20;18159:977;;;18258:1;18226:10;;18237:1;18226:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;:29;;:33;18218:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;18284:31;18324:9;;18334:1;18324:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;18318:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18284:67;;18366:21;18396:9;;18406:1;18396:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;18390:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18366:58;;18439:17;18465:9;;18475:1;18465:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;18459:35;;;18513:10;;18524:1;18513:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;:29;;18561:9;:19;;;18459:136;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18439:156;;18612:21;18642:9;;18652:1;18642:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;18636:32;;;18687:10;;18698:1;18687:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;18728:11;;18740:1;18728:14;;;;;;;:::i;:::-;;;;;;;;18761:10;18636:150;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18612:174;;18803:52;18814:10;18826:13;18841;18803:10;:52::i;:::-;18937:9;;18947:1;18937:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;18877:185;;18908:10;18877:185;;;18968:10;;18979:1;18968:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;19009:9;19037:10;18877:185;;;;;;;;;:::i;:::-;;;;;;;;19106:3;;;;;18203:933;;;;18159:977;;;;17950:1193;;;;;;;:::o;23482:106::-;23550:5;23544:24;;;23569:10;23544:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23482:106;:::o;28850:119::-;14914:4;14882:36;;:16;:28;14899:10;14882:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;14874:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28945:5:::1;28934:27;;;28952:8;28934:27;;;;;;:::i;:::-;;;;;;;;28850:119:::0;;:::o;16680:409::-;16812:9;16807:275;16831:9;;:16;;16827:1;:20;16807:275;;;16872:9;;16882:1;16872:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;16866:28;;;16895:10;;16906:1;16895:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;16919:10;16866:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16971:9;;16981:1;16971:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;16950:58;;16959:10;16950:58;;;16985:10;;16996:1;16985:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;16950:58;;;;;;;:::i;:::-;;;;;;;;17052:3;;;;;16807:275;;;;16680:409;;;;:::o;21941:206::-;22035:5;22029:28;;;22058:9;;22069:10;22029:51;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22122:5;22094:45;;22110:10;22094:45;;;22129:9;;22094:45;;;;;;;:::i;:::-;;;;;;;;21941:206;;;:::o;27945:219::-;11935:13;:11;:13::i;:::-;28095:8:::1;28062:18;:30;28081:10;28062:30;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;28135:10;28119:37;;;28147:8;28119:37;;;;;;:::i;:::-;;;;;;;;27945:219:::0;;:::o;26625:160::-;26714:7;26738:12;:24;26751:10;26738:24;;;;;;;;;;;;;;;:39;26763:13;26738:39;;;;;;;;;;;;;;;;26731:46;;26625:160;;;;:::o;24699:178::-;24816:5;24810:29;;;24840:11;24853:8;24863:5;24810:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24699:178;;;;:::o;26048:533::-;26122:7;26139:17;26159:16;:31;26176:13;26159:31;;;;;;;;;;;;;;;;26139:51;;26230:1;26205:27;;:13;:27;;;26201:346;;26249:22;26298:8;:23;26307:13;26298:23;;;;;;;;;;;;;;;;26274:21;:47;;;;:::i;:::-;26249:72;;26349:14;26336:27;;;;;:::i;:::-;;;26234:141;26201:346;;;26396:22;26470:8;:23;26479:13;26470:23;;;;;;;;;;;;;;;;26428:13;26421:31;;;26461:4;26421:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;;;:::i;:::-;26396:97;;26521:14;26508:27;;;;;:::i;:::-;;;26381:166;26201:346;26564:9;26557:16;;;26048:533;;;:::o;22192:1282::-;11935:13;:11;:13::i;:::-;22314:17:::1;22334:16;:31;22351:13;22334:31;;;;;;;;;;;;;;;;22314:51;;22376:21;22400:8;:23;22409:13;22400:23;;;;;;;;;;;;;;;;22376:47;;22463:1;22438:27;;:13;:27;;::::0;22434:1033:::1;;22523:1;22511:9;:13;:54;;;;22552:13;22528:21;:37;22511:54;22503:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22650:1;22616:16;:31;22633:13;22616:31;;;;;;;;;;;;;;;:35;;;;22693:9;22666:8;:23;22675:13;22666:23;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;22717:22;22766:13;22742:21;:37;;;;:::i;:::-;22717:62;;22807:14;22794:27;;;;;:::i;:::-;;;22885:10;22877:28;;:39;22906:9;22877:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;22467:461;22434:1033;;;22990:1;22978:9;:13;:89;;;;23044:8;:23;23053:13;23044:23;;;;;;;;;;;;;;;;23002:13;22995:31;;;23035:4;22995:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;22978:89;22970:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;23152:1;23118:16;:31;23135:13;23118:31;;;;;;;;;;;;;;;:35;;;;23195:9;23168:8;:23;23177:13;23168:23;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;23219:22;23293:8;:23;23302:13;23293:23;;;;;;;;;;;;;;;;23251:13;23244:31;;;23284:4;23244:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;;;:::i;:::-;23219:97;;23344:14;23331:27;;;;;:::i;:::-;;;23409:13;23402:30;;;23433:10;23445:9;23402:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22934:533;22434:1033;22303:1171;;22192:1282:::0;:::o;25837:168::-;25938:4;25967:18;:30;25986:10;25967:30;;;;;;;;;;;;;;;;;;;;;;;;;25960:37;;25837:168;;;:::o;12697:103::-;11935:13;:11;:13::i;:::-;12762:30:::1;12789:1;12762:18;:30::i;:::-;12697:103::o:0;14411:43::-;;;;;;;;;;;;;;;;;:::o;27405:237::-;11935:13;:11;:13::i;:::-;27567:8:::1;27528:21;:36;27550:13;27528:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;27610:13;27591:43;;;27625:8;27591:43;;;;;;:::i;:::-;;;;;;;;27405:237:::0;;:::o;27119:::-;11935:13;:11;:13::i;:::-;27281:8:::1;27242:21;:36;27264:13;27242:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;27324:13;27305:43;;;27339:8;27305:43;;;;;;:::i;:::-;;;;;;;;27119:237:::0;;:::o;12049:87::-;12095:7;12122:6;;;;;;;;;;;12115:13;;12049:87;:::o;16483:189::-;16572:5;16566:21;;;16588:9;;16599:10;16566:44;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16647:5;16626:38;;16635:10;16626:38;;;16654:9;;16626:38;;;;;;;:::i;:::-;;;;;;;;16483:189;;;:::o;24192:315::-;24387:5;24381:18;;;24400:13;24414;24428:9;24438:10;24450;24381:80;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24493:5;24477:22;;;;;;;;;;;;24192:315;;;;;:::o;21671:229::-;21757:17;21783:5;21777:24;;;21802:9;;21813:10;21777:47;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21757:67;;21864:5;21840:52;;21852:10;21840:52;;;21871:9;;21882;21840:52;;;;;;;;:::i;:::-;;;;;;;;21746:154;21671:229;;;:::o;27689:207::-;11935:13;:11;:13::i;:::-;27831:8:::1;27802:16;:26;27819:8;27802:26;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;27869:8;27855:33;;;27879:8;27855:33;;;;;;:::i;:::-;;;;;;;;27689:207:::0;;:::o;25161:180::-;25268:4;25297:21;:36;25319:13;25297:36;;;;;;;;;;;;;;;;;;;;;;;;;25290:43;;25161:180;;;:::o;13715:32::-;;;;:::o;19182:746::-;19358:1;19339:9;;:16;;:20;19331:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;19380:31;19420:5;19414:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19380:60;;19451:21;19481:5;19475:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19451:51;;19513:17;19539:5;19533:27;;;19575:9;;:16;;19606:9;:19;;;19533:103;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19513:123;;19649:21;19679:5;19673:25;;;19706:9;19731;;19755:10;19673:103;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19649:127;;19787:52;19798:10;19810:13;19825;19787:10;:52::i;:::-;19880:5;19855:65;;19868:10;19855:65;;;19887:9;;19898;19909:10;19855:65;;;;;;;;;:::i;:::-;;;;;;;;19320:608;;;;19182:746;;;;:::o;25393:180::-;25500:4;25529:21;:36;25551:13;25529:36;;;;;;;;;;;;;;;;;;;;;;;;;25522:43;;25393:180;;;:::o;24515:149::-;24618:5;24612:28;;;24641:7;24650:5;24612:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24515:149;;;:::o;17128:781::-;17328:1;17309:9;;:16;;:20;17301:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;17350:31;17390:5;17384:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17350:60;;17421:21;17451:5;17445:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17421:51;;17483:17;17509:5;17503:28;;;17546:9;;:16;;17577:9;:19;;;17503:104;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17483:124;;17620:21;17650:5;17644:25;;;17684:9;;17708:13;17736:10;17644:113;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17620:137;;17768:52;17779:10;17791:13;17806;17768:10;:52::i;:::-;17861:5;17836:65;;17849:10;17836:65;;;17868:9;;17879;17890:10;17836:65;;;;;;;;;:::i;:::-;;;;;;;;17290:619;;;;17128:781;;;;;:::o;23632:552::-;23711:17;23731:12;:24;23744:10;23731:24;;;;;;;;;;;;;;;:39;23756:13;23731:39;;;;;;;;;;;;;;;;23711:59;;23820:1;23808:9;:13;23800:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;23906:1;23864:12;:24;23877:10;23864:24;;;;;;;;;;;;;;;:39;23889:13;23864:39;;;;;;;;;;;;;;;:43;;;;23945:9;23918:8;:23;23927:13;23918:23;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;24021:1;23996:27;;:13;:27;;;23992:185;;24048:10;24040:28;;:39;24069:9;24040:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23992:185;;;24119:13;24112:30;;;24143:10;24155:9;24112:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23992:185;23700:484;23632:552;:::o;25625:160::-;25722:4;25751:16;:26;25768:8;25751:26;;;;;;;;;;;;;;;;;;;;;;;;;25744:33;;25625:160;;;:::o;12955:201::-;11935:13;:11;:13::i;:::-;13064:1:::1;13044:22;;:8;:22;;::::0;13036:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;13120:28;13139:8;13120:18;:28::i;:::-;12955:201:::0;:::o;28217:156::-;11935:13;:11;:13::i;:::-;28344:21:::1;28324:17;:41;;;;28217:156:::0;:::o;24937:172::-;25040:4;25069:19;:32;25089:11;25069:32;;;;;;;;;;;;;;;;;;;;;;;;;25062:39;;24937:172;;;:::o;26845:225::-;11935:13;:11;:13::i;:::-;26999:8:::1;26964:19;:32;26984:11;26964:32;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;27040:11;27023:39;;;27053:8;27023:39;;;;;;:::i;:::-;;;;;;;;26845:225:::0;;:::o;19969:1658::-;20137:18;20158:9;20137:30;;20183:9;20178:1345;20202:9;;:16;;20198:1;:20;20178:1345;;;20277:1;20245:10;;20256:1;20245:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;:29;;:33;20237:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;20303:31;20343:9;;20353:1;20343:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;20337:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20303:67;;20385:21;20415:9;;20425:1;20415:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;20409:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20385:58;;20458:17;20484:9;;20494:1;20484:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;20478:34;;;20531:10;;20542:1;20531:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;:29;;20579:9;:19;;;20478:135;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20458:155;;20630:21;20695:1;20670:27;;:13;:27;;;20666:510;;20740:9;20726:10;:23;;20718:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;20802:9;20788:23;;;;;:::i;:::-;;;20854:9;;20864:1;20854:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;20848:32;;;20910:9;20939:10;;20950:1;20939:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;20963:10;20848:126;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20832:142;;20666:510;;;21037:9;;21047:1;21037:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21031:32;;;21086:10;;21097:1;21086:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;21131:10;21031:129;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21015:145;;20666:510;21192:52;21203:10;21215:13;21230;21192:10;:52::i;:::-;21324:9;;21334:1;21324:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21264:185;;21295:10;21264:185;;;21355:10;;21366:1;21355:13;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:22;;;;;;;;:::i;:::-;21396:9;21424:10;21264:185;;;;;;;;;:::i;:::-;;;;;;;;21493:3;;;;;20222:1301;;;;20178:1345;;;;21550:1;21537:10;:14;21533:87;;;21576:10;21568:28;;:40;21597:10;21568:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21533:87;20126:1501;19969:1658;;;;;:::o;12214:132::-;12289:12;:10;:12::i;:::-;12278:23;;:7;:5;:7::i;:::-;:23;;;12270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12214:132::o;29024:699::-;29191:13;29164:8;:23;29173:13;29164:23;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;29241:1;29219:24;;:10;:24;;;29215:501;;29260:21;29284:109;29321:17;;145:4;29284:13;:18;;:109;;;;;:::i;:::-;29260:133;;29408:20;29447:13;29431;:29;;;;:::i;:::-;29408:52;;29510:12;29475:16;:31;29492:13;29475:31;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;29580:13;29537:12;:24;29550:10;29537:24;;;;;;;;;;;;;;;:39;29562:13;29537:39;;;;;;;;;;;;;;;;:56;;;;;;;:::i;:::-;;;;;;;;29245:360;;29215:501;;;29637:1;29615:24;;:10;:24;;;29611:105;;29691:13;29656:16;:31;29673:13;29656:31;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;29611:105;29215:501;29024:699;;;:::o;13316:191::-;13390:16;13409:6;;;;;;;;;;;13390:25;;13435:8;13426:6;;:17;;;;;;;;;;;;;;;;;;13490:8;13459:40;;13480:8;13459:40;;;;;;;;;;;;13379:128;13316:191;:::o;10600:98::-;10653:7;10680:10;10673:17;;10600:98;:::o;158:519::-;269:9;369:1;366;362:9;357:14;;491:1;487;484;480:9;477:16;473:1;466:9;463:31;453:89;;525:1;522;515:12;453:89;650:8;647:1;643:16;638:21;;158:519;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:::-;1745:6;1753;1802:2;1790:9;1781:7;1777:23;1773:32;1770:119;;;1808:79;;:::i;:::-;1770:119;1928:1;1953:53;1998:7;1989:6;1978:9;1974:22;1953:53;:::i;:::-;1943:63;;1899:117;2055:2;2081:53;2126:7;2117:6;2106:9;2102:22;2081:53;:::i;:::-;2071:63;;2026:118;1677:474;;;;;:::o;2157:117::-;2266:1;2263;2256:12;2280:117;2389:1;2386;2379:12;2403:117;2512:1;2509;2502:12;2543:568;2616:8;2626:6;2676:3;2669:4;2661:6;2657:17;2653:27;2643:122;;2684:79;;:::i;:::-;2643:122;2797:6;2784:20;2774:30;;2827:18;2819:6;2816:30;2813:117;;;2849:79;;:::i;:::-;2813:117;2963:4;2955:6;2951:17;2939:29;;3017:3;3009:4;3001:6;2997:17;2987:8;2983:32;2980:41;2977:128;;;3024:79;;:::i;:::-;2977:128;2543:568;;;;;:::o;3146:592::-;3243:8;3253:6;3303:3;3296:4;3288:6;3284:17;3280:27;3270:122;;3311:79;;:::i;:::-;3270:122;3424:6;3411:20;3401:30;;3454:18;3446:6;3443:30;3440:117;;;3476:79;;:::i;:::-;3440:117;3590:4;3582:6;3578:17;3566:29;;3644:3;3636:4;3628:6;3624:17;3614:8;3610:32;3607:41;3604:128;;;3651:79;;:::i;:::-;3604:128;3146:592;;;;;:::o;3761:568::-;3834:8;3844:6;3894:3;3887:4;3879:6;3875:17;3871:27;3861:122;;3902:79;;:::i;:::-;3861:122;4015:6;4002:20;3992:30;;4045:18;4037:6;4034:30;4031:117;;;4067:79;;:::i;:::-;4031:117;4181:4;4173:6;4169:17;4157:29;;4235:3;4227:4;4219:6;4215:17;4205:8;4201:32;4198:41;4195:128;;;4242:79;;:::i;:::-;4195:128;3761:568;;;;;:::o;4335:1503::-;4526:6;4534;4542;4550;4558;4566;4574;4623:3;4611:9;4602:7;4598:23;4594:33;4591:120;;;4630:79;;:::i;:::-;4591:120;4778:1;4767:9;4763:17;4750:31;4808:18;4800:6;4797:30;4794:117;;;4830:79;;:::i;:::-;4794:117;4943:80;5015:7;5006:6;4995:9;4991:22;4943:80;:::i;:::-;4925:98;;;;4721:312;5100:2;5089:9;5085:18;5072:32;5131:18;5123:6;5120:30;5117:117;;;5153:79;;:::i;:::-;5117:117;5266:104;5362:7;5353:6;5342:9;5338:22;5266:104;:::i;:::-;5248:122;;;;5043:337;5447:2;5436:9;5432:18;5419:32;5478:18;5470:6;5467:30;5464:117;;;5500:79;;:::i;:::-;5464:117;5613:80;5685:7;5676:6;5665:9;5661:22;5613:80;:::i;:::-;5595:98;;;;5390:313;5742:2;5768:53;5813:7;5804:6;5793:9;5789:22;5768:53;:::i;:::-;5758:63;;5713:118;4335:1503;;;;;;;;;;:::o;5844:329::-;5903:6;5952:2;5940:9;5931:7;5927:23;5923:32;5920:119;;;5958:79;;:::i;:::-;5920:119;6078:1;6103:53;6148:7;6139:6;6128:9;6124:22;6103:53;:::i;:::-;6093:63;;6049:117;5844:329;;;;:::o;6179:90::-;6213:7;6256:5;6249:13;6242:21;6231:32;;6179:90;;;:::o;6275:116::-;6345:21;6360:5;6345:21;:::i;:::-;6338:5;6335:32;6325:60;;6381:1;6378;6371:12;6325:60;6275:116;:::o;6397:133::-;6440:5;6478:6;6465:20;6456:29;;6494:30;6518:5;6494:30;:::i;:::-;6397:133;;;;:::o;6536:468::-;6601:6;6609;6658:2;6646:9;6637:7;6633:23;6629:32;6626:119;;;6664:79;;:::i;:::-;6626:119;6784:1;6809:53;6854:7;6845:6;6834:9;6830:22;6809:53;:::i;:::-;6799:63;;6755:117;6911:2;6937:50;6979:7;6970:6;6959:9;6955:22;6937:50;:::i;:::-;6927:60;;6882:115;6536:468;;;;;:::o;7010:982::-;7156:6;7164;7172;7180;7229:2;7217:9;7208:7;7204:23;7200:32;7197:119;;;7235:79;;:::i;:::-;7197:119;7383:1;7372:9;7368:17;7355:31;7413:18;7405:6;7402:30;7399:117;;;7435:79;;:::i;:::-;7399:117;7548:80;7620:7;7611:6;7600:9;7596:22;7548:80;:::i;:::-;7530:98;;;;7326:312;7705:2;7694:9;7690:18;7677:32;7736:18;7728:6;7725:30;7722:117;;;7758:79;;:::i;:::-;7722:117;7871:104;7967:7;7958:6;7947:9;7943:22;7871:104;:::i;:::-;7853:122;;;;7648:337;7010:982;;;;;;;:::o;7998:704::-;8093:6;8101;8109;8158:2;8146:9;8137:7;8133:23;8129:32;8126:119;;;8164:79;;:::i;:::-;8126:119;8284:1;8309:53;8354:7;8345:6;8334:9;8330:22;8309:53;:::i;:::-;8299:63;;8255:117;8439:2;8428:9;8424:18;8411:32;8470:18;8462:6;8459:30;8456:117;;;8492:79;;:::i;:::-;8456:117;8605:80;8677:7;8668:6;8657:9;8653:22;8605:80;:::i;:::-;8587:98;;;;8382:313;7998:704;;;;;:::o;8708:118::-;8795:24;8813:5;8795:24;:::i;:::-;8790:3;8783:37;8708:118;;:::o;8832:222::-;8925:4;8963:2;8952:9;8948:18;8940:26;;8976:71;9044:1;9033:9;9029:17;9020:6;8976:71;:::i;:::-;8832:222;;;;:::o;9060:765::-;9146:6;9154;9162;9170;9219:3;9207:9;9198:7;9194:23;9190:33;9187:120;;;9226:79;;:::i;:::-;9187:120;9346:1;9371:53;9416:7;9407:6;9396:9;9392:22;9371:53;:::i;:::-;9361:63;;9317:117;9473:2;9499:53;9544:7;9535:6;9524:9;9520:22;9499:53;:::i;:::-;9489:63;;9444:118;9601:2;9627:53;9672:7;9663:6;9652:9;9648:22;9627:53;:::i;:::-;9617:63;;9572:118;9729:2;9755:53;9800:7;9791:6;9780:9;9776:22;9755:53;:::i;:::-;9745:63;;9700:118;9060:765;;;;;;;:::o;9831:109::-;9912:21;9927:5;9912:21;:::i;:::-;9907:3;9900:34;9831:109;;:::o;9946:210::-;10033:4;10071:2;10060:9;10056:18;10048:26;;10084:65;10146:1;10135:9;10131:17;10122:6;10084:65;:::i;:::-;9946:210;;;;:::o;10162:118::-;10249:24;10267:5;10249:24;:::i;:::-;10244:3;10237:37;10162:118;;:::o;10286:222::-;10379:4;10417:2;10406:9;10402:18;10394:26;;10430:71;10498:1;10487:9;10483:17;10474:6;10430:71;:::i;:::-;10286:222;;;;:::o;10514:911::-;10609:6;10617;10625;10633;10641;10690:3;10678:9;10669:7;10665:23;10661:33;10658:120;;;10697:79;;:::i;:::-;10658:120;10817:1;10842:53;10887:7;10878:6;10867:9;10863:22;10842:53;:::i;:::-;10832:63;;10788:117;10944:2;10970:53;11015:7;11006:6;10995:9;10991:22;10970:53;:::i;:::-;10960:63;;10915:118;11072:2;11098:53;11143:7;11134:6;11123:9;11119:22;11098:53;:::i;:::-;11088:63;;11043:118;11200:2;11226:53;11271:7;11262:6;11251:9;11247:22;11226:53;:::i;:::-;11216:63;;11171:118;11328:3;11355:53;11400:7;11391:6;11380:9;11376:22;11355:53;:::i;:::-;11345:63;;11299:119;10514:911;;;;;;;;:::o;11431:849::-;11535:6;11543;11551;11559;11608:2;11596:9;11587:7;11583:23;11579:32;11576:119;;;11614:79;;:::i;:::-;11576:119;11734:1;11759:53;11804:7;11795:6;11784:9;11780:22;11759:53;:::i;:::-;11749:63;;11705:117;11889:2;11878:9;11874:18;11861:32;11920:18;11912:6;11909:30;11906:117;;;11942:79;;:::i;:::-;11906:117;12055:80;12127:7;12118:6;12107:9;12103:22;12055:80;:::i;:::-;12037:98;;;;11832:313;12184:2;12210:53;12255:7;12246:6;12235:9;12231:22;12210:53;:::i;:::-;12200:63;;12155:118;11431:849;;;;;;;:::o;12286:619::-;12363:6;12371;12379;12428:2;12416:9;12407:7;12403:23;12399:32;12396:119;;;12434:79;;:::i;:::-;12396:119;12554:1;12579:53;12624:7;12615:6;12604:9;12600:22;12579:53;:::i;:::-;12569:63;;12525:117;12681:2;12707:53;12752:7;12743:6;12732:9;12728:22;12707:53;:::i;:::-;12697:63;;12652:118;12809:2;12835:53;12880:7;12871:6;12860:9;12856:22;12835:53;:::i;:::-;12825:63;;12780:118;12286:619;;;;;:::o;12911:995::-;13024:6;13032;13040;13048;13056;13105:3;13093:9;13084:7;13080:23;13076:33;13073:120;;;13112:79;;:::i;:::-;13073:120;13232:1;13257:53;13302:7;13293:6;13282:9;13278:22;13257:53;:::i;:::-;13247:63;;13203:117;13387:2;13376:9;13372:18;13359:32;13418:18;13410:6;13407:30;13404:117;;;13440:79;;:::i;:::-;13404:117;13553:80;13625:7;13616:6;13605:9;13601:22;13553:80;:::i;:::-;13535:98;;;;13330:313;13682:2;13708:53;13753:7;13744:6;13733:9;13729:22;13708:53;:::i;:::-;13698:63;;13653:118;13810:2;13836:53;13881:7;13872:6;13861:9;13857:22;13836:53;:::i;:::-;13826:63;;13781:118;12911:995;;;;;;;;:::o;13912:329::-;13971:6;14020:2;14008:9;13999:7;13995:23;13991:32;13988:119;;;14026:79;;:::i;:::-;13988:119;14146:1;14171:53;14216:7;14207:6;14196:9;14192:22;14171:53;:::i;:::-;14161:63;;14117:117;13912:329;;;;:::o;14247:1127::-;14402:6;14410;14418;14426;14434;14483:2;14471:9;14462:7;14458:23;14454:32;14451:119;;;14489:79;;:::i;:::-;14451:119;14637:1;14626:9;14622:17;14609:31;14667:18;14659:6;14656:30;14653:117;;;14689:79;;:::i;:::-;14653:117;14802:80;14874:7;14865:6;14854:9;14850:22;14802:80;:::i;:::-;14784:98;;;;14580:312;14959:2;14948:9;14944:18;14931:32;14990:18;14982:6;14979:30;14976:117;;;15012:79;;:::i;:::-;14976:117;15125:104;15221:7;15212:6;15201:9;15197:22;15125:104;:::i;:::-;15107:122;;;;14902:337;15278:2;15304:53;15349:7;15340:6;15329:9;15325:22;15304:53;:::i;:::-;15294:63;;15249:118;14247:1127;;;;;;;;:::o;15380:180::-;15428:77;15425:1;15418:88;15525:4;15522:1;15515:15;15549:4;15546:1;15539:15;15566:117;15675:1;15672;15665:12;15689:117;15798:1;15795;15788:12;15812:117;15921:1;15918;15911:12;15935:390;16025:4;16079:11;16066:25;16179:1;16173:4;16169:12;16158:8;16142:14;16138:29;16134:48;16114:18;16110:73;16100:168;;16187:79;;:::i;:::-;16100:168;16299:18;16289:8;16285:33;16277:41;;16030:295;15935:390;;;;:::o;16331:740::-;16424:4;16430:6;16486:11;16473:25;16586:1;16580:4;16576:12;16565:8;16549:14;16545:29;16541:48;16521:18;16517:73;16507:168;;16594:79;;:::i;:::-;16507:168;16706:18;16696:8;16692:33;16684:41;;16758:4;16745:18;16735:28;;16786:18;16778:6;16775:30;16772:117;;;16808:79;;:::i;:::-;16772:117;16916:2;16910:4;16906:13;16898:21;;16973:4;16965:6;16961:17;16945:14;16941:38;16935:4;16931:49;16928:136;;;16983:79;;:::i;:::-;16928:136;16437:634;16331:740;;;;;:::o;17077:169::-;17161:11;17195:6;17190:3;17183:19;17235:4;17230:3;17226:14;17211:29;;17077:169;;;;:::o;17252:155::-;17392:7;17388:1;17380:6;17376:14;17369:31;17252:155;:::o;17413:365::-;17555:3;17576:66;17640:1;17635:3;17576:66;:::i;:::-;17569:73;;17651:93;17740:3;17651:93;:::i;:::-;17769:2;17764:3;17760:12;17753:19;;17413:365;;;:::o;17784:419::-;17950:4;17988:2;17977:9;17973:18;17965:26;;18037:9;18031:4;18027:20;18023:1;18012:9;18008:17;18001:47;18065:131;18191:4;18065:131;:::i;:::-;18057:139;;17784:419;;;:::o;18209:117::-;18318:1;18315;18308:12;18332:102;18373:6;18424:2;18420:7;18415:2;18408:5;18404:14;18400:28;18390:38;;18332:102;;;:::o;18440:180::-;18488:77;18485:1;18478:88;18585:4;18582:1;18575:15;18609:4;18606:1;18599:15;18626:281;18709:27;18731:4;18709:27;:::i;:::-;18701:6;18697:40;18839:6;18827:10;18824:22;18803:18;18791:10;18788:34;18785:62;18782:88;;;18850:18;;:::i;:::-;18782:88;18890:10;18886:2;18879:22;18669:238;18626:281;;:::o;18913:129::-;18947:6;18974:20;;:::i;:::-;18964:30;;19003:33;19031:4;19023:6;19003:33;:::i;:::-;18913:129;;;:::o;19171:143::-;19228:5;19259:6;19253:13;19244:22;;19275:33;19302:5;19275:33;:::i;:::-;19171:143;;;;:::o;19349:1137::-;19434:5;19478:4;19466:9;19461:3;19457:19;19453:30;19450:117;;;19486:79;;:::i;:::-;19450:117;19585:21;19601:4;19585:21;:::i;:::-;19576:30;;19670:1;19710:60;19766:3;19757:6;19746:9;19742:22;19710:60;:::i;:::-;19703:4;19696:5;19692:16;19685:86;19616:166;19842:2;19883:60;19939:3;19930:6;19919:9;19915:22;19883:60;:::i;:::-;19876:4;19869:5;19865:16;19858:86;19792:163;20016:2;20057:60;20113:3;20104:6;20093:9;20089:22;20057:60;:::i;:::-;20050:4;20043:5;20039:16;20032:86;19965:164;20190:2;20231:60;20287:3;20278:6;20267:9;20263:22;20231:60;:::i;:::-;20224:4;20217:5;20213:16;20206:86;20139:164;20365:3;20407:60;20463:3;20454:6;20443:9;20439:22;20407:60;:::i;:::-;20400:4;20393:5;20389:16;20382:86;20313:166;19349:1137;;;;:::o;20492:402::-;20587:6;20636:3;20624:9;20615:7;20611:23;20607:33;20604:120;;;20643:79;;:::i;:::-;20604:120;20763:1;20788:89;20869:7;20860:6;20849:9;20845:22;20788:89;:::i;:::-;20778:99;;20734:153;20492:402;;;;:::o;20900:143::-;20957:5;20988:6;20982:13;20973:22;;21004:33;21031:5;21004:33;:::i;:::-;20900:143;;;;:::o;21049:351::-;21119:6;21168:2;21156:9;21147:7;21143:23;21139:32;21136:119;;;21174:79;;:::i;:::-;21136:119;21294:1;21319:64;21375:7;21366:6;21355:9;21351:22;21319:64;:::i;:::-;21309:74;;21265:128;21049:351;;;;:::o;21406:332::-;21527:4;21565:2;21554:9;21550:18;21542:26;;21578:71;21646:1;21635:9;21631:17;21622:6;21578:71;:::i;:::-;21659:72;21727:2;21716:9;21712:18;21703:6;21659:72;:::i;:::-;21406:332;;;;;:::o;21744:351::-;21814:6;21863:2;21851:9;21842:7;21838:23;21834:32;21831:119;;;21869:79;;:::i;:::-;21831:119;21989:1;22014:64;22070:7;22061:6;22050:9;22046:22;22014:64;:::i;:::-;22004:74;;21960:128;21744:351;;;;:::o;22101:184::-;22200:11;22234:6;22229:3;22222:19;22274:4;22269:3;22265:14;22250:29;;22101:184;;;;:::o;22291:117::-;22400:1;22397;22390:12;22414:98;22498:6;22493:3;22488;22475:30;22414:98;;;:::o;22548:537::-;22676:3;22697:86;22776:6;22771:3;22697:86;:::i;:::-;22690:93;;22807:66;22799:6;22796:78;22793:165;;;22877:79;;:::i;:::-;22793:165;22989:4;22981:6;22977:17;22967:27;;23004:43;23040:6;23035:3;23028:5;23004:43;:::i;:::-;23072:6;23067:3;23063:16;23056:23;;22548:537;;;;;:::o;23091:613::-;23300:4;23338:2;23327:9;23323:18;23315:26;;23387:9;23381:4;23377:20;23373:1;23362:9;23358:17;23351:47;23415:118;23528:4;23519:6;23511;23415:118;:::i;:::-;23407:126;;23543:72;23611:2;23600:9;23596:18;23587:6;23543:72;:::i;:::-;23625;23693:2;23682:9;23678:18;23669:6;23625:72;:::i;:::-;23091:613;;;;;;;:::o;23710:161::-;23850:13;23846:1;23838:6;23834:14;23827:37;23710:161;:::o;23877:366::-;24019:3;24040:67;24104:2;24099:3;24040:67;:::i;:::-;24033:74;;24116:93;24205:3;24116:93;:::i;:::-;24234:2;24229:3;24225:12;24218:19;;23877:366;;;:::o;24249:419::-;24415:4;24453:2;24442:9;24438:18;24430:26;;24502:9;24496:4;24492:20;24488:1;24477:9;24473:17;24466:47;24530:131;24656:4;24530:131;:::i;:::-;24522:139;;24249:419;;;:::o;24674:503::-;24855:4;24893:2;24882:9;24878:18;24870:26;;24942:9;24936:4;24932:20;24928:1;24917:9;24913:17;24906:47;24970:118;25083:4;25074:6;25066;24970:118;:::i;:::-;24962:126;;25098:72;25166:2;25155:9;25151:18;25142:6;25098:72;:::i;:::-;24674:503;;;;;;:::o;25183:393::-;25336:4;25374:2;25363:9;25359:18;25351:26;;25423:9;25417:4;25413:20;25409:1;25398:9;25394:17;25387:47;25451:118;25564:4;25555:6;25547;25451:118;:::i;:::-;25443:126;;25183:393;;;;;:::o;25582:442::-;25731:4;25769:2;25758:9;25754:18;25746:26;;25782:71;25850:1;25839:9;25835:17;25826:6;25782:71;:::i;:::-;25863:72;25931:2;25920:9;25916:18;25907:6;25863:72;:::i;:::-;25945;26013:2;26002:9;25998:18;25989:6;25945:72;:::i;:::-;25582:442;;;;;;:::o;26030:180::-;26078:77;26075:1;26068:88;26175:4;26172:1;26165:15;26199:4;26196:1;26189:15;26216:194;26256:4;26276:20;26294:1;26276:20;:::i;:::-;26271:25;;26310:20;26328:1;26310:20;:::i;:::-;26305:25;;26354:1;26351;26347:9;26339:17;;26378:1;26372:4;26369:11;26366:37;;;26383:18;;:::i;:::-;26366:37;26216:194;;;;:::o;26416:191::-;26456:3;26475:20;26493:1;26475:20;:::i;:::-;26470:25;;26509:20;26527:1;26509:20;:::i;:::-;26504:25;;26552:1;26549;26545:9;26538:16;;26573:3;26570:1;26567:10;26564:36;;;26580:18;;:::i;:::-;26564:36;26416:191;;;;:::o;26613:157::-;26753:9;26749:1;26741:6;26737:14;26730:33;26613:157;:::o;26776:365::-;26918:3;26939:66;27003:1;26998:3;26939:66;:::i;:::-;26932:73;;27014:93;27103:3;27014:93;:::i;:::-;27132:2;27127:3;27123:12;27116:19;;26776:365;;;:::o;27147:419::-;27313:4;27351:2;27340:9;27336:18;27328:26;;27400:9;27394:4;27390:20;27386:1;27375:9;27371:17;27364:47;27428:131;27554:4;27428:131;:::i;:::-;27420:139;;27147:419;;;:::o;27572:332::-;27693:4;27731:2;27720:9;27716:18;27708:26;;27744:71;27812:1;27801:9;27797:17;27788:6;27744:71;:::i;:::-;27825:72;27893:2;27882:9;27878:18;27869:6;27825:72;:::i;:::-;27572:332;;;;;:::o;27910:137::-;27964:5;27995:6;27989:13;27980:22;;28011:30;28035:5;28011:30;:::i;:::-;27910:137;;;;:::o;28053:345::-;28120:6;28169:2;28157:9;28148:7;28144:23;28140:32;28137:119;;;28175:79;;:::i;:::-;28137:119;28295:1;28320:61;28373:7;28364:6;28353:9;28349:22;28320:61;:::i;:::-;28310:71;;28266:125;28053:345;;;;:::o;28404:664::-;28609:4;28647:3;28636:9;28632:19;28624:27;;28661:71;28729:1;28718:9;28714:17;28705:6;28661:71;:::i;:::-;28742:72;28810:2;28799:9;28795:18;28786:6;28742:72;:::i;:::-;28824;28892:2;28881:9;28877:18;28868:6;28824:72;:::i;:::-;28906;28974:2;28963:9;28959:18;28950:6;28906:72;:::i;:::-;28988:73;29056:3;29045:9;29041:19;29032:6;28988:73;:::i;:::-;28404:664;;;;;;;;:::o;29074:503::-;29255:4;29293:2;29282:9;29278:18;29270:26;;29342:9;29336:4;29332:20;29328:1;29317:9;29313:17;29306:47;29370:118;29483:4;29474:6;29466;29370:118;:::i;:::-;29362:126;;29498:72;29566:2;29555:9;29551:18;29542:6;29498:72;:::i;:::-;29074:503;;;;;;:::o;29583:332::-;29704:4;29742:2;29731:9;29727:18;29719:26;;29755:71;29823:1;29812:9;29808:17;29799:6;29755:71;:::i;:::-;29836:72;29904:2;29893:9;29889:18;29880:6;29836:72;:::i;:::-;29583:332;;;;;:::o;29921:225::-;30061:34;30057:1;30049:6;30045:14;30038:58;30130:8;30125:2;30117:6;30113:15;30106:33;29921:225;:::o;30152:366::-;30294:3;30315:67;30379:2;30374:3;30315:67;:::i;:::-;30308:74;;30391:93;30480:3;30391:93;:::i;:::-;30509:2;30504:3;30500:12;30493:19;;30152:366;;;:::o;30524:419::-;30690:4;30728:2;30717:9;30713:18;30705:26;;30777:9;30771:4;30767:20;30763:1;30752:9;30748:17;30741:47;30805:131;30931:4;30805:131;:::i;:::-;30797:139;;30524:419;;;:::o;30949:165::-;31089:17;31085:1;31077:6;31073:14;31066:41;30949:165;:::o;31120:366::-;31262:3;31283:67;31347:2;31342:3;31283:67;:::i;:::-;31276:74;;31359:93;31448:3;31359:93;:::i;:::-;31477:2;31472:3;31468:12;31461:19;;31120:366;;;:::o;31492:419::-;31658:4;31696:2;31685:9;31681:18;31673:26;;31745:9;31739:4;31735:20;31731:1;31720:9;31716:17;31709:47;31773:131;31899:4;31773:131;:::i;:::-;31765:139;;31492:419;;;:::o;31917:182::-;32057:34;32053:1;32045:6;32041:14;32034:58;31917:182;:::o;32105:366::-;32247:3;32268:67;32332:2;32327:3;32268:67;:::i;:::-;32261:74;;32344:93;32433:3;32344:93;:::i;:::-;32462:2;32457:3;32453:12;32446:19;;32105:366;;;:::o;32477:419::-;32643:4;32681:2;32670:9;32666:18;32658:26;;32730:9;32724:4;32720:20;32716:1;32705:9;32701:17;32694:47;32758:131;32884:4;32758:131;:::i;:::-;32750:139;;32477:419;;;:::o

Swarm Source

ipfs://dda5a4ce2536514f0903596cd3704c0b999a32c2aec1a9e9ff0944a488c65cc6

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.