ETH Price: $2,406.55 (+1.42%)

Contract

0x9167186EcFc4cCd98CAD792c9a01FedCee5A16C4
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create Order126340222021-06-14 17:55:351178 days ago1623693335IN
0x9167186E...Cee5A16C4
0.015 ETH0.0040596823
Deposit126263242021-06-13 13:10:531179 days ago1623589853IN
0x9167186E...Cee5A16C4
0 ETH0.0005196510
Deposit126263182021-06-13 13:09:271179 days ago1623589767IN
0x9167186E...Cee5A16C4
0 ETH0.0006755413
Deposit125383992021-05-30 22:32:221193 days ago1622413942IN
0x9167186E...Cee5A16C4
0 ETH0.002078640
Deposit125383932021-05-30 22:30:541193 days ago1622413854IN
0x9167186E...Cee5A16C4
0 ETH0.0011432322
Create Order125192752021-05-27 23:24:031196 days ago1622157843IN
0x9167186E...Cee5A16C4
0.015 ETH0.007667439
Cancel124156662021-05-11 21:55:321212 days ago1620770132IN
0x9167186E...Cee5A16C4
0 ETH0.02117904319
Refund124155602021-05-11 21:34:251212 days ago1620768865IN
0x9167186E...Cee5A16C4
0 ETH0.0115572316.10741481
Deposit124154172021-05-11 21:02:471212 days ago1620766967IN
0x9167186E...Cee5A16C4
0.5 ETH0.0469284300
Create Order124149772021-05-11 19:24:021212 days ago1620761042IN
0x9167186E...Cee5A16C4
0.015 ETH0.04607172261
Create Order123437282021-04-30 19:34:501223 days ago1619811290IN
0x9167186E...Cee5A16C4
0.015 ETH0.008650444
Create Order123435572021-04-30 18:56:521223 days ago1619809012IN
0x9167186E...Cee5A16C4
0.015 ETH0.010616454
Cancel123332602021-04-29 4:38:161224 days ago1619671096IN
0x9167186E...Cee5A16C4
0 ETH0.0036515655
Create Order123332162021-04-29 4:29:011224 days ago1619670541IN
0x9167186E...Cee5A16C4
0.015 ETH0.0074133342
Refund123066822021-04-25 2:19:321229 days ago1619317172IN
0x9167186E...Cee5A16C4
0 ETH0.0017274440.5
Refund122931462021-04-23 0:02:581231 days ago1619136178IN
0x9167186E...Cee5A16C4
0 ETH0.0028883179
Deposit122797082021-04-20 22:09:411233 days ago1618956581IN
0x9167186E...Cee5A16C4
0 ETH0.01441188168
Deposit122796102021-04-20 21:49:131233 days ago1618955353IN
0x9167186E...Cee5A16C4
0 ETH0.01441188168
Deposit122795882021-04-20 21:44:301233 days ago1618955070IN
0x9167186E...Cee5A16C4
0 ETH0.03181643173
Create Order122749212021-04-20 4:39:021233 days ago1618893542IN
0x9167186E...Cee5A16C4
0.015 ETH0.02682192152
Create Order122477822021-04-15 23:53:041238 days ago1618530784IN
0x9167186E...Cee5A16C4
0.015 ETH0.0163187983
Create Order122443912021-04-15 11:29:171238 days ago1618486157IN
0x9167186E...Cee5A16C4
0.015 ETH0.0151796886
Deposit122443582021-04-15 11:21:311238 days ago1618485691IN
0x9167186E...Cee5A16C4
9 ETH0.01611208103
Create Order122443542021-04-15 11:20:381238 days ago1618485638IN
0x9167186E...Cee5A16C4
0.015 ETH0.01817908103
Create Order122285312021-04-13 0:33:401241 days ago1618274020IN
0x9167186E...Cee5A16C4
0.015 ETH0.0123334879
View all transactions

Latest 19 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
126340222021-06-14 17:55:351178 days ago1623693335
0x9167186E...Cee5A16C4
0.015 ETH
125192752021-05-27 23:24:031196 days ago1622157843
0x9167186E...Cee5A16C4
0.015 ETH
124154172021-05-11 21:02:471212 days ago1620766967
0x9167186E...Cee5A16C4
0.5 ETH
124149772021-05-11 19:24:021212 days ago1620761042
0x9167186E...Cee5A16C4
0.015 ETH
123437282021-04-30 19:34:501223 days ago1619811290
0x9167186E...Cee5A16C4
0.015 ETH
123435572021-04-30 18:56:521223 days ago1619809012
0x9167186E...Cee5A16C4
0.015 ETH
123332162021-04-29 4:29:011224 days ago1619670541
0x9167186E...Cee5A16C4
0.015 ETH
122749212021-04-20 4:39:021233 days ago1618893542
0x9167186E...Cee5A16C4
0.015 ETH
122477822021-04-15 23:53:041238 days ago1618530784
0x9167186E...Cee5A16C4
0.015 ETH
122443912021-04-15 11:29:171238 days ago1618486157
0x9167186E...Cee5A16C4
0.015 ETH
122443582021-04-15 11:21:311238 days ago1618485691
0x9167186E...Cee5A16C4
9 ETH
122443542021-04-15 11:20:381238 days ago1618485638
0x9167186E...Cee5A16C4
0.015 ETH
122285312021-04-13 0:33:401241 days ago1618274020
0x9167186E...Cee5A16C4
0.015 ETH
121787932021-04-05 9:10:341248 days ago1617613834
0x9167186E...Cee5A16C4
0.015 ETH
121484152021-03-31 17:14:141253 days ago1617210854
0x9167186E...Cee5A16C4
0.015 ETH
121335022021-03-29 10:08:291255 days ago1617012509
0x9167186E...Cee5A16C4
0.015 ETH
121223812021-03-27 17:14:221257 days ago1616865262
0x9167186E...Cee5A16C4
0.015 ETH
121089572021-03-25 15:46:111259 days ago1616687171
0x9167186E...Cee5A16C4
0.015 ETH
121022692021-03-24 15:06:111260 days ago1616598371
0x9167186E...Cee5A16C4
0.015 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Swaps

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion
File 1 of 7 : Swaps.sol
pragma solidity ^0.5.7;

import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol";
import "openzeppelin-solidity/contracts/ownership/Ownable.sol";
import "openzeppelin-solidity/contracts/math/SafeMath.sol";
import "./IERC20.sol";
import "./ISwaps.sol";
import "./Vault.sol";

contract Swaps is Ownable, ISwaps, ReentrancyGuard {
    using SafeMath for uint;

    uint public MAX_INVESTORS = 10;

    uint256 public feeAmount;
    address payable public feeAddress;

    Vault public vault;
    //     id          whiteAddr
    mapping(bytes32 => address) public baseOnlyInvestor;
    //     id          owner
    mapping(bytes32 => address) public owners;
    //     id          baseAddr
    mapping(bytes32 => address) public baseAddresses;
    //     id          quoteAddr
    mapping(bytes32 => address) public quoteAddresses;
    //     id          expire
    mapping(bytes32 => uint) public expirationTimestamps;
    //     id          swapped?
    mapping(bytes32 => bool) public isSwapped;
    //     id          cancelled?
    mapping(bytes32 => bool) public isCancelled;
    //      id                base/quote  limit
    mapping(bytes32 => mapping(address => uint)) public limits;
    //      id                base/quote  raised
    mapping(bytes32 => mapping(address => uint)) public raised;
    //      id                base/quote  investors
    mapping(bytes32 => mapping(address => address[])) public investors;
    //      id                base/quote         investor    amount
    mapping(bytes32 => mapping(address => mapping(address => uint))) public investments;
    //      id                base/quote  minLimit
    mapping(bytes32 => mapping(address => uint)) public minInvestments;
    //      id         brokers
    mapping(bytes32 => address[]) public brokers;
    //      id                base/quote         broker      percent
    mapping(bytes32 => mapping(address => mapping(address => uint))) public brokerPercents;

    uint public myWishBasePercent;
    uint public myWishQuotePercent;
    address public myWishAddress;

    modifier onlyInvestor(bytes32 _id, address _token) {
        require(
            _isInvestor(_id, _token, msg.sender),
            "Swaps: Allowed only for investors"
        );
        _;
    }

    modifier onlyWhenVaultDefined() {
        require(address(vault) != address(0), "Swaps: Vault is not defined");
        _;
    }

    modifier onlyOrderOwner(bytes32 _id) {
        require(msg.sender == owners[_id], "Swaps: Allowed only for owner");
        _;
    }

    modifier onlyWhenOrderExists(bytes32 _id) {
        require(owners[_id] != address(0), "Swaps: Order doesn't exist");
        _;
    }

    modifier hasFeeAndTransferIt {
        require(
            msg.value == feeAmount,
            "Swaps: Not enough fee"
        );
        feeAddress.transfer(msg.value);
        _;
    }

    event OrderCreated(
        bytes32 id,
        address owner,
        address baseAddress,
        address quoteAddress,
        uint baseLimit,
        uint quoteLimit,
        uint expirationTimestamp,
        address baseOnlyInvestor,
        uint minBaseInvestment,
        uint minQuoteInvestment,
        address broker,
        uint brokerBasePercent,
        uint brokerQuotePercent
    );

    event OrderCancelled(bytes32 id);

    event Deposit(
        bytes32 id,
        address token,
        address user,
        uint amount,
        uint balance
    );

    event Refund(bytes32 id, address token, address user, uint amount);

    event OrderSwapped(bytes32 id, address byUser);

    event SwapSend(bytes32 id, address token, address user, uint amount);

    event BrokerSend(bytes32 id, address token, address broker, uint amount);

    event MyWishAddressChange(
        address oldMyWishAddress,
        address newMyWishAddress
    );

    event MyWishPercentsChange(
        uint oldBasePercent,
        uint oldQuotePercent,
        uint newBasePercent,
        uint newQuotePercent
    );

    constructor(
        uint256 _feeAmount,
        address payable _feeAddress
    ) public {
        feeAmount = _feeAmount;
        feeAddress = _feeAddress;
    }

    function tokenFallback(address, uint, bytes calldata) external {}

    function createOrder(
        address _baseAddress,
        address _quoteAddress,
        uint _baseLimit,
        uint _quoteLimit,
        uint _expirationTimestamp,
        address _baseOnlyInvestor,
        uint _minBaseInvestment,
        uint _minQuoteInvestment,
        address _brokerAddress,
        uint _brokerBasePercent,
        uint _brokerQuotePercent
    )
        external
        payable
        nonReentrant
        onlyWhenVaultDefined
        hasFeeAndTransferIt
        returns(bytes32 _id)
    {
        _id = createKey(msg.sender);
        require(owners[_id] == address(0), "Swaps: Order already exists");
        require(
            _baseAddress != _quoteAddress,
            "Swaps: Exchanged tokens must be different"
        );
        require(_baseLimit > 0, "Swaps: Base limit must be positive");
        require(_quoteLimit > 0, "Swaps: Quote limit must be positive");
        require(
            _expirationTimestamp > now,
            "Swaps: Expiration time must be in future"
        );
        require(
            _brokerBasePercent.add(myWishBasePercent) <= 10000,
            "Swaps: Base percent sum should be less than 100%"
        );
        require(
            _brokerQuotePercent.add(myWishQuotePercent) <= 10000,
            "Swaps: Quote percent sum should be less than 100%"
        );

        owners[_id] = msg.sender;
        baseAddresses[_id] = _baseAddress;
        quoteAddresses[_id] = _quoteAddress;
        expirationTimestamps[_id] = _expirationTimestamp;
        limits[_id][_baseAddress] = _baseLimit;
        limits[_id][_quoteAddress] = _quoteLimit;
        baseOnlyInvestor[_id] = _baseOnlyInvestor;
        minInvestments[_id][_baseAddress] = _minBaseInvestment;
        minInvestments[_id][_quoteAddress] = _minQuoteInvestment;
        if (_brokerAddress != address(0)) {
            brokers[_id].push(_brokerAddress);
            brokerPercents[_id][_baseAddress][_brokerAddress] = _brokerBasePercent;
            brokerPercents[_id][_quoteAddress][_brokerAddress] = _brokerQuotePercent;
        }
        if (myWishAddress != address(0)) {
            brokers[_id].push(myWishAddress);
            brokerPercents[_id][_baseAddress][myWishAddress] = myWishBasePercent;
            brokerPercents[_id][_quoteAddress][myWishAddress] = myWishQuotePercent;
        }

        emit OrderCreated(
            _id,
            msg.sender,
            _baseAddress,
            _quoteAddress,
            _baseLimit,
            _quoteLimit,
            _expirationTimestamp,
            _baseOnlyInvestor,
            _minBaseInvestment,
            _minQuoteInvestment,
            _brokerAddress,
            _brokerBasePercent,
            _brokerQuotePercent
        );
    }

    function deposit(bytes32 _id, address _token, uint _amount)
        external
        payable
        nonReentrant
        onlyWhenVaultDefined
        onlyWhenOrderExists(_id)
    {
        if (_token == address(0)) {
            require(
                msg.value == _amount,
                "Swaps: Payable value should be equals value"
            );
            address(vault).transfer(msg.value);
        } else {
            require(msg.value == 0, "Swaps: Payable not allowed here");
            uint allowance = IERC20(_token).allowance(
                msg.sender,
                address(this)
            );
            require(
                _amount <= allowance,
                "Swaps: Allowance should be not less than amount"
            );
            IERC20(_token).transferFrom(msg.sender, address(vault), _amount);
        }
        _deposit(_id, _token, msg.sender, _amount);
    }

    function cancel(bytes32 _id)
        external
        nonReentrant
        onlyOrderOwner(_id)
        onlyWhenVaultDefined
        onlyWhenOrderExists(_id)
    {
        require(!isCancelled[_id], "Swaps: Already cancelled");
        require(!isSwapped[_id], "Swaps: Already swapped");

        address[2] memory tokens = [baseAddresses[_id], quoteAddresses[_id]];
        for (uint t = 0; t < tokens.length; t++) {
            address token = tokens[t];
            for (uint u = 0; u < investors[_id][token].length; u++) {
                address user = investors[_id][token][u];
                uint userInvestment = investments[_id][token][user];
                vault.withdraw(token, user, userInvestment);
            }
        }

        isCancelled[_id] = true;
        emit OrderCancelled(_id);
    }

    function refund(bytes32 _id, address _token)
        external
        nonReentrant
        onlyInvestor(_id, _token)
        onlyWhenVaultDefined
        onlyWhenOrderExists(_id)
    {
        require(!isCancelled[_id], "Swaps: Order cancelled");
        require(!isSwapped[_id], "Swaps: Already swapped");
        address user = msg.sender;
        uint investment = investments[_id][_token][user];
        if (investment > 0) {
            delete investments[_id][_token][user];
        }

        _removeInvestor(investors[_id][_token], user);

        if (investment > 0) {
            raised[_id][_token] = raised[_id][_token].sub(investment);
            vault.withdraw(_token, user, investment);
        }

        emit Refund(_id, _token, user, investment);
    }

    function setVault(Vault _vault) external onlyOwner {
        vault = _vault;
    }

    function setMyWishPercents(uint _basePercent, uint _quotePercent)
        external
        onlyOwner
    {
        require(_basePercent <= 10000, "Swaps: Base percent should be less than 100%");
        require(
            _quotePercent <= 10000,
            "Swaps: Quote percent should be less than 100%"
        );

        emit MyWishPercentsChange(
            myWishBasePercent,
            myWishQuotePercent,
            _basePercent,
            _quotePercent
        );

        myWishBasePercent = _basePercent;
        myWishQuotePercent = _quotePercent;
    }

    function setMyWishAddress(address _myWishAddress) external onlyOwner {
        emit MyWishAddressChange(myWishAddress, _myWishAddress);
        myWishAddress = _myWishAddress;
    }

    function setFeeParameters(
        uint256 _feeAmount,
        address payable _feeAddress
    )
        external
        onlyOwner
    {
        feeAmount = _feeAmount;
        feeAddress = _feeAddress;
    }

    function createKey(address _owner) public view returns (bytes32 result) {
        uint creationTime = now;
        result = 0x0000000000000000000000000000000000000000000000000000000000000000;
        assembly {
            result := or(result, mul(_owner, 0x1000000000000000000000000))
            result := or(result, and(creationTime, 0xffffffffffffffffffffffff))
        }
    }

    function allBrokersBasePercent(bytes32 _id) public view returns (uint) {
        return _allBrokersPercent(baseAddresses[_id], _id);
    }

    function allBrokersQuotePercent(bytes32 _id) public view returns (uint) {
        return _allBrokersPercent(quoteAddresses[_id], _id);
    }

    function baseLimit(bytes32 _id) public view returns (uint) {
        return limits[_id][baseAddresses[_id]];
    }

    function quoteLimit(bytes32 _id) public view returns (uint) {
        return limits[_id][quoteAddresses[_id]];
    }

    function baseRaised(bytes32 _id) public view returns (uint) {
        return raised[_id][baseAddresses[_id]];
    }

    function quoteRaised(bytes32 _id) public view returns (uint) {
        return raised[_id][quoteAddresses[_id]];
    }

    function isBaseFilled(bytes32 _id) public view returns (bool) {
        return raised[_id][baseAddresses[_id]] == limits[_id][baseAddresses[_id]];
    }

    function isQuoteFilled(bytes32 _id) public view returns (bool) {
        return raised[_id][quoteAddresses[_id]] == limits[_id][quoteAddresses[_id]];
    }

    function baseInvestors(bytes32 _id) public view returns (address[] memory) {
        return investors[_id][baseAddresses[_id]];
    }

    function quoteInvestors(bytes32 _id)
        public
        view
        returns (address[] memory)
    {
        return investors[_id][quoteAddresses[_id]];
    }

    function baseUserInvestment(bytes32 _id, address _user)
        public
        view
        returns (uint)
    {
        return investments[_id][baseAddresses[_id]][_user];
    }

    function quoteUserInvestment(bytes32 _id, address _user)
        public
        view
        returns (uint)
    {
        return investments[_id][quoteAddresses[_id]][_user];
    }

    function orderBrokers(bytes32 _id) public view returns (address[] memory) {
        return brokers[_id];
    }

    function _allBrokersPercent(address _side, bytes32 _id) internal view returns (uint) {
        uint percents;

        for (uint i = 0; i < brokers[_id].length; i++) {
            address broker = brokers[_id][i];
            uint percent = brokerPercents[_id][_side][broker];
            percents = percents.add(percent);
        }
        return percents;
    }

    function _swap(bytes32 _id) internal {
        require(!isSwapped[_id], "Swaps: Already swapped");
        require(!isCancelled[_id], "Swaps: Already cancelled");
        require(isBaseFilled(_id), "Swaps: Base tokens not filled");
        require(isQuoteFilled(_id), "Swaps: Quote tokens not filled");
        require(now <= expirationTimestamps[_id], "Contract expired");

        _distribute(_id, baseAddresses[_id], quoteAddresses[_id]);
        _distribute(_id, quoteAddresses[_id], baseAddresses[_id]);

        isSwapped[_id] = true;
        emit OrderSwapped(_id, msg.sender);
    }

    function _distribute(bytes32 _id, address _aSide, address _bSide) internal {
        uint brokersPercent;
        for (uint i = 0; i < brokers[_id].length; i++) {
            address broker = brokers[_id][i];
            uint percent = brokerPercents[_id][_bSide][broker];
            brokersPercent = brokersPercent.add(percent);
        }

        uint toPayBrokers = raised[_id][_bSide].mul(brokersPercent).div(10000);
        uint toPayInvestors = raised[_id][_bSide].sub(toPayBrokers);

        uint remainder = toPayInvestors;
        for (uint i = 0; i < investors[_id][_aSide].length; i++) {
            address user = investors[_id][_aSide][i];
            uint toPay;
            // last
            if (i + 1 == investors[_id][_aSide].length) {
                toPay = remainder;
            } else {
                uint aSideRaised = raised[_id][_aSide];
                uint userInvestment = investments[_id][_aSide][user];
                toPay = userInvestment.mul(toPayInvestors).div(aSideRaised);
                remainder = remainder.sub(toPay);
            }

            vault.withdraw(_bSide, user, toPay);
            emit SwapSend(_id, _bSide, user, toPay);
        }

        remainder = toPayBrokers;
        for (uint i = 0; i < brokers[_id].length; i++) {
            address broker = brokers[_id][i];
            uint toPay;
            if (i + 1 == brokers[_id].length) {
                toPay = remainder;
            } else {
                uint percent = brokerPercents[_id][_bSide][broker];
                toPay = toPayBrokers.mul(percent).div(brokersPercent);
                remainder = remainder.sub(toPay);
            }

            vault.withdraw(_bSide, broker, toPay);
            emit BrokerSend(_id, _bSide, broker, toPay);
        }
    }

    function _removeInvestor(address[] storage _array, address _investor)
        internal
    {
        uint idx = _array.length - 1;
        for (uint i = 0; i < _array.length - 1; i++) {
            if (_array[i] == _investor) {
                idx = i;
                break;
            }
        }

        _array[idx] = _array[_array.length - 1];
        delete _array[_array.length - 1];
        _array.length--;
    }

    function _deposit(bytes32 _id, address _token, address _from, uint _amount)
        internal
    {
        uint amount = _amount;
        require(
            baseAddresses[_id] == _token || quoteAddresses[_id] == _token,
            "Swaps: You can deposit only base or quote currency"
        );
        require(
            raised[_id][_token] < limits[_id][_token],
            "Swaps: Limit already reached"
        );
        require(now <= expirationTimestamps[_id], "Swaps: Contract expired");
        if (baseAddresses[_id] == _token && baseOnlyInvestor[_id] != address(
            0
        )) {
            require(
                msg.sender == baseOnlyInvestor[_id],
                "Swaps: Allowed only for specified address"
            );
        }
        if (limits[_id][_token].sub(
            raised[_id][_token]
        ) > minInvestments[_id][_token]) {
            require(
                _amount >= minInvestments[_id][_token],
                "Swaps: Should not be less than minimum value"
            );
        }

        if (!_isInvestor(_id, _token, _from)) {
            require(
                investors[_id][_token].length < MAX_INVESTORS,
                "Swaps: Too many investors"
            );
            investors[_id][_token].push(_from);
        }

        uint raisedWithOverflow = raised[_id][_token].add(amount);
        if (raisedWithOverflow > limits[_id][_token]) {
            uint overflow = raisedWithOverflow.sub(limits[_id][_token]);
            vault.withdraw(_token, _from, overflow);
            amount = amount.sub(overflow);
        }

        investments[_id][_token][_from] = investments[_id][_token][_from].add(
            amount
        );

        raised[_id][_token] = raised[_id][_token].add(amount);
        emit Deposit(
            _id,
            _token,
            _from,
            amount,
            investments[_id][_token][_from]
        );

        if (isBaseFilled(_id) && isQuoteFilled(_id)) {
            _swap(_id);
        }
    }

    function _isInvestor(bytes32 _id, address _token, address _who)
        internal
        view
        returns (bool)
    {
        return investments[_id][_token][_who] > 0;
    }
}

File 2 of 7 : IERC20.sol
pragma solidity ^0.5.6;

/**
 * @title ERC20 interface without bool returns
 * @dev see https://eips.ethereum.org/EIPS/eip-20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external;

    function approve(address spender, uint256 value) external;

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

    function totalSupply() external view returns (uint256);

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

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

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

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

File 3 of 7 : ISwaps.sol
pragma solidity ^0.5.7;

interface ISwaps {
    function createOrder(
        address _baseAddress,
        address _quoteAddress,
        uint _baseLimit,
        uint _quoteLimit,
        uint _expirationTimestamp,
        address _baseOnlyInvestor,
        uint _minBaseInvestment,
        uint _minQuoteInvestment,
        address _brokerAddress,
        uint _brokerBasePercent,
        uint _brokerQuotePercent
    ) external payable returns(bytes32 _id);

    function deposit(bytes32 _id, address _token, uint _amount)
        external
        payable;

    function cancel(bytes32 _id) external;

    function refund(bytes32 _id, address _token) external;
}

File 4 of 7 : Vault.sol
pragma solidity ^0.5.7;

import "openzeppelin-solidity/contracts/ownership/Ownable.sol";
import "./IERC20.sol";

contract Vault is Ownable {
    address public swaps;

    modifier onlySwaps() {
        require(msg.sender == swaps);
        _;
    }

    function() external payable {}

    function tokenFallback(address, uint, bytes calldata) external {}

    function setSwaps(address _swaps) public onlyOwner {
        swaps = _swaps;
    }

    function withdraw(address _token, address _receiver, uint _amount)
        public
        onlySwaps
    {
        if (_token == address(0)) {
            address(uint160(_receiver)).transfer(_amount);
        } else {
            IERC20(_token).transfer(_receiver, _amount);
        }
    }
}

File 5 of 7 : SafeMath.sol
pragma solidity ^0.5.2;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

File 6 of 7 : Ownable.sol
pragma solidity ^0.5.2;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address private _owner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

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

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     * @notice Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 7 of 7 : ReentrancyGuard.sol
pragma solidity ^0.5.2;

/**
 * @title Helps contracts guard against reentrancy attacks.
 * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]>
 * @dev If you mark a function `nonReentrant`, you should also
 * mark it `external`.
 */
contract ReentrancyGuard {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () internal {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter);
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_feeAmount","type":"uint256"},{"internalType":"address payable","name":"_feeAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"broker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BrokerSend","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldMyWishAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newMyWishAddress","type":"address"}],"name":"MyWishAddressChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldBasePercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldQuotePercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBasePercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newQuotePercent","type":"uint256"}],"name":"MyWishPercentsChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"OrderCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"baseAddress","type":"address"},{"indexed":false,"internalType":"address","name":"quoteAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"baseLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quoteLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expirationTimestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"baseOnlyInvestor","type":"address"},{"indexed":false,"internalType":"uint256","name":"minBaseInvestment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minQuoteInvestment","type":"uint256"},{"indexed":false,"internalType":"address","name":"broker","type":"address"},{"indexed":false,"internalType":"uint256","name":"brokerBasePercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"brokerQuotePercent","type":"uint256"}],"name":"OrderCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"byUser","type":"address"}],"name":"OrderSwapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapSend","type":"event"},{"constant":true,"inputs":[],"name":"MAX_INVESTORS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"allBrokersBasePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"allBrokersQuotePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"baseAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"baseInvestors","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"baseLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"baseOnlyInvestor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"baseRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"baseUserInvestment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"brokerPercents","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"brokers","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"cancel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"createKey","outputs":[{"internalType":"bytes32","name":"result","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_baseAddress","type":"address"},{"internalType":"address","name":"_quoteAddress","type":"address"},{"internalType":"uint256","name":"_baseLimit","type":"uint256"},{"internalType":"uint256","name":"_quoteLimit","type":"uint256"},{"internalType":"uint256","name":"_expirationTimestamp","type":"uint256"},{"internalType":"address","name":"_baseOnlyInvestor","type":"address"},{"internalType":"uint256","name":"_minBaseInvestment","type":"uint256"},{"internalType":"uint256","name":"_minQuoteInvestment","type":"uint256"},{"internalType":"address","name":"_brokerAddress","type":"address"},{"internalType":"uint256","name":"_brokerBasePercent","type":"uint256"},{"internalType":"uint256","name":"_brokerQuotePercent","type":"uint256"}],"name":"createOrder","outputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"expirationTimestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"investments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"investors","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"isBaseFilled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"isCancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"isQuoteFilled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"isSwapped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"limits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"minInvestments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"myWishAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"myWishBasePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"myWishQuotePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"orderBrokers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"quoteAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"quoteInvestors","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"quoteLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"quoteRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"quoteUserInvestment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"raised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_token","type":"address"}],"name":"refund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_feeAmount","type":"uint256"},{"internalType":"address payable","name":"_feeAddress","type":"address"}],"name":"setFeeParameters","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_myWishAddress","type":"address"}],"name":"setMyWishAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_basePercent","type":"uint256"},{"internalType":"uint256","name":"_quotePercent","type":"uint256"}],"name":"setMyWishPercents","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract Vault","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokenFallback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"vault","outputs":[{"internalType":"contract Vault","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]

6080604052600a60025534801561001557600080fd5b506040516200499d3803806200499d8339818101604052604081101561003a57600080fd5b508051602090910151600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360018055600391909155600480546001600160a01b0319166001600160a01b039092169190911790556148d880620000c56000396000f3fe6080604052600436106103135760003560e01c80638da5cb5b1161019a578063ca54f06d116100e1578063e63bc8c01161008a578063fa36e3c111610064578063fa36e3c114610cc9578063fb8ad6ff14610cf3578063fbfa77cf14610d1d57610313565b8063e63bc8c014610c35578063f2fde38b14610c5f578063f69b2e2014610c9f57610313565b8063d3cd2cd8116100bb578063d3cd2cd814610b86578063d537136714610bb0578063d954863c14610bf657610313565b8063ca54f06d14610ab2578063ccc109e214610af2578063ce997f8814610b3857610313565b8063ae760c5c11610143578063c2698ff31161011d578063c2698ff314610a10578063c3b0385914610a5e578063c4d252f514610a8857610313565b8063ae760c5c1461091d578063b1ebc0d614610947578063c0ee0b8a1461097157610313565b80639ff99b37116101745780639ff99b3714610899578063a0e20c3a146108c9578063a8a4a963146108f357610313565b80638da5cb5b146108455780638f32d59b1461085a5780639a5d44071461086f57610313565b8063514467b91161025e5780636a34480b1161020757806375c10897116101e157806375c1089714610783578063844ab3f8146107b357806389584c27146107ff57610313565b80636a34480b14610744578063715018a6146107595780637269180c1461076e57610313565b80636817031b116102385780636817031b146106c557806369e15404146107055780636a29f5391461071a57610313565b8063514467b9146106155780635dde3df2146106555780636707bb061461067f57610313565b80632fc29c66116102c057806340b20b091161029a57806340b20b091461057257806341275358146105ba57806345b4032c146105cf57610313565b80632fc29c66146104b95780632fe48944146104e35780633e6fa6bb146104f857610313565b8063196c3fbf116102f1578063196c3fbf146103fe57806325008c971461043c578063250b60481461048f57610313565b8063073a0f921461031857806308abb4ab1461037057806310af256014610385575b600080fd5b34801561032457600080fd5b5061035e6004803603604081101561033b57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16610d32565b60408051918252519081900360200190f35b34801561037c57600080fd5b5061035e610d4f565b61035e600480360361016081101561039c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a081013582169160c08201359160e0810135916101008201351690610120810135906101400135610d55565b34801561040a57600080fd5b506104286004803603602081101561042157600080fd5b50356119e1565b604080519115158252519081900360200190f35b34801561044857600080fd5b506104666004803603602081101561045f57600080fd5b50356119f6565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561049b57600080fd5b5061035e600480360360208110156104b257600080fd5b5035611a1e565b3480156104c557600080fd5b50610466600480360360208110156104dc57600080fd5b5035611a30565b3480156104ef57600080fd5b50610466611a58565b34801561050457600080fd5b506105226004803603602081101561051b57600080fd5b5035611a74565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561055e578181015183820152602001610546565b505050509050019250505060405180910390f35b34801561057e57600080fd5b506105b86004803603604081101561059557600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611b12565b005b3480156105c657600080fd5b50610466611b6f565b3480156105db57600080fd5b506105b8600480360360408110156105f257600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611b8b565b34801561062157600080fd5b506105b86004803603602081101561063857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612030565b34801561066157600080fd5b5061035e6004803603602081101561067857600080fd5b50356120dd565b34801561068b57600080fd5b5061035e600480360360408110156106a257600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16612117565b3480156106d157600080fd5b506105b8600480360360208110156106e857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612134565b34801561071157600080fd5b5061035e61218c565b34801561072657600080fd5b506104286004803603602081101561073d57600080fd5b5035612192565b34801561075057600080fd5b5061035e6121e2565b34801561076557600080fd5b506105b86121e8565b34801561077a57600080fd5b5061035e612268565b34801561078f57600080fd5b50610466600480360360408110156107a657600080fd5b508035906020013561226e565b3480156107bf57600080fd5b50610466600480360360608110156107d657600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201351690604001356122b0565b34801561080b57600080fd5b5061035e6004803603604081101561082257600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166122ff565b34801561085157600080fd5b5061046661231c565b34801561086657600080fd5b50610428612339565b34801561087b57600080fd5b506104286004803603602081101561089257600080fd5b5035612357565b3480156108a557600080fd5b506105b8600480360360408110156108bc57600080fd5b508035906020013561236c565b3480156108d557600080fd5b5061035e600480360360208110156108ec57600080fd5b503561248b565b3480156108ff57600080fd5b5061035e6004803603602081101561091657600080fd5b50356124c0565b34801561092957600080fd5b506105226004803603602081101561094057600080fd5b50356124fa565b34801561095357600080fd5b5061035e6004803603602081101561096a57600080fd5b5035612596565b34801561097d57600080fd5b506105b86004803603606081101561099457600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516916020810135918101906060810160408201356401000000008111156109d157600080fd5b8201836020820111156109e357600080fd5b80359060200191846001830284011164010000000083111715610a0557600080fd5b5090925090506125d0565b348015610a1c57600080fd5b5061035e60048036036060811015610a3357600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff602082013581169160400135166125d6565b348015610a6a57600080fd5b5061035e60048036036020811015610a8157600080fd5b50356125f9565b348015610a9457600080fd5b506105b860048036036020811015610aab57600080fd5b5035612633565b348015610abe57600080fd5b5061035e60048036036020811015610ad557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612b2f565b348015610afe57600080fd5b5061035e60048036036040811015610b1557600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16612b51565b348015610b4457600080fd5b5061035e60048036036060811015610b5b57600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201358116916040013516612b97565b348015610b9257600080fd5b5061042860048036036020811015610ba957600080fd5b5035612bba565b348015610bbc57600080fd5b5061035e60048036036040811015610bd357600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16612c0a565b6105b860048036036060811015610c0c57600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135169060400135612c50565b348015610c4157600080fd5b5061046660048036036020811015610c5857600080fd5b503561304f565b348015610c6b57600080fd5b506105b860048036036020811015610c8257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613077565b348015610cab57600080fd5b5061035e60048036036020811015610cc257600080fd5b5035613094565b348015610cd557600080fd5b5061052260048036036020811015610cec57600080fd5b50356130c3565b348015610cff57600080fd5b5061046660048036036020811015610d1657600080fd5b503561313a565b348015610d2957600080fd5b50610466613162565b600e60209081526000928352604080842090915290825290205481565b60145481565b600180548101908190556005546000919073ffffffffffffffffffffffffffffffffffffffff16610de757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f53776170733a205661756c74206973206e6f7420646566696e65640000000000604482015290519081900360640190fd5b6003543414610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53776170733a204e6f7420656e6f756768206665650000000000000000000000604482015290519081900360640190fd5b60045460405173ffffffffffffffffffffffffffffffffffffffff909116903480156108fc02916000818181858888f19350505050158015610e9d573d6000803e3d6000fd5b50610ea733612b2f565b60008181526007602052604090205490925073ffffffffffffffffffffffffffffffffffffffff1615610f3b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f53776170733a204f7264657220616c7265616479206578697374730000000000604482015290519081900360640190fd5b8b73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff161415610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061467a6029913960400191505060405180910390fd5b60008b11611019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148826022913960400191505060405180910390fd5b60008a11611072576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806147876023913960400191505060405180910390fd5b4289116110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806146526028913960400191505060405180910390fd5b6127106110e26014548661317e90919063ffffffff16565b1115611139576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806146cf6030913960400191505060405180910390fd5b6127106111516015548561317e90919063ffffffff16565b11156111a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806148016031913960400191505060405180910390fd5b336007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508c6008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b6009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600a6000848152602001908152602001600020819055508a600d600084815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555089600d600084815260200190815260200160002060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550876006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550866011600084815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856011600084815260200190815260200160002060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461162c57601260008381526020019081526020016000208590806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050836013600084815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550826013600084815260200190815260200160002060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60165473ffffffffffffffffffffffffffffffffffffffff16156118505760126000838152602001908152602001600020601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506014546013600084815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506015546013600084815260200190815260200160002060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b7f0d998659c3775ddb3ef2b79566999bcdf638da35541a76893a0f394962fd4d6882338f8f8f8f8f8f8f8f8f8f8f604051808e81526020018d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019d505050505050505050505050505060405180910390a160015481146119d157600080fd5b509b9a5050505050505050505050565b600b6020526000908152604090205460ff1681565b60096020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020526000908152604090205481565b60066020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60165473ffffffffffffffffffffffffffffffffffffffff1681565b6000818152600f60209081526040808320600983528184205473ffffffffffffffffffffffffffffffffffffffff168452825291829020805483518184028101840190945280845260609392830182828015611b0657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611adb575b50505050509050919050565b611b1a612339565b611b2357600080fd5b600391909155600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b600180548101908190558282611ba2828233613197565b611bf7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148326021913960400191505060405180910390fd5b60055473ffffffffffffffffffffffffffffffffffffffff16611c7b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f53776170733a205661756c74206973206e6f7420646566696e65640000000000604482015290519081900360640190fd5b600085815260076020526040902054859073ffffffffffffffffffffffffffffffffffffffff16611d0d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f53776170733a204f7264657220646f65736e2774206578697374000000000000604482015290519081900360640190fd5b6000868152600c602052604090205460ff1615611d8b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f53776170733a204f726465722063616e63656c6c656400000000000000000000604482015290519081900360640190fd5b6000868152600b602052604090205460ff1615611e0957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f53776170733a20416c7265616479207377617070656400000000000000000000604482015290519081900360640190fd5b600086815260106020908152604080832073ffffffffffffffffffffffffffffffffffffffff891684528252808320338085529252909120548015611e8557600088815260106020908152604080832073ffffffffffffffffffffffffffffffffffffffff808c16855290835281842090861684529091528120555b6000888152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b1684529091529020611ebe90836131d6565b8015611fbb576000888152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b168452909152902054611f04908263ffffffff6133c816565b6000898152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff808d16808652919093528184209490945560055481517fd9caed120000000000000000000000000000000000000000000000000000000081526004810195909552868316602486015260448501869052905191169263d9caed1292606480830193919282900301818387803b158015611fa257600080fd5b505af1158015611fb6573d6000803e3d6000fd5b505050505b6040805189815273ffffffffffffffffffffffffffffffffffffffff808a1660208301528416818301526060810183905290517f5b2a5a92e7e0aa7bcf044d10a942ae5f1213049cacda790715f50bb32f503fa79181900360800190a15050505050600154811461202b57600080fd5b505050565b612038612339565b61204157600080fd5b6016546040805173ffffffffffffffffffffffffffffffffffffffff9283168152918316602083015280517f5bb2c7f2a982b5b30825bc7af677a2b5df7c980bbc3791bc2e96fac17abe0bd09281900390910190a1601680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000908152600e60209081526040808320600983528184205473ffffffffffffffffffffffffffffffffffffffff16845290915290205490565b600d60209081526000928352604080842090915290825290205481565b61213c612339565b61214557600080fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60035481565b6000818152600d60209081526040808320600983528184205473ffffffffffffffffffffffffffffffffffffffff1680855290835281842054948452600e83528184209084529091529020541490565b60025481565b6121f0612339565b6121f957600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60155481565b6012602052816000526040600020818154811061228757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b600f60205282600052604060002060205281600052604060002081815481106122d557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16925083915050565b601160209081526000928352604080842090915290825290205481565b60005473ffffffffffffffffffffffffffffffffffffffff165b90565b60005473ffffffffffffffffffffffffffffffffffffffff16331490565b600c6020526000908152604090205460ff1681565b612374612339565b61237d57600080fd5b6127108211156123d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806146a3602c913960400191505060405180910390fd5b612710811115612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614731602d913960400191505060405180910390fd5b60145460155460408051928352602083019190915281810184905260608201839052517f5c83ec202c5fd41a4f89566824a6dc43ac542cd5845a645749e60277c2a81ac29181900360800190a1601491909155601555565b6000818152600860205260408120546124ba9073ffffffffffffffffffffffffffffffffffffffff16836133dd565b92915050565b6000908152600d60209081526040808320600883528184205473ffffffffffffffffffffffffffffffffffffffff16845290915290205490565b6000818152600f60209081526040808320600883528184205473ffffffffffffffffffffffffffffffffffffffff168452825291829020805483518184028101840190945280845260609392830182828015611b065760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611adb5750505050509050919050565b6000908152600e60209081526040808320600883528184205473ffffffffffffffffffffffffffffffffffffffff16845290915290205490565b50505050565b601360209081526000938452604080852082529284528284209052825290205481565b6000908152600d60209081526040808320600983528184205473ffffffffffffffffffffffffffffffffffffffff16845290915290205490565b60018054810190819055600082815260076020526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146126d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f53776170733a20416c6c6f776564206f6e6c7920666f72206f776e6572000000604482015290519081900360640190fd5b60055473ffffffffffffffffffffffffffffffffffffffff1661275557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f53776170733a205661756c74206973206e6f7420646566696e65640000000000604482015290519081900360640190fd5b600083815260076020526040902054839073ffffffffffffffffffffffffffffffffffffffff166127e757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f53776170733a204f7264657220646f65736e2774206578697374000000000000604482015290519081900360640190fd5b6000848152600c602052604090205460ff161561286557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53776170733a20416c72656164792063616e63656c6c65640000000000000000604482015290519081900360640190fd5b6000848152600b602052604090205460ff16156128e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f53776170733a20416c7265616479207377617070656400000000000000000000604482015290519081900360640190fd5b6128eb6145f6565b506040805180820182526000868152600860209081528382205473ffffffffffffffffffffffffffffffffffffffff9081168452888352600982529382205490931692820192909252905b6002811015612aad57600082826002811061294d57fe5b6020020151905060005b6000888152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902054811015612aa3576000888152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281208054839081106129c957fe5b60009182526020808320909101548b835260108252604080842073ffffffffffffffffffffffffffffffffffffffff888116808752918552828620938116808752939094528185205460055483517fd9caed1200000000000000000000000000000000000000000000000000000000815260048101939093526024830185905260448301829052925193965094919093169263d9caed12926064808301939282900301818387803b158015612a7d57600080fd5b505af1158015612a91573d6000803e3d6000fd5b50506001909401935061295792505050565b5050600101612936565b506000858152600c602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815187815291517f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d9281900390910190a15050506001548114612b2b57600080fd5b5050565b6c0100000000000000000000000002426bffffffffffffffffffffffff161790565b6000918252601060209081526040808420600883528185205473ffffffffffffffffffffffffffffffffffffffff90811686529083528185209316845291905290205490565b601060209081526000938452604080852082529284528284209052825290205481565b6000818152600d60209081526040808320600883528184205473ffffffffffffffffffffffffffffffffffffffff1680855290835281842054948452600e83528184209084529091529020541490565b6000918252601060209081526040808420600983528185205473ffffffffffffffffffffffffffffffffffffffff90811686529083528185209316845291905290205490565b6001805481019081905560055473ffffffffffffffffffffffffffffffffffffffff16612cde57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f53776170733a205661756c74206973206e6f7420646566696e65640000000000604482015290519081900360640190fd5b600084815260076020526040902054849073ffffffffffffffffffffffffffffffffffffffff16612d7057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f53776170733a204f7264657220646f65736e2774206578697374000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8416612e2f57823414612de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806147aa602b913960400191505060405180910390fd5b60055460405173ffffffffffffffffffffffffffffffffffffffff909116903480156108fc02916000818181858888f19350505050158015612e29573d6000803e3d6000fd5b50613034565b3415612e9c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53776170733a2050617961626c65206e6f7420616c6c6f776564206865726500604482015290519081900360640190fd5b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152905160009173ffffffffffffffffffffffffffffffffffffffff87169163dd62ed3e91604480820192602092909190829003018186803b158015612f1257600080fd5b505afa158015612f26573d6000803e3d6000fd5b505050506040513d6020811015612f3c57600080fd5b5051905080841115612f99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614853602f913960400191505060405180910390fd5b600554604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9283166024820152604481018790529051918716916323b872dd9160648082019260009290919082900301818387803b15801561301a57600080fd5b505af115801561302e573d6000803e3d6000fd5b50505050505b6130408585338661347f565b5060015481146125d057600080fd5b60086020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61307f612339565b61308857600080fd5b61309181613c3f565b50565b6000818152600960205260408120546124ba9073ffffffffffffffffffffffffffffffffffffffff16836133dd565b600081815260126020908152604091829020805483518184028101840190945280845260609392830182828015611b065760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611adb5750505050509050919050565b60076020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60008282018381101561319057600080fd5b9392505050565b600092835260106020908152604080852073ffffffffffffffffffffffffffffffffffffffff9485168652825280852092909316845252902054151590565b81547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160005b83547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01811015613283578273ffffffffffffffffffffffffffffffffffffffff1684828154811061324b57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561327b57809150613283565b6001016131fd565b50825483907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106132b457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382815481106132eb57fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055825483907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061336957fe5b600091825260209091200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905582546125d0847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301614614565b6000828211156133d757600080fd5b50900390565b600080805b60008481526012602052604090205481101561347757600084815260126020526040812080548390811061341257fe5b600091825260208083209091015487835260138252604080842073ffffffffffffffffffffffffffffffffffffffff8b8116865290845281852092168085529190925291205490915061346b848263ffffffff61317e16565b935050506001016133e2565b509392505050565b600084815260086020526040902054819073ffffffffffffffffffffffffffffffffffffffff858116911614806134dc575060008581526009602052604090205473ffffffffffffffffffffffffffffffffffffffff8581169116145b613531576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806146ff6032913960400191505060405180910390fd5b6000858152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff881680855290835281842054898552600e8452828520918552925290912054106135e257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f53776170733a204c696d697420616c7265616479207265616368656400000000604482015290519081900360640190fd5b6000858152600a602052604090205442111561365f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f53776170733a20436f6e74726163742065787069726564000000000000000000604482015290519081900360640190fd5b60008581526008602052604090205473ffffffffffffffffffffffffffffffffffffffff85811691161480156136b8575060008581526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1615155b156137395760008581526006602052604090205473ffffffffffffffffffffffffffffffffffffffff163314613739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061475e6029913960400191505060405180910390fd5b600085815260116020908152604080832073ffffffffffffffffffffffffffffffffffffffff881680855290835281842054898552600e84528285208286528452828520548a8652600d85528386209286529190935292205490916137a4919063ffffffff6133c816565b111561383257600085815260116020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452909152902054821015613832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806147d5602c913960400191505060405180910390fd5b61383d858585613197565b61394f576002546000868152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902054106138e057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f53776170733a20546f6f206d616e7920696e766573746f727300000000000000604482015290519081900360640190fd5b6000858152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff88811685529083529083208054600181018255908452919092200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169185169190911790555b6000858152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915281205461398f908363ffffffff61317e16565b6000878152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902054909150811115613abe576000868152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152812054613a0a90839063ffffffff6133c816565b600554604080517fd9caed1200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015260448201859052915193945091169163d9caed129160648082019260009290919082900301818387803b158015613a8f57600080fd5b505af1158015613aa3573d6000803e3d6000fd5b50505050613aba81846133c890919063ffffffff16565b9250505b600086815260106020908152604080832073ffffffffffffffffffffffffffffffffffffffff808a1685529083528184209088168452909152902054613b0a908363ffffffff61317e16565b600087815260106020908152604080832073ffffffffffffffffffffffffffffffffffffffff808b16808652918452828520908a168552835281842094909455898352600e82528083209383529290522054613b6c908363ffffffff61317e16565b6000878152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff808b16808652918452828520959095558a8452601083528184208185528352818420948916808552948352928190205481518b8152928301939093528181019390935260608101859052608081019190915290517f52d53f1a8b77300a7e949e8404b5b690925c03bbb3bc329b5a05f70abc2a24a09181900360a00190a1613c1986612bba565b8015613c295750613c2986612192565b15613c3757613c3786613cec565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116613c5f57600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000818152600b602052604090205460ff1615613d6a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f53776170733a20416c7265616479207377617070656400000000000000000000604482015290519081900360640190fd5b6000818152600c602052604090205460ff1615613de857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53776170733a20416c72656164792063616e63656c6c65640000000000000000604482015290519081900360640190fd5b613df181612bba565b613e5c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f53776170733a204261736520746f6b656e73206e6f742066696c6c6564000000604482015290519081900360640190fd5b613e6581612192565b613ed057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f53776170733a2051756f746520746f6b656e73206e6f742066696c6c65640000604482015290519081900360640190fd5b6000818152600a6020526040902054421115613f4d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f436f6e7472616374206578706972656400000000000000000000000000000000604482015290519081900360640190fd5b600081815260086020908152604080832054600990925290912054613f8d91839173ffffffffffffffffffffffffffffffffffffffff9182169116614045565b600081815260096020908152604080832054600890925290912054613fcd91839173ffffffffffffffffffffffffffffffffffffffff9182169116614045565b6000818152600b602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558151838152339181019190915281517f44718dd9f1347cc728de75a7e465c3c52e22588f75b06eac4fe4b0b2b7e061db929181900390910190a150565b6000805b6000858152601260205260409020548110156140de57600085815260126020526040812080548390811061407957fe5b600091825260208083209091015488835260138252604080842073ffffffffffffffffffffffffffffffffffffffff89811686529084528185209216808552919092529120549091506140d2848263ffffffff61317e16565b93505050600101614049565b506000848152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120546141339061271090614127908563ffffffff6145ad16565b9063ffffffff6145d416565b6000868152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915281205491925090614177908363ffffffff6133c816565b90508060005b6000888152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b1684529091529020548110156143bd576000888152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b16845290915281208054839081106141ef57fe5b60009182526020808320909101548b8352600f8252604080842073ffffffffffffffffffffffffffffffffffffffff8d8116865293528320549116925060018401141561423d5750826142ba565b60008a8152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff808e16808652918452828520548f8652601085528386209286529184528285209087168552909252909120546142a382614127838a63ffffffff6145ad16565b92506142b5868463ffffffff6133c816565b955050505b600554604080517fd9caed1200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528581166024830152604482018590529151919092169163d9caed1291606480830192600092919082900301818387803b15801561433d57600080fd5b505af1158015614351573d6000803e3d6000fd5b5050604080518d815273ffffffffffffffffffffffffffffffffffffffff808d1660208301528616818301526060810185905290517f6e71f3d02fa39a6ecb3f8ab11cce4a0aa3959aa8909de48e2ac9be7e135721ee9350908190036080019150a1505060010161417d565b5082905060005b6000888152601260205260409020548110156145a35760008881526012602052604081208054839081106143f457fe5b60009182526020808320909101548b83526012909152604082205473ffffffffffffffffffffffffffffffffffffffff909116925060018401141561443a5750826144a0565b60008a815260136020908152604080832073ffffffffffffffffffffffffffffffffffffffff808d168552908352818420908616845290915290205461448a88614127898463ffffffff6145ad16565b915061449c858363ffffffff6133c816565b9450505b600554604080517fd9caed1200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528581166024830152604482018590529151919092169163d9caed1291606480830192600092919082900301818387803b15801561452357600080fd5b505af1158015614537573d6000803e3d6000fd5b5050604080518d815273ffffffffffffffffffffffffffffffffffffffff808d1660208301528616818301526060810185905290517f9362c2051dce15f5681edba6c4556a3f982e118cd58fc7e1ef64e6fd8988e54e9350908190036080019150a150506001016143c4565b5050505050505050565b6000826145bc575060006124ba565b828202828482816145c957fe5b041461319057600080fd5b60008082116145e257600080fd5b60008284816145ed57fe5b04949350505050565b60405180604001604052806002906020820280388339509192915050565b81548183558181111561202b5760008381526020902061202b91810190830161233691905b8082111561464d5760008155600101614639565b509056fe53776170733a2045787069726174696f6e2074696d65206d75737420626520696e2066757475726553776170733a2045786368616e67656420746f6b656e73206d75737420626520646966666572656e7453776170733a20426173652070657263656e742073686f756c64206265206c657373207468616e203130302553776170733a20426173652070657263656e742073756d2073686f756c64206265206c657373207468616e203130302553776170733a20596f752063616e206465706f736974206f6e6c792062617365206f722071756f74652063757272656e637953776170733a2051756f74652070657263656e742073686f756c64206265206c657373207468616e203130302553776170733a20416c6c6f776564206f6e6c7920666f7220737065636966696564206164647265737353776170733a2051756f7465206c696d6974206d75737420626520706f73697469766553776170733a2050617961626c652076616c75652073686f756c6420626520657175616c732076616c756553776170733a2053686f756c64206e6f74206265206c657373207468616e206d696e696d756d2076616c756553776170733a2051756f74652070657263656e742073756d2073686f756c64206265206c657373207468616e203130302553776170733a20416c6c6f776564206f6e6c7920666f7220696e766573746f727353776170733a20416c6c6f77616e63652073686f756c64206265206e6f74206c657373207468616e20616d6f756e7453776170733a2042617365206c696d6974206d75737420626520706f736974697665a265627a7a72315820e10c6daa07585ce5e81290ff0caa6d495cae5549a8b1859b19f643c0caafa06964736f6c6343000511003200000000000000000000000000000000000000000000000000354a6ba7a180000000000000000000000000007367409e0c12b2b7caa5c990e11a75e0d86580fc

Deployed Bytecode

0x6080604052600436106103135760003560e01c80638da5cb5b1161019a578063ca54f06d116100e1578063e63bc8c01161008a578063fa36e3c111610064578063fa36e3c114610cc9578063fb8ad6ff14610cf3578063fbfa77cf14610d1d57610313565b8063e63bc8c014610c35578063f2fde38b14610c5f578063f69b2e2014610c9f57610313565b8063d3cd2cd8116100bb578063d3cd2cd814610b86578063d537136714610bb0578063d954863c14610bf657610313565b8063ca54f06d14610ab2578063ccc109e214610af2578063ce997f8814610b3857610313565b8063ae760c5c11610143578063c2698ff31161011d578063c2698ff314610a10578063c3b0385914610a5e578063c4d252f514610a8857610313565b8063ae760c5c1461091d578063b1ebc0d614610947578063c0ee0b8a1461097157610313565b80639ff99b37116101745780639ff99b3714610899578063a0e20c3a146108c9578063a8a4a963146108f357610313565b80638da5cb5b146108455780638f32d59b1461085a5780639a5d44071461086f57610313565b8063514467b91161025e5780636a34480b1161020757806375c10897116101e157806375c1089714610783578063844ab3f8146107b357806389584c27146107ff57610313565b80636a34480b14610744578063715018a6146107595780637269180c1461076e57610313565b80636817031b116102385780636817031b146106c557806369e15404146107055780636a29f5391461071a57610313565b8063514467b9146106155780635dde3df2146106555780636707bb061461067f57610313565b80632fc29c66116102c057806340b20b091161029a57806340b20b091461057257806341275358146105ba57806345b4032c146105cf57610313565b80632fc29c66146104b95780632fe48944146104e35780633e6fa6bb146104f857610313565b8063196c3fbf116102f1578063196c3fbf146103fe57806325008c971461043c578063250b60481461048f57610313565b8063073a0f921461031857806308abb4ab1461037057806310af256014610385575b600080fd5b34801561032457600080fd5b5061035e6004803603604081101561033b57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16610d32565b60408051918252519081900360200190f35b34801561037c57600080fd5b5061035e610d4f565b61035e600480360361016081101561039c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a081013582169160c08201359160e0810135916101008201351690610120810135906101400135610d55565b34801561040a57600080fd5b506104286004803603602081101561042157600080fd5b50356119e1565b604080519115158252519081900360200190f35b34801561044857600080fd5b506104666004803603602081101561045f57600080fd5b50356119f6565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561049b57600080fd5b5061035e600480360360208110156104b257600080fd5b5035611a1e565b3480156104c557600080fd5b50610466600480360360208110156104dc57600080fd5b5035611a30565b3480156104ef57600080fd5b50610466611a58565b34801561050457600080fd5b506105226004803603602081101561051b57600080fd5b5035611a74565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561055e578181015183820152602001610546565b505050509050019250505060405180910390f35b34801561057e57600080fd5b506105b86004803603604081101561059557600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611b12565b005b3480156105c657600080fd5b50610466611b6f565b3480156105db57600080fd5b506105b8600480360360408110156105f257600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611b8b565b34801561062157600080fd5b506105b86004803603602081101561063857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612030565b34801561066157600080fd5b5061035e6004803603602081101561067857600080fd5b50356120dd565b34801561068b57600080fd5b5061035e600480360360408110156106a257600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16612117565b3480156106d157600080fd5b506105b8600480360360208110156106e857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612134565b34801561071157600080fd5b5061035e61218c565b34801561072657600080fd5b506104286004803603602081101561073d57600080fd5b5035612192565b34801561075057600080fd5b5061035e6121e2565b34801561076557600080fd5b506105b86121e8565b34801561077a57600080fd5b5061035e612268565b34801561078f57600080fd5b50610466600480360360408110156107a657600080fd5b508035906020013561226e565b3480156107bf57600080fd5b50610466600480360360608110156107d657600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201351690604001356122b0565b34801561080b57600080fd5b5061035e6004803603604081101561082257600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166122ff565b34801561085157600080fd5b5061046661231c565b34801561086657600080fd5b50610428612339565b34801561087b57600080fd5b506104286004803603602081101561089257600080fd5b5035612357565b3480156108a557600080fd5b506105b8600480360360408110156108bc57600080fd5b508035906020013561236c565b3480156108d557600080fd5b5061035e600480360360208110156108ec57600080fd5b503561248b565b3480156108ff57600080fd5b5061035e6004803603602081101561091657600080fd5b50356124c0565b34801561092957600080fd5b506105226004803603602081101561094057600080fd5b50356124fa565b34801561095357600080fd5b5061035e6004803603602081101561096a57600080fd5b5035612596565b34801561097d57600080fd5b506105b86004803603606081101561099457600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516916020810135918101906060810160408201356401000000008111156109d157600080fd5b8201836020820111156109e357600080fd5b80359060200191846001830284011164010000000083111715610a0557600080fd5b5090925090506125d0565b348015610a1c57600080fd5b5061035e60048036036060811015610a3357600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff602082013581169160400135166125d6565b348015610a6a57600080fd5b5061035e60048036036020811015610a8157600080fd5b50356125f9565b348015610a9457600080fd5b506105b860048036036020811015610aab57600080fd5b5035612633565b348015610abe57600080fd5b5061035e60048036036020811015610ad557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612b2f565b348015610afe57600080fd5b5061035e60048036036040811015610b1557600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16612b51565b348015610b4457600080fd5b5061035e60048036036060811015610b5b57600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201358116916040013516612b97565b348015610b9257600080fd5b5061042860048036036020811015610ba957600080fd5b5035612bba565b348015610bbc57600080fd5b5061035e60048036036040811015610bd357600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16612c0a565b6105b860048036036060811015610c0c57600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135169060400135612c50565b348015610c4157600080fd5b5061046660048036036020811015610c5857600080fd5b503561304f565b348015610c6b57600080fd5b506105b860048036036020811015610c8257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613077565b348015610cab57600080fd5b5061035e60048036036020811015610cc257600080fd5b5035613094565b348015610cd557600080fd5b5061052260048036036020811015610cec57600080fd5b50356130c3565b348015610cff57600080fd5b5061046660048036036020811015610d1657600080fd5b503561313a565b348015610d2957600080fd5b50610466613162565b600e60209081526000928352604080842090915290825290205481565b60145481565b600180548101908190556005546000919073ffffffffffffffffffffffffffffffffffffffff16610de757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f53776170733a205661756c74206973206e6f7420646566696e65640000000000604482015290519081900360640190fd5b6003543414610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53776170733a204e6f7420656e6f756768206665650000000000000000000000604482015290519081900360640190fd5b60045460405173ffffffffffffffffffffffffffffffffffffffff909116903480156108fc02916000818181858888f19350505050158015610e9d573d6000803e3d6000fd5b50610ea733612b2f565b60008181526007602052604090205490925073ffffffffffffffffffffffffffffffffffffffff1615610f3b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f53776170733a204f7264657220616c7265616479206578697374730000000000604482015290519081900360640190fd5b8b73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff161415610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061467a6029913960400191505060405180910390fd5b60008b11611019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148826022913960400191505060405180910390fd5b60008a11611072576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806147876023913960400191505060405180910390fd5b4289116110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806146526028913960400191505060405180910390fd5b6127106110e26014548661317e90919063ffffffff16565b1115611139576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806146cf6030913960400191505060405180910390fd5b6127106111516015548561317e90919063ffffffff16565b11156111a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806148016031913960400191505060405180910390fd5b336007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508c6008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b6009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600a6000848152602001908152602001600020819055508a600d600084815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555089600d600084815260200190815260200160002060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550876006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550866011600084815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856011600084815260200190815260200160002060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461162c57601260008381526020019081526020016000208590806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050836013600084815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550826013600084815260200190815260200160002060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60165473ffffffffffffffffffffffffffffffffffffffff16156118505760126000838152602001908152602001600020601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506014546013600084815260200190815260200160002060008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506015546013600084815260200190815260200160002060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b7f0d998659c3775ddb3ef2b79566999bcdf638da35541a76893a0f394962fd4d6882338f8f8f8f8f8f8f8f8f8f8f604051808e81526020018d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019d505050505050505050505050505060405180910390a160015481146119d157600080fd5b509b9a5050505050505050505050565b600b6020526000908152604090205460ff1681565b60096020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b600a6020526000908152604090205481565b60066020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60165473ffffffffffffffffffffffffffffffffffffffff1681565b6000818152600f60209081526040808320600983528184205473ffffffffffffffffffffffffffffffffffffffff168452825291829020805483518184028101840190945280845260609392830182828015611b0657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611adb575b50505050509050919050565b611b1a612339565b611b2357600080fd5b600391909155600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b600180548101908190558282611ba2828233613197565b611bf7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148326021913960400191505060405180910390fd5b60055473ffffffffffffffffffffffffffffffffffffffff16611c7b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f53776170733a205661756c74206973206e6f7420646566696e65640000000000604482015290519081900360640190fd5b600085815260076020526040902054859073ffffffffffffffffffffffffffffffffffffffff16611d0d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f53776170733a204f7264657220646f65736e2774206578697374000000000000604482015290519081900360640190fd5b6000868152600c602052604090205460ff1615611d8b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f53776170733a204f726465722063616e63656c6c656400000000000000000000604482015290519081900360640190fd5b6000868152600b602052604090205460ff1615611e0957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f53776170733a20416c7265616479207377617070656400000000000000000000604482015290519081900360640190fd5b600086815260106020908152604080832073ffffffffffffffffffffffffffffffffffffffff891684528252808320338085529252909120548015611e8557600088815260106020908152604080832073ffffffffffffffffffffffffffffffffffffffff808c16855290835281842090861684529091528120555b6000888152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b1684529091529020611ebe90836131d6565b8015611fbb576000888152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b168452909152902054611f04908263ffffffff6133c816565b6000898152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff808d16808652919093528184209490945560055481517fd9caed120000000000000000000000000000000000000000000000000000000081526004810195909552868316602486015260448501869052905191169263d9caed1292606480830193919282900301818387803b158015611fa257600080fd5b505af1158015611fb6573d6000803e3d6000fd5b505050505b6040805189815273ffffffffffffffffffffffffffffffffffffffff808a1660208301528416818301526060810183905290517f5b2a5a92e7e0aa7bcf044d10a942ae5f1213049cacda790715f50bb32f503fa79181900360800190a15050505050600154811461202b57600080fd5b505050565b612038612339565b61204157600080fd5b6016546040805173ffffffffffffffffffffffffffffffffffffffff9283168152918316602083015280517f5bb2c7f2a982b5b30825bc7af677a2b5df7c980bbc3791bc2e96fac17abe0bd09281900390910190a1601680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000908152600e60209081526040808320600983528184205473ffffffffffffffffffffffffffffffffffffffff16845290915290205490565b600d60209081526000928352604080842090915290825290205481565b61213c612339565b61214557600080fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60035481565b6000818152600d60209081526040808320600983528184205473ffffffffffffffffffffffffffffffffffffffff1680855290835281842054948452600e83528184209084529091529020541490565b60025481565b6121f0612339565b6121f957600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60155481565b6012602052816000526040600020818154811061228757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b600f60205282600052604060002060205281600052604060002081815481106122d557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16925083915050565b601160209081526000928352604080842090915290825290205481565b60005473ffffffffffffffffffffffffffffffffffffffff165b90565b60005473ffffffffffffffffffffffffffffffffffffffff16331490565b600c6020526000908152604090205460ff1681565b612374612339565b61237d57600080fd5b6127108211156123d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806146a3602c913960400191505060405180910390fd5b612710811115612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614731602d913960400191505060405180910390fd5b60145460155460408051928352602083019190915281810184905260608201839052517f5c83ec202c5fd41a4f89566824a6dc43ac542cd5845a645749e60277c2a81ac29181900360800190a1601491909155601555565b6000818152600860205260408120546124ba9073ffffffffffffffffffffffffffffffffffffffff16836133dd565b92915050565b6000908152600d60209081526040808320600883528184205473ffffffffffffffffffffffffffffffffffffffff16845290915290205490565b6000818152600f60209081526040808320600883528184205473ffffffffffffffffffffffffffffffffffffffff168452825291829020805483518184028101840190945280845260609392830182828015611b065760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611adb5750505050509050919050565b6000908152600e60209081526040808320600883528184205473ffffffffffffffffffffffffffffffffffffffff16845290915290205490565b50505050565b601360209081526000938452604080852082529284528284209052825290205481565b6000908152600d60209081526040808320600983528184205473ffffffffffffffffffffffffffffffffffffffff16845290915290205490565b60018054810190819055600082815260076020526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146126d157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f53776170733a20416c6c6f776564206f6e6c7920666f72206f776e6572000000604482015290519081900360640190fd5b60055473ffffffffffffffffffffffffffffffffffffffff1661275557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f53776170733a205661756c74206973206e6f7420646566696e65640000000000604482015290519081900360640190fd5b600083815260076020526040902054839073ffffffffffffffffffffffffffffffffffffffff166127e757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f53776170733a204f7264657220646f65736e2774206578697374000000000000604482015290519081900360640190fd5b6000848152600c602052604090205460ff161561286557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53776170733a20416c72656164792063616e63656c6c65640000000000000000604482015290519081900360640190fd5b6000848152600b602052604090205460ff16156128e357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f53776170733a20416c7265616479207377617070656400000000000000000000604482015290519081900360640190fd5b6128eb6145f6565b506040805180820182526000868152600860209081528382205473ffffffffffffffffffffffffffffffffffffffff9081168452888352600982529382205490931692820192909252905b6002811015612aad57600082826002811061294d57fe5b6020020151905060005b6000888152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902054811015612aa3576000888152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281208054839081106129c957fe5b60009182526020808320909101548b835260108252604080842073ffffffffffffffffffffffffffffffffffffffff888116808752918552828620938116808752939094528185205460055483517fd9caed1200000000000000000000000000000000000000000000000000000000815260048101939093526024830185905260448301829052925193965094919093169263d9caed12926064808301939282900301818387803b158015612a7d57600080fd5b505af1158015612a91573d6000803e3d6000fd5b50506001909401935061295792505050565b5050600101612936565b506000858152600c602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815187815291517f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d9281900390910190a15050506001548114612b2b57600080fd5b5050565b6c0100000000000000000000000002426bffffffffffffffffffffffff161790565b6000918252601060209081526040808420600883528185205473ffffffffffffffffffffffffffffffffffffffff90811686529083528185209316845291905290205490565b601060209081526000938452604080852082529284528284209052825290205481565b6000818152600d60209081526040808320600883528184205473ffffffffffffffffffffffffffffffffffffffff1680855290835281842054948452600e83528184209084529091529020541490565b6000918252601060209081526040808420600983528185205473ffffffffffffffffffffffffffffffffffffffff90811686529083528185209316845291905290205490565b6001805481019081905560055473ffffffffffffffffffffffffffffffffffffffff16612cde57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f53776170733a205661756c74206973206e6f7420646566696e65640000000000604482015290519081900360640190fd5b600084815260076020526040902054849073ffffffffffffffffffffffffffffffffffffffff16612d7057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f53776170733a204f7264657220646f65736e2774206578697374000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8416612e2f57823414612de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806147aa602b913960400191505060405180910390fd5b60055460405173ffffffffffffffffffffffffffffffffffffffff909116903480156108fc02916000818181858888f19350505050158015612e29573d6000803e3d6000fd5b50613034565b3415612e9c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f53776170733a2050617961626c65206e6f7420616c6c6f776564206865726500604482015290519081900360640190fd5b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152905160009173ffffffffffffffffffffffffffffffffffffffff87169163dd62ed3e91604480820192602092909190829003018186803b158015612f1257600080fd5b505afa158015612f26573d6000803e3d6000fd5b505050506040513d6020811015612f3c57600080fd5b5051905080841115612f99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614853602f913960400191505060405180910390fd5b600554604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9283166024820152604481018790529051918716916323b872dd9160648082019260009290919082900301818387803b15801561301a57600080fd5b505af115801561302e573d6000803e3d6000fd5b50505050505b6130408585338661347f565b5060015481146125d057600080fd5b60086020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61307f612339565b61308857600080fd5b61309181613c3f565b50565b6000818152600960205260408120546124ba9073ffffffffffffffffffffffffffffffffffffffff16836133dd565b600081815260126020908152604091829020805483518184028101840190945280845260609392830182828015611b065760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611adb5750505050509050919050565b60076020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60008282018381101561319057600080fd5b9392505050565b600092835260106020908152604080852073ffffffffffffffffffffffffffffffffffffffff9485168652825280852092909316845252902054151590565b81547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160005b83547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01811015613283578273ffffffffffffffffffffffffffffffffffffffff1684828154811061324b57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561327b57809150613283565b6001016131fd565b50825483907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106132b457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382815481106132eb57fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055825483907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061336957fe5b600091825260209091200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905582546125d0847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301614614565b6000828211156133d757600080fd5b50900390565b600080805b60008481526012602052604090205481101561347757600084815260126020526040812080548390811061341257fe5b600091825260208083209091015487835260138252604080842073ffffffffffffffffffffffffffffffffffffffff8b8116865290845281852092168085529190925291205490915061346b848263ffffffff61317e16565b935050506001016133e2565b509392505050565b600084815260086020526040902054819073ffffffffffffffffffffffffffffffffffffffff858116911614806134dc575060008581526009602052604090205473ffffffffffffffffffffffffffffffffffffffff8581169116145b613531576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806146ff6032913960400191505060405180910390fd5b6000858152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff881680855290835281842054898552600e8452828520918552925290912054106135e257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f53776170733a204c696d697420616c7265616479207265616368656400000000604482015290519081900360640190fd5b6000858152600a602052604090205442111561365f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f53776170733a20436f6e74726163742065787069726564000000000000000000604482015290519081900360640190fd5b60008581526008602052604090205473ffffffffffffffffffffffffffffffffffffffff85811691161480156136b8575060008581526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1615155b156137395760008581526006602052604090205473ffffffffffffffffffffffffffffffffffffffff163314613739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061475e6029913960400191505060405180910390fd5b600085815260116020908152604080832073ffffffffffffffffffffffffffffffffffffffff881680855290835281842054898552600e84528285208286528452828520548a8652600d85528386209286529190935292205490916137a4919063ffffffff6133c816565b111561383257600085815260116020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452909152902054821015613832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806147d5602c913960400191505060405180910390fd5b61383d858585613197565b61394f576002546000868152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902054106138e057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f53776170733a20546f6f206d616e7920696e766573746f727300000000000000604482015290519081900360640190fd5b6000858152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff88811685529083529083208054600181018255908452919092200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169185169190911790555b6000858152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915281205461398f908363ffffffff61317e16565b6000878152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902054909150811115613abe576000868152600d6020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152812054613a0a90839063ffffffff6133c816565b600554604080517fd9caed1200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015260448201859052915193945091169163d9caed129160648082019260009290919082900301818387803b158015613a8f57600080fd5b505af1158015613aa3573d6000803e3d6000fd5b50505050613aba81846133c890919063ffffffff16565b9250505b600086815260106020908152604080832073ffffffffffffffffffffffffffffffffffffffff808a1685529083528184209088168452909152902054613b0a908363ffffffff61317e16565b600087815260106020908152604080832073ffffffffffffffffffffffffffffffffffffffff808b16808652918452828520908a168552835281842094909455898352600e82528083209383529290522054613b6c908363ffffffff61317e16565b6000878152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff808b16808652918452828520959095558a8452601083528184208185528352818420948916808552948352928190205481518b8152928301939093528181019390935260608101859052608081019190915290517f52d53f1a8b77300a7e949e8404b5b690925c03bbb3bc329b5a05f70abc2a24a09181900360a00190a1613c1986612bba565b8015613c295750613c2986612192565b15613c3757613c3786613cec565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116613c5f57600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000818152600b602052604090205460ff1615613d6a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f53776170733a20416c7265616479207377617070656400000000000000000000604482015290519081900360640190fd5b6000818152600c602052604090205460ff1615613de857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f53776170733a20416c72656164792063616e63656c6c65640000000000000000604482015290519081900360640190fd5b613df181612bba565b613e5c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f53776170733a204261736520746f6b656e73206e6f742066696c6c6564000000604482015290519081900360640190fd5b613e6581612192565b613ed057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f53776170733a2051756f746520746f6b656e73206e6f742066696c6c65640000604482015290519081900360640190fd5b6000818152600a6020526040902054421115613f4d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f436f6e7472616374206578706972656400000000000000000000000000000000604482015290519081900360640190fd5b600081815260086020908152604080832054600990925290912054613f8d91839173ffffffffffffffffffffffffffffffffffffffff9182169116614045565b600081815260096020908152604080832054600890925290912054613fcd91839173ffffffffffffffffffffffffffffffffffffffff9182169116614045565b6000818152600b602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558151838152339181019190915281517f44718dd9f1347cc728de75a7e465c3c52e22588f75b06eac4fe4b0b2b7e061db929181900390910190a150565b6000805b6000858152601260205260409020548110156140de57600085815260126020526040812080548390811061407957fe5b600091825260208083209091015488835260138252604080842073ffffffffffffffffffffffffffffffffffffffff89811686529084528185209216808552919092529120549091506140d2848263ffffffff61317e16565b93505050600101614049565b506000848152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120546141339061271090614127908563ffffffff6145ad16565b9063ffffffff6145d416565b6000868152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816845290915281205491925090614177908363ffffffff6133c816565b90508060005b6000888152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b1684529091529020548110156143bd576000888152600f6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b16845290915281208054839081106141ef57fe5b60009182526020808320909101548b8352600f8252604080842073ffffffffffffffffffffffffffffffffffffffff8d8116865293528320549116925060018401141561423d5750826142ba565b60008a8152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff808e16808652918452828520548f8652601085528386209286529184528285209087168552909252909120546142a382614127838a63ffffffff6145ad16565b92506142b5868463ffffffff6133c816565b955050505b600554604080517fd9caed1200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528581166024830152604482018590529151919092169163d9caed1291606480830192600092919082900301818387803b15801561433d57600080fd5b505af1158015614351573d6000803e3d6000fd5b5050604080518d815273ffffffffffffffffffffffffffffffffffffffff808d1660208301528616818301526060810185905290517f6e71f3d02fa39a6ecb3f8ab11cce4a0aa3959aa8909de48e2ac9be7e135721ee9350908190036080019150a1505060010161417d565b5082905060005b6000888152601260205260409020548110156145a35760008881526012602052604081208054839081106143f457fe5b60009182526020808320909101548b83526012909152604082205473ffffffffffffffffffffffffffffffffffffffff909116925060018401141561443a5750826144a0565b60008a815260136020908152604080832073ffffffffffffffffffffffffffffffffffffffff808d168552908352818420908616845290915290205461448a88614127898463ffffffff6145ad16565b915061449c858363ffffffff6133c816565b9450505b600554604080517fd9caed1200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528581166024830152604482018590529151919092169163d9caed1291606480830192600092919082900301818387803b15801561452357600080fd5b505af1158015614537573d6000803e3d6000fd5b5050604080518d815273ffffffffffffffffffffffffffffffffffffffff808d1660208301528616818301526060810185905290517f9362c2051dce15f5681edba6c4556a3f982e118cd58fc7e1ef64e6fd8988e54e9350908190036080019150a150506001016143c4565b5050505050505050565b6000826145bc575060006124ba565b828202828482816145c957fe5b041461319057600080fd5b60008082116145e257600080fd5b60008284816145ed57fe5b04949350505050565b60405180604001604052806002906020820280388339509192915050565b81548183558181111561202b5760008381526020902061202b91810190830161233691905b8082111561464d5760008155600101614639565b509056fe53776170733a2045787069726174696f6e2074696d65206d75737420626520696e2066757475726553776170733a2045786368616e67656420746f6b656e73206d75737420626520646966666572656e7453776170733a20426173652070657263656e742073686f756c64206265206c657373207468616e203130302553776170733a20426173652070657263656e742073756d2073686f756c64206265206c657373207468616e203130302553776170733a20596f752063616e206465706f736974206f6e6c792062617365206f722071756f74652063757272656e637953776170733a2051756f74652070657263656e742073686f756c64206265206c657373207468616e203130302553776170733a20416c6c6f776564206f6e6c7920666f7220737065636966696564206164647265737353776170733a2051756f7465206c696d6974206d75737420626520706f73697469766553776170733a2050617961626c652076616c75652073686f756c6420626520657175616c732076616c756553776170733a2053686f756c64206e6f74206265206c657373207468616e206d696e696d756d2076616c756553776170733a2051756f74652070657263656e742073756d2073686f756c64206265206c657373207468616e203130302553776170733a20416c6c6f776564206f6e6c7920666f7220696e766573746f727353776170733a20416c6c6f77616e63652073686f756c64206265206e6f74206c657373207468616e20616d6f756e7453776170733a2042617365206c696d6974206d75737420626520706f736974697665a265627a7a72315820e10c6daa07585ce5e81290ff0caa6d495cae5549a8b1859b19f643c0caafa06964736f6c63430005110032

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

00000000000000000000000000000000000000000000000000354a6ba7a180000000000000000000000000007367409e0c12b2b7caa5c990e11a75e0d86580fc

-----Decoded View---------------
Arg [0] : _feeAmount (uint256): 15000000000000000
Arg [1] : _feeAddress (address): 0x7367409E0c12b2B7cAa5c990E11A75E0D86580fc

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000354a6ba7a18000
Arg [1] : 0000000000000000000000007367409e0c12b2b7caa5c990e11a75e0d86580fc


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.