ETH Price: $2,105.61 (-10.62%)

Contract

0x254BC132532c2932F00347F9BA4ea425Bc1768EF
 

Overview

ETH Balance

0.000325000000000007 ETH

Eth Value

$0.68 (@ $2,105.61/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Ether116253422021-01-10 6:07:491514 days ago1610258869IN
0x254BC132...5Bc1768EF
0 ETH0.0018836660.55241624
Withdraw Ether116253352021-01-10 6:07:071514 days ago1610258827IN
0x254BC132...5Bc1768EF
0 ETH0.0018829360.55241624
Withdraw Ether116253342021-01-10 6:07:001514 days ago1610258820IN
0x254BC132...5Bc1768EF
0 ETH0.0018829360.55241624
Withdraw Ether116253282021-01-10 6:06:011514 days ago1610258761IN
0x254BC132...5Bc1768EF
0 ETH0.0018829360.55241624
Withdraw Ether86140502019-09-24 21:00:121987 days ago1569358812IN
0x254BC132...5Bc1768EF
0 ETH0.0012500422
Withdraw Ether86140452019-09-24 20:58:421987 days ago1569358722IN
0x254BC132...5Bc1768EF
0 ETH0.0005347322
Withdraw Ether86140412019-09-24 20:57:491987 days ago1569358669IN
0x254BC132...5Bc1768EF
0 ETH0.0005347322
Withdraw Ether86140242019-09-24 20:52:521987 days ago1569358372IN
0x254BC132...5Bc1768EF
0 ETH0.0005347322
Withdraw Ether86139862019-09-24 20:44:311987 days ago1569357871IN
0x254BC132...5Bc1768EF
0 ETH0.0006986322
Withdraw Ether86139782019-09-24 20:42:401987 days ago1569357760IN
0x254BC132...5Bc1768EF
0 ETH0.0006986322
Withdraw Ether84553592019-08-31 2:43:442012 days ago1567219424IN
0x254BC132...5Bc1768EF
0 ETH0.0012486322
Withdraw Ether84553452019-08-31 2:41:132012 days ago1567219273IN
0x254BC132...5Bc1768EF
0 ETH0.0007495122
Withdraw Ether84551302019-08-31 1:52:022012 days ago1567216322IN
0x254BC132...5Bc1768EF
0 ETH0.0007000422
Withdraw Ether84550272019-08-31 1:30:332012 days ago1567215033IN
0x254BC132...5Bc1768EF
0 ETH0.0006986322
Transfer83105652019-08-08 14:46:512034 days ago1565275611IN
0x254BC132...5Bc1768EF
0 ETH0.000023491.1
Set Ether Price82964302019-08-06 10:11:142037 days ago1565086274IN
0x254BC132...5Bc1768EF
0 ETH0.000057472
Transfer82950312019-08-06 4:47:152037 days ago1565066835IN
0x254BC132...5Bc1768EF
5 ETH0.003708645
Transfer82902652019-08-05 11:03:282038 days ago1565003008IN
0x254BC132...5Bc1768EF
5.3 ETH0.0089396610
Transfer82835712019-08-04 10:10:562039 days ago1564913456IN
0x254BC132...5Bc1768EF
5 ETH0.004469835
Transfer82831682019-08-04 8:39:182039 days ago1564907958IN
0x254BC132...5Bc1768EF
1 ETH0.002923876
Transfer82831082019-08-04 8:23:532039 days ago1564907033IN
0x254BC132...5Bc1768EF
1 ETH0.004859086
Transfer82772292019-08-03 10:41:162040 days ago1564828876IN
0x254BC132...5Bc1768EF
5 ETH0.003708645
Transfer82429682019-07-29 2:51:352045 days ago1564368695IN
0x254BC132...5Bc1768EF
5 ETH0.004469835
Transfer82199672019-07-25 13:12:242048 days ago1564060344IN
0x254BC132...5Bc1768EF
5.3 ETH0.0004271820
Transfer82170202019-07-25 2:03:152049 days ago1564020195IN
0x254BC132...5Bc1768EF
5 ETH0.003708645
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
116253422021-01-10 6:07:491514 days ago1610258869
0x254BC132...5Bc1768EF
0.495 ETH
116253352021-01-10 6:07:071514 days ago1610258827
0x254BC132...5Bc1768EF
0.00505 ETH
116253342021-01-10 6:07:001514 days ago1610258820
0x254BC132...5Bc1768EF
0.00505 ETH
116253282021-01-10 6:06:011514 days ago1610258761
0x254BC132...5Bc1768EF
0.056158 ETH
86140502019-09-24 21:00:121987 days ago1569358812
0x254BC132...5Bc1768EF
31 ETH
86139862019-09-24 20:44:311987 days ago1569357871
0x254BC132...5Bc1768EF
10 ETH
86139782019-09-24 20:42:401987 days ago1569357760
0x254BC132...5Bc1768EF
1 ETH
84553592019-08-31 2:43:442012 days ago1567219424
0x254BC132...5Bc1768EF
1 ETH
84551302019-08-31 1:52:022012 days ago1567216322
0x254BC132...5Bc1768EF
50 ETH
84550272019-08-31 1:30:332012 days ago1567215033
0x254BC132...5Bc1768EF
0.1 ETH
82950312019-08-06 4:47:152037 days ago1565066835
0x254BC132...5Bc1768EF
2.49 ETH
82950312019-08-06 4:47:152037 days ago1565066835
0x254BC132...5Bc1768EF
0.2 ETH
82950312019-08-06 4:47:152037 days ago1565066835
0x254BC132...5Bc1768EF
0.3 ETH
82950312019-08-06 4:47:152037 days ago1565066835
0x254BC132...5Bc1768EF
0.3 ETH
82902652019-08-05 11:03:282038 days ago1565003008
0x254BC132...5Bc1768EF
2.63 ETH
82902652019-08-05 11:03:282038 days ago1565003008
0x254BC132...5Bc1768EF
0.212 ETH
82902652019-08-05 11:03:282038 days ago1565003008
0x254BC132...5Bc1768EF
0.318 ETH
82902652019-08-05 11:03:282038 days ago1565003008
0x254BC132...5Bc1768EF
0.318 ETH
82835712019-08-04 10:10:562039 days ago1564913456
0x254BC132...5Bc1768EF
2.49 ETH
82835712019-08-04 10:10:562039 days ago1564913456
0x254BC132...5Bc1768EF
0.2 ETH
82835712019-08-04 10:10:562039 days ago1564913456
0x254BC132...5Bc1768EF
0.3 ETH
82835712019-08-04 10:10:562039 days ago1564913456
0x254BC132...5Bc1768EF
0.3 ETH
82831682019-08-04 8:39:182039 days ago1564907958
0x254BC132...5Bc1768EF
0.5 ETH
82831682019-08-04 8:39:182039 days ago1564907958
0x254BC132...5Bc1768EF
0.04 ETH
82831682019-08-04 8:39:182039 days ago1564907958
0x254BC132...5Bc1768EF
0.06 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WesionPublicSale

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-06-27
*/

/**
 *Submitted for verification at Etherscan.io on 2019-06-20
*/

pragma solidity ^0.5.7;

// WESION Public Sale


/**
 * @title SafeMath for uint256
 * @dev Unsigned math operations with safety checks that revert on error.
 */
library SafeMath256 {
    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        assert(c >= a);
        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) {
        assert(b <= a);
        return a - b;
    }

    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        assert(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) {
        assert(b > 0);
        uint256 c = a / b;
        assert(a == b * c + a % b);
        return a / b;
    }

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

/**
 * @title SafeMath for uint16
 * @dev Unsigned math operations with safety checks that revert on error.
 */
library SafeMath16 {
    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint16 a, uint16 b) internal pure returns (uint16 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }

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

    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint16 a, uint16 b) internal pure returns (uint16 c) {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        assert(c / a == b);
        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient,
     * reverts on division by zero.
     */
    function div(uint16 a, uint16 b) internal pure returns (uint16) {
        assert(b > 0);
        uint256 c = a / b;
        assert(a == b * c + a % b);
        return a / b;
    }

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


/**
 * @title Ownable
 */
contract Ownable {
    address private _owner;
    address payable internal _receiver;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event ReceiverChanged(address indexed previousReceiver, address indexed newReceiver);

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

    /**
     * @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(msg.sender == _owner);
        _;
    }

    /**
     * @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) external onlyOwner {
        require(newOwner != address(0));
        address __previousOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(__previousOwner, newOwner);
    }

    /**
     * @dev Change receiver.
     */
    function changeReceiver(address payable newReceiver) external onlyOwner {
        require(newReceiver != address(0));
        address __previousReceiver = _receiver;
        _receiver = newReceiver;
        emit ReceiverChanged(__previousReceiver, newReceiver);
    }

    /**
     * @dev Rescue compatible ERC20 Token
     *
     * @param tokenAddr ERC20 The address of the ERC20 token contract
     * @param receiver The address of the receiver
     * @param amount uint256
     */
    function rescueTokens(address tokenAddr, address receiver, uint256 amount) external onlyOwner {
        IERC20 _token = IERC20(tokenAddr);
        require(receiver != address(0));
        uint256 balance = _token.balanceOf(address(this));
        require(balance >= amount);

        assert(_token.transfer(receiver, amount));
    }

    /**
     * @dev Withdraw ether
     */
    function withdrawEther(address payable to, uint256 amount) external onlyOwner {
        require(to != address(0));
        uint256 balance = address(this).balance;
        require(balance >= amount);

        to.transfer(amount);
    }
}


/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
    bool private _paused;

    event Paused(address account);
    event Unpaused(address account);

    constructor () internal {
        _paused = false;
    }

    /**
     * @return Returns true if the contract is paused, false otherwise.
     */
    function paused() public view returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused() {
        require(!_paused, "Paused.");
        _;
    }

    /**
     * @dev Called by a pauser to pause, triggers stopped state.
     */
    function setPaused(bool state) external onlyOwner {
        if (_paused && !state) {
            _paused = false;
            emit Unpaused(msg.sender);
        } else if (!_paused && state) {
            _paused = true;
            emit Paused(msg.sender);
        }
    }
}


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


/**
 * @title WESION interface
 */
interface IWesion {
    function balanceOf(address owner) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function inWhitelist(address account) external view returns (bool);
    function referrer(address account) external view returns (address);
    function refCount(address account) external view returns (uint256);
}


/**
 * @title WESION Public Sale
 */
contract WesionPublicSale is Ownable, Pausable{
    using SafeMath16 for uint16;
    using SafeMath256 for uint256;

    // WESION
    IWesion public WESION = IWesion(0x2c1564A74F07757765642ACef62a583B38d5A213);

    // Start timestamp
    uint32 _startTimestamp;

    // Audit ether price
    uint256 private _etherPrice;    // 1 Ether = xx.xxxxxx USD, with 6 decimals

    // Referral rewards, 35% for 15 levels
    uint16 private WHITELIST_REF_REWARDS_PCT_SUM = 35;
    uint16[15] private WHITELIST_REF_REWARDS_PCT = [
        6,  // 6% for Level.1
        6,  // 6% for Level.2
        5,  // 5% for Level.3
        4,  // 4% for Level.4
        3,  // 3% for Level.5
        2,  // 2% for Level.6
        1,  // 1% for Level.7
        1,  // 1% for Level.8
        1,  // 1% for Level.9
        1,  // 1% for Level.10
        1,  // 1% for Level.11
        1,  // 1% for Level.12
        1,  // 1% for Level.13
        1,  // 1% for Level.14
        1   // 1% for Level.15
    ];

    // Wei & Gas
    uint72 private WEI_MIN = 0.1 ether;     // 0.1 Ether Minimum
    uint72 private WEI_MAX = 100 ether;     // 100 Ether Maximum
    uint72 private WEI_BONUS = 10 ether;    // >10 Ether for Bonus
    uint24 private GAS_MIN = 3000000;       // 3.0 Mwei gas Mininum
    uint24 private GAS_EX = 1500000;        // 1.5 Mwei gas for ex

    // Price
    uint256 private WESION_USD_PRICE_START = 1000;       // $      0.00100 USD
    uint256 private WESION_USD_PRICE_STEP = 10;          // $    + 0.00001 USD
    uint256 private STAGE_USD_CAP_START = 100000000;    // $    100 USD
    uint256 private STAGE_USD_CAP_STEP = 1000000;       // $     +1 USD
    uint256 private STAGE_USD_CAP_MAX = 15100000000;    // $ 15,100 USD

    uint256 private _WESIONUsdPrice = WESION_USD_PRICE_START;

    // Progress
    uint16 private STAGE_MAX = 60000;   // 60,000 stages total
    uint16 private SEASON_MAX = 100;    // 100 seasons total
    uint16 private SEASON_STAGES = 600; // each 600 stages is a season

    uint16 private _stage;
    uint16 private _season;

    // Sum
    uint256 private _txs;
    uint256 private _WESIONTxs;
    uint256 private _WESIONBonusTxs;
    uint256 private _WESIONWhitelistTxs;
    uint256 private _WESIONIssued;
    uint256 private _WESIONBonus;
    uint256 private _WESIONWhitelist;
    uint256 private _weiSold;
    uint256 private _weiRefRewarded;
    uint256 private _weiTopSales;
    uint256 private _weiTeam;
    uint256 private _weiPending;
    uint256 private _weiPendingTransfered;

    // Top-Sales
    uint256 private TOP_SALES_RATIO_START = 15000000;         // 15%, with 8 decimals
    uint256 private TOP_SALES_RATIO_DISTANCE = 50000000;      // 50%, with 8 decimals

    uint256 private _topSalesRatio = TOP_SALES_RATIO_START;   // 15% + 50% x(_stage/_stageMax)

    // During tx
    bool private _inWhitelist_;
    uint256 private _pending_ = WHITELIST_REF_REWARDS_PCT_SUM;
    uint16[] private _rewards_;
    address[] private _referrers_;

    // Audit ether price auditor
    mapping (address => bool) private _etherPriceAuditors;

    // Stage
    mapping (uint16 => uint256) private _stageUsdSold;
    mapping (uint16 => uint256) private _stageWESIONIssued;

    // Season
    mapping (uint16 => uint256) private _seasonWeiSold;
    mapping (uint16 => uint256) private _seasonWeiTopSales;
    mapping (uint16 => uint256) private _seasonWeiTopSalesTransfered;

    // Account
    mapping (address => uint256) private _accountWESIONIssued;
    mapping (address => uint256) private _accountWESIONBonus;
    mapping (address => uint256) private _accountWESIONWhitelisted;
    mapping (address => uint256) private _accountWeiPurchased;
    mapping (address => uint256) private _accountWeiRefRewarded;

    // Ref
    mapping (uint16 => address[]) private _seasonRefAccounts;
    mapping (uint16 => mapping (address => bool)) private _seasonHasRefAccount;
    mapping (uint16 => mapping (address => uint256)) private _usdSeasonAccountPurchased;
    mapping (uint16 => mapping (address => uint256)) private _usdSeasonAccountRef;

    // Events
    event AuditEtherPriceChanged(uint256 value, address indexed account);
    event AuditEtherPriceAuditorChanged(address indexed account, bool state);

    event WESIONBonusTransfered(address indexed to, uint256 amount);
    event WESIONWhitelistTransfered(address indexed to, uint256 amount);
    event WESIONIssuedTransfered(uint16 stageIndex, address indexed to, uint256 WESIONAmount, uint256 auditEtherPrice, uint256 weiUsed);

    event StageClosed(uint256 _stageNumber, address indexed account);
    event SeasonClosed(uint16 _seasonNumber, address indexed account);

    event SeasonTopSalesWeiTransfered(uint16 seasonNumber, address indexed to, uint256 amount);
    event TeamWeiTransfered(address indexed to, uint256 amount);
    event PendingWeiTransfered(address indexed to, uint256 amount);


    /**
     * @dev Start timestamp.
     */
    function startTimestamp() public view returns (uint32) {
        return _startTimestamp;
    }

    /**
     * @dev Set start timestamp.
     */
    function setStartTimestamp(uint32 timestamp) external onlyOwner {
        _startTimestamp = timestamp;
    }

    /**
     * @dev Throws if not ether price auditor.
     */
    modifier onlyEtherPriceAuditor() {
        require(_etherPriceAuditors[msg.sender]);
        _;
    }

    /**
     * @dev Set audit ether price.
     */
    function setEtherPrice(uint256 value) external onlyEtherPriceAuditor {
        _etherPrice = value;
        emit AuditEtherPriceChanged(value, msg.sender);
    }

    /**
     * @dev Get ether price auditor state.
     */
    function etherPriceAuditor(address account) public view returns (bool) {
        return _etherPriceAuditors[account];
    }

    /**
     * @dev Get ether price auditor state.
     */
    function setEtherPriceAuditor(address account, bool state) external onlyOwner {
        _etherPriceAuditors[account] = state;
        emit AuditEtherPriceAuditorChanged(account, state);
    }

    /**
     * @dev Stage WESION price in USD, by stage index.
     */
    function stageWESIONUsdPrice(uint16 stageIndex) private view returns (uint256) {
        return WESION_USD_PRICE_START.add(WESION_USD_PRICE_STEP.mul(stageIndex));
    }

    /**
     * @dev wei => USD
     */
    function wei2usd(uint256 amount) private view returns (uint256) {
        return amount.mul(_etherPrice).div(1 ether);
    }

    /**
     * @dev USD => wei
     */
    function usd2wei(uint256 amount) private view returns (uint256) {
        return amount.mul(1 ether).div(_etherPrice);
    }

    /**
     * @dev USD => WESION
     */
    function usd2WESION(uint256 usdAmount) private view returns (uint256) {
        return usdAmount.mul(1000000).div(_WESIONUsdPrice);
    }

    /**
     * @dev USD => WESION
     */
    function usd2WESIONByStage(uint256 usdAmount, uint16 stageIndex) public view returns (uint256) {
        return usdAmount.mul(1000000).div(stageWESIONUsdPrice(stageIndex));
    }

    /**
     * @dev Calculate season number, by stage index.
     */
    function calcSeason(uint16 stageIndex) private view returns (uint16) {
        if (stageIndex > 0) {
            uint16 __seasonNumber = stageIndex.div(SEASON_STAGES);

            if (stageIndex.mod(SEASON_STAGES) > 0) {
                return __seasonNumber.add(1);
            }

            return __seasonNumber;
        }

        return 1;
    }

    /**
     * @dev Transfer Top-Sales wei, by season number.
     */
    function transferTopSales(uint16 seasonNumber, address payable to) external onlyOwner {
        uint256 __weiRemain = seasonTopSalesRemain(seasonNumber);
        require(to != address(0));

        _seasonWeiTopSalesTransfered[seasonNumber] = _seasonWeiTopSalesTransfered[seasonNumber].add(__weiRemain);
        emit SeasonTopSalesWeiTransfered(seasonNumber, to, __weiRemain);
        to.transfer(__weiRemain);
    }

    /**
     * @dev Pending remain, in wei.
     */
    function pendingRemain() private view returns (uint256) {
        return _weiPending.sub(_weiPendingTransfered);
    }

    /**
     * @dev Transfer pending wei.
     */
    function transferPending(address payable to) external onlyOwner {
        uint256 __weiRemain = pendingRemain();
        require(to != address(0));

        _weiPendingTransfered = _weiPendingTransfered.add(__weiRemain);
        emit PendingWeiTransfered(to, __weiRemain);
        to.transfer(__weiRemain);
    }

    /**
     * @dev Transfer team wei.
     */
    function transferTeam(address payable to) external onlyOwner {
        uint256 __weiRemain = _weiSold.sub(_weiRefRewarded).sub(_weiTopSales).sub(_weiPending).sub(_weiTeam);
        require(to != address(0));

        _weiTeam = _weiTeam.add(__weiRemain);
        emit TeamWeiTransfered(to, __weiRemain);
        to.transfer(__weiRemain);
    }

    /**
     * @dev Status.
     */
    function status() public view returns (uint256 auditEtherPrice,
                                           uint16 stage,
                                           uint16 season,
                                           uint256 WESIONUsdPrice,
                                           uint256 currentTopSalesRatio,
                                           uint256 txs,
                                           uint256 WESIONTxs,
                                           uint256 WESIONBonusTxs,
                                           uint256 WESIONWhitelistTxs,
                                           uint256 WESIONIssued,
                                           uint256 WESIONBonus,
                                           uint256 WESIONWhitelist) {
        auditEtherPrice = _etherPrice;

        if (_stage > STAGE_MAX) {
            stage = STAGE_MAX;
            season = SEASON_MAX;
        } else {
            stage = _stage;
            season = _season;
        }

        WESIONUsdPrice = _WESIONUsdPrice;
        currentTopSalesRatio = _topSalesRatio;

        txs = _txs;
        WESIONTxs = _WESIONTxs;
        WESIONBonusTxs = _WESIONBonusTxs;
        WESIONWhitelistTxs = _WESIONWhitelistTxs;
        WESIONIssued = _WESIONIssued;
        WESIONBonus = _WESIONBonus;
        WESIONWhitelist = _WESIONWhitelist;
    }

    /**
     * @dev Sum.
     */
    function sum() public view returns(uint256 weiSold,
                                       uint256 weiReferralRewarded,
                                       uint256 weiTopSales,
                                       uint256 weiTeam,
                                       uint256 weiPending,
                                       uint256 weiPendingTransfered,
                                       uint256 weiPendingRemain) {
        weiSold = _weiSold;
        weiReferralRewarded = _weiRefRewarded;
        weiTopSales = _weiTopSales;
        weiTeam = _weiTeam;
        weiPending = _weiPending;
        weiPendingTransfered = _weiPendingTransfered;
        weiPendingRemain = pendingRemain();
    }

    /**
     * @dev Throws if gas is not enough.
     */
    modifier enoughGas() {
        require(gasleft() > GAS_MIN);
        _;
    }

    /**
     * @dev Throws if not started.
     */
    modifier onlyOnSale() {
        require(_startTimestamp > 0 && now > _startTimestamp, "WESION Public-Sale has not started yet.");
        require(_etherPrice > 0, "Audit ETH price must be greater than zero.");
        require(!paused(), "WESION Public-Sale is paused.");
        require(_stage <= STAGE_MAX, "WESION Public-Sale Closed.");
        _;
    }

    /**
     * @dev Top-Sales ratio.
     */
    function topSalesRatio(uint16 stageIndex) private view returns (uint256) {
        return TOP_SALES_RATIO_START.add(TOP_SALES_RATIO_DISTANCE.mul(stageIndex).div(STAGE_MAX));
    }

    /**
     * @dev USD => wei, for Top-Sales
     */
    function usd2weiTopSales(uint256 usdAmount) private view returns (uint256) {
        return usd2wei(usdAmount.mul(_topSalesRatio).div(100000000));
    }

    /**
     * @dev Calculate stage dollor cap, by stage index.
     */
    function stageUsdCap(uint16 stageIndex) private view returns (uint256) {
        uint256 __usdCap = STAGE_USD_CAP_START.add(STAGE_USD_CAP_STEP.mul(stageIndex));

        if (__usdCap > STAGE_USD_CAP_MAX) {
            return STAGE_USD_CAP_MAX;
        }

        return __usdCap;
    }

    /**
     * @dev Stage Vokdn cap, by stage index.
     */
    function stageWESIONCap(uint16 stageIndex) private view returns (uint256) {
        return usd2WESIONByStage(stageUsdCap(stageIndex), stageIndex);
    }

    /**
     * @dev Stage status, by stage index.
     */
    function stageStatus(uint16 stageIndex) public view returns (uint256 WESIONUsdPrice,
                                                                 uint256 WESIONCap,
                                                                 uint256 WESIONOnSale,
                                                                 uint256 WESIONSold,
                                                                 uint256 usdCap,
                                                                 uint256 usdOnSale,
                                                                 uint256 usdSold,
                                                                 uint256 weiTopSalesRatio) {
        if (stageIndex > STAGE_MAX) {
            return (0, 0, 0, 0, 0, 0, 0, 0);
        }

        WESIONUsdPrice = stageWESIONUsdPrice(stageIndex);

        WESIONSold = _stageWESIONIssued[stageIndex];
        WESIONCap = stageWESIONCap(stageIndex);
        WESIONOnSale = WESIONCap.sub(WESIONSold);

        usdSold = _stageUsdSold[stageIndex];
        usdCap = stageUsdCap(stageIndex);
        usdOnSale = usdCap.sub(usdSold);

        weiTopSalesRatio = topSalesRatio(stageIndex);
    }

    /**
     * @dev Season Top-Sales remain, in wei.
     */
    function seasonTopSalesRemain(uint16 seasonNumber) private view returns (uint256) {
        return _seasonWeiTopSales[seasonNumber].sub(_seasonWeiTopSalesTransfered[seasonNumber]);
    }

    /**
     * @dev Season Top-Sales rewards, by season number, in wei.
     */
    function seasonTopSalesRewards(uint16 seasonNumber) public view returns (uint256 weiSold,
                                                                             uint256 weiTopSales,
                                                                             uint256 weiTopSalesTransfered,
                                                                             uint256 weiTopSalesRemain) {
        weiSold = _seasonWeiSold[seasonNumber];
        weiTopSales = _seasonWeiTopSales[seasonNumber];
        weiTopSalesTransfered = _seasonWeiTopSalesTransfered[seasonNumber];
        weiTopSalesRemain = seasonTopSalesRemain(seasonNumber);
    }

    /**
     * @dev Query account.
     */
    function accountQuery(address account) public view returns (uint256 WESIONIssued,
                                                                uint256 WESIONBonus,
                                                                uint256 WESIONWhitelisted,
                                                                uint256 weiPurchased,
                                                                uint256 weiReferralRewarded) {
        WESIONIssued = _accountWESIONIssued[account];
        WESIONBonus = _accountWESIONBonus[account];
        WESIONWhitelisted = _accountWESIONWhitelisted[account];
        weiPurchased = _accountWeiPurchased[account];
        weiReferralRewarded = _accountWeiRefRewarded[account];
    }

    /**
     * @dev Accounts in a specific season.
     */
    function seasonRefAccounts(uint16 seasonNumber) public view returns (address[] memory accounts) {
        accounts = _seasonRefAccounts[seasonNumber];
    }

    /**
     * @dev Season number => account => USD purchased.
     */
    function usdSeasonAccountPurchased(uint16 seasonNumber, address account) public view returns (uint256) {
        return _usdSeasonAccountPurchased[seasonNumber][account];
    }

    /**
     * @dev Season number => account => referral dollors.
     */
    function usdSeasonAccountRef(uint16 seasonNumber, address account) public view returns (uint256) {
        return _usdSeasonAccountRef[seasonNumber][account];
    }

    /**
     * @dev constructor
     */
    constructor () public {
        _etherPriceAuditors[msg.sender] = true;
        _stage = 0;
        _season = 1;
    }

    /**
     * @dev Receive ETH, and send WESIONs.
     */
    function () external payable enoughGas onlyOnSale {
        require(msg.value >= WEI_MIN);
        require(msg.value <= WEI_MAX);

        // Set temporary variables.
        setTemporaryVariables();
        uint256 __usdAmount = wei2usd(msg.value);
        uint256 __usdRemain = __usdAmount;
        uint256 __WESIONIssued;
        uint256 __WESIONBonus;
        uint256 __usdUsed;
        uint256 __weiUsed;

        // USD => WESION
        while (gasleft() > GAS_EX && __usdRemain > 0 && _stage <= STAGE_MAX) {
            uint256 __txWESIONIssued;
            (__txWESIONIssued, __usdRemain) = ex(__usdRemain);
            __WESIONIssued = __WESIONIssued.add(__txWESIONIssued);
        }

        // Used
        __usdUsed = __usdAmount.sub(__usdRemain);
        __weiUsed = usd2wei(__usdUsed);

        // Bonus 10%
        if (msg.value >= WEI_BONUS) {
            __WESIONBonus = __WESIONIssued.div(10);
            assert(transferWESIONBonus(__WESIONBonus));
        }

        // Whitelisted
        // BUY-ONE-AND-GET-ONE-MORE-FREE
        if (_inWhitelist_ && __WESIONIssued > 0) {
            // both issued and bonus
            assert(transferWESIONWhitelisted(__WESIONIssued.add(__WESIONBonus)));

            // 35% for 15 levels
            sendWhitelistReferralRewards(__weiUsed);
        }

        // If wei remains, refund.
        if (__usdRemain > 0) {
            uint256 __weiRemain = usd2wei(__usdRemain);

            __weiUsed = msg.value.sub(__weiRemain);

            // Refund wei back
            msg.sender.transfer(__weiRemain);
        }

        // Counter
        if (__weiUsed > 0) {
            _txs = _txs.add(1);
            _weiSold = _weiSold.add(__weiUsed);
            _accountWeiPurchased[msg.sender] = _accountWeiPurchased[msg.sender].add(__weiUsed);
        }

        // Wei team
        uint256 __weiTeam;
        if (_season > SEASON_MAX)
            __weiTeam = _weiSold.sub(_weiRefRewarded).sub(_weiTopSales).sub(_weiPending).sub(_weiTeam);
        else
            __weiTeam = _weiSold.sub(_weiRefRewarded).sub(_weiTopSales).sub(_weiPending).sub(_weiTeam).div(0.01 ether).mul(0.01 ether);

        _weiTeam = _weiTeam.add(__weiTeam);
        _receiver.transfer(__weiTeam);

        // Assert finished
        assert(true);
    }

    /**
     * @dev Set temporary variables.
     */
    function setTemporaryVariables() private {
        delete _referrers_;
        delete _rewards_;

        _inWhitelist_ = WESION.inWhitelist(msg.sender);
        _pending_ = WHITELIST_REF_REWARDS_PCT_SUM;

        address __cursor = msg.sender;
        for(uint16 i = 0; i < WHITELIST_REF_REWARDS_PCT.length; i++) {
            address __refAccount = WESION.referrer(__cursor);

            if (__cursor == __refAccount)
                break;

            if (WESION.refCount(__refAccount) > i) {
                if (!_seasonHasRefAccount[_season][__refAccount]) {
                    _seasonRefAccounts[_season].push(__refAccount);
                    _seasonHasRefAccount[_season][__refAccount] = true;
                }

                _pending_ = _pending_.sub(WHITELIST_REF_REWARDS_PCT[i]);
                _rewards_.push(WHITELIST_REF_REWARDS_PCT[i]);
                _referrers_.push(__refAccount);
            }

            __cursor = __refAccount;
        }
    }

    /**
     * @dev USD => WESION
     */
    function ex(uint256 usdAmount) private returns (uint256, uint256) {
        uint256 __stageUsdCap = stageUsdCap(_stage);
        uint256 __WESIONIssued;

        // in stage
        if (_stageUsdSold[_stage].add(usdAmount) <= __stageUsdCap) {
            exCount(usdAmount);

            __WESIONIssued = usd2WESION(usdAmount);
            assert(transferWESIONIssued(__WESIONIssued, usdAmount));

            // close stage, if stage dollor cap reached
            if (__stageUsdCap == _stageUsdSold[_stage]) {
                assert(closeStage());
            }

            return (__WESIONIssued, 0);
        }

        // close stage
        uint256 __usdUsed = __stageUsdCap.sub(_stageUsdSold[_stage]);
        uint256 __usdRemain = usdAmount.sub(__usdUsed);

        exCount(__usdUsed);

        __WESIONIssued = usd2WESION(__usdUsed);
        assert(transferWESIONIssued(__WESIONIssued, __usdUsed));
        assert(closeStage());

        return (__WESIONIssued, __usdRemain);
    }

    /**
     * @dev Ex counter.
     */
    function exCount(uint256 usdAmount) private {
        uint256 __weiSold = usd2wei(usdAmount);
        uint256 __weiTopSales = usd2weiTopSales(usdAmount);

        _usdSeasonAccountPurchased[_season][msg.sender] = _usdSeasonAccountPurchased[_season][msg.sender].add(usdAmount);   // season => address => purchased, in USD

        _stageUsdSold[_stage] = _stageUsdSold[_stage].add(usdAmount);                   // stage sold, in USD
        _seasonWeiSold[_season] = _seasonWeiSold[_season].add(__weiSold);               // season sold, in wei
        _seasonWeiTopSales[_season] = _seasonWeiTopSales[_season].add(__weiTopSales);   // season Top-Sales, in wei
        _weiTopSales = _weiTopSales.add(__weiTopSales);                                 // sum Top-Sales, in wei

        // season referral account
        if (_inWhitelist_) {
            for (uint16 i = 0; i < _rewards_.length; i++) {
                _usdSeasonAccountRef[_season][_referrers_[i]] = _usdSeasonAccountRef[_season][_referrers_[i]].add(usdAmount);
            }
        }
    }

    /**
     * @dev Transfer WESION issued.
     */
    function transferWESIONIssued(uint256 amount, uint256 usdAmount) private returns (bool) {
        _WESIONTxs = _WESIONTxs.add(1);

        _WESIONIssued = _WESIONIssued.add(amount);
        _stageWESIONIssued[_stage] = _stageWESIONIssued[_stage].add(amount);
        _accountWESIONIssued[msg.sender] = _accountWESIONIssued[msg.sender].add(amount);

        assert(WESION.transfer(msg.sender, amount));
        emit WESIONIssuedTransfered(_stage, msg.sender, amount, _etherPrice, usdAmount);
        return true;
    }

    /**
     * @dev Transfer WESION bonus.
     */
    function transferWESIONBonus(uint256 amount) private returns (bool) {
        _WESIONBonusTxs = _WESIONBonusTxs.add(1);

        _WESIONBonus = _WESIONBonus.add(amount);
        _accountWESIONBonus[msg.sender] = _accountWESIONBonus[msg.sender].add(amount);

        assert(WESION.transfer(msg.sender, amount));
        emit WESIONBonusTransfered(msg.sender, amount);
        return true;
    }

    /**
     * @dev Transfer WESION whitelisted.
     */
    function transferWESIONWhitelisted(uint256 amount) private returns (bool) {
        _WESIONWhitelistTxs = _WESIONWhitelistTxs.add(1);

        _WESIONWhitelist = _WESIONWhitelist.add(amount);
        _accountWESIONWhitelisted[msg.sender] = _accountWESIONWhitelisted[msg.sender].add(amount);

        assert(WESION.transfer(msg.sender, amount));
        emit WESIONWhitelistTransfered(msg.sender, amount);
        return true;
    }

    /**
     * Close current stage.
     */
    function closeStage() private returns (bool) {
        emit StageClosed(_stage, msg.sender);
        _stage = _stage.add(1);
        _WESIONUsdPrice = stageWESIONUsdPrice(_stage);
        _topSalesRatio = topSalesRatio(_stage);

        // Close current season
        uint16 __seasonNumber = calcSeason(_stage);
        if (_season < __seasonNumber) {
            emit SeasonClosed(_season, msg.sender);
            _season = __seasonNumber;
        }

        return true;
    }

    /**
     * @dev Send whitelist referral rewards.
     */
    function sendWhitelistReferralRewards(uint256 weiAmount) private {
        uint256 __weiRemain = weiAmount;
        for (uint16 i = 0; i < _rewards_.length; i++) {
            uint256 __weiReward = weiAmount.mul(_rewards_[i]).div(100);
            address payable __receiver = address(uint160(_referrers_[i]));

            _weiRefRewarded = _weiRefRewarded.add(__weiReward);
            _accountWeiRefRewarded[__receiver] = _accountWeiRefRewarded[__receiver].add(__weiReward);
            __weiRemain = __weiRemain.sub(__weiReward);

            __receiver.transfer(__weiReward);
        }

        if (_pending_ > 0)
            _weiPending = _weiPending.add(weiAmount.mul(_pending_).div(100));
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"state","type":"bool"}],"name":"setPaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"status","outputs":[{"name":"auditEtherPrice","type":"uint256"},{"name":"stage","type":"uint16"},{"name":"season","type":"uint16"},{"name":"WESIONUsdPrice","type":"uint256"},{"name":"currentTopSalesRatio","type":"uint256"},{"name":"txs","type":"uint256"},{"name":"WESIONTxs","type":"uint256"},{"name":"WESIONBonusTxs","type":"uint256"},{"name":"WESIONWhitelistTxs","type":"uint256"},{"name":"WESIONIssued","type":"uint256"},{"name":"WESIONBonus","type":"uint256"},{"name":"WESIONWhitelist","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"etherPriceAuditor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"state","type":"bool"}],"name":"setEtherPriceAuditor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"setEtherPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"transferPending","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"stageIndex","type":"uint16"}],"name":"stageStatus","outputs":[{"name":"WESIONUsdPrice","type":"uint256"},{"name":"WESIONCap","type":"uint256"},{"name":"WESIONOnSale","type":"uint256"},{"name":"WESIONSold","type":"uint256"},{"name":"usdCap","type":"uint256"},{"name":"usdOnSale","type":"uint256"},{"name":"usdSold","type":"uint256"},{"name":"weiTopSalesRatio","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newReceiver","type":"address"}],"name":"changeReceiver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"}],"name":"transferTeam","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sum","outputs":[{"name":"weiSold","type":"uint256"},{"name":"weiReferralRewarded","type":"uint256"},{"name":"weiTopSales","type":"uint256"},{"name":"weiTeam","type":"uint256"},{"name":"weiPending","type":"uint256"},{"name":"weiPendingTransfered","type":"uint256"},{"name":"weiPendingRemain","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"usdAmount","type":"uint256"},{"name":"stageIndex","type":"uint16"}],"name":"usd2WESIONByStage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"seasonNumber","type":"uint16"},{"name":"account","type":"address"}],"name":"usdSeasonAccountRef","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"seasonNumber","type":"uint16"},{"name":"account","type":"address"}],"name":"usdSeasonAccountPurchased","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"WESION","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"seasonNumber","type":"uint16"},{"name":"to","type":"address"}],"name":"transferTopSales","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenAddr","type":"address"},{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"seasonNumber","type":"uint16"}],"name":"seasonTopSalesRewards","outputs":[{"name":"weiSold","type":"uint256"},{"name":"weiTopSales","type":"uint256"},{"name":"weiTopSalesTransfered","type":"uint256"},{"name":"weiTopSalesRemain","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"timestamp","type":"uint32"}],"name":"setStartTimestamp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"startTimestamp","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"accountQuery","outputs":[{"name":"WESIONIssued","type":"uint256"},{"name":"WESIONBonus","type":"uint256"},{"name":"WESIONWhitelisted","type":"uint256"},{"name":"weiPurchased","type":"uint256"},{"name":"weiReferralRewarded","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"seasonNumber","type":"uint16"}],"name":"seasonRefAccounts","outputs":[{"name":"accounts","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"value","type":"uint256"},{"indexed":true,"name":"account","type":"address"}],"name":"AuditEtherPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"},{"indexed":false,"name":"state","type":"bool"}],"name":"AuditEtherPriceAuditorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"WESIONBonusTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"WESIONWhitelistTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"stageIndex","type":"uint16"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"WESIONAmount","type":"uint256"},{"indexed":false,"name":"auditEtherPrice","type":"uint256"},{"indexed":false,"name":"weiUsed","type":"uint256"}],"name":"WESIONIssuedTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_stageNumber","type":"uint256"},{"indexed":true,"name":"account","type":"address"}],"name":"StageClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_seasonNumber","type":"uint16"},{"indexed":true,"name":"account","type":"address"}],"name":"SeasonClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"seasonNumber","type":"uint16"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"SeasonTopSalesWeiTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TeamWeiTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"PendingWeiTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousReceiver","type":"address"},{"indexed":true,"name":"newReceiver","type":"address"}],"name":"ReceiverChanged","type":"event"}]

6080604052732c1564a74f07757765642acef62a583b38d5a213600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506023600460006101000a81548161ffff021916908361ffff160217905550604051806101e00160405280600660ff168152602001600660ff168152602001600560ff168152602001600460ff168152602001600360ff168152602001600260ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff16815250600590600f62000129929190620003fe565b5067016345785d8a0000600660006101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff16021790555068056bc75e2d63100000600660096101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550678ac7230489e80000600660126101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550622dc6c06006601b6101000a81548162ffffff021916908362ffffff1602179055506216e360600760006101000a81548162ffffff021916908362ffffff1602179055506103e8600855600a6009556305f5e100600a55620f4240600b5564038407b700600c55600854600d5561ea60600e60006101000a81548161ffff021916908361ffff1602179055506064600e60026101000a81548161ffff021916908361ffff160217905550610258600e60046101000a81548161ffff021916908361ffff16021790555062e4e1c0601c556302faf080601d55601c54601e55600460009054906101000a900461ffff1661ffff16602055348015620002c757600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160146101000a81548160ff0219169083151502179055506001602360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600e60066101000a81548161ffff021916908361ffff1602179055506001600e60086101000a81548161ffff021916908361ffff160217905550620004d4565b82600f80016010900481019282156200048d5791602002820160005b838211156200045b57835183826101000a81548161ffff021916908360ff16021790555092602001926002016020816001010492830192600103026200041a565b80156200048b5782816101000a81549061ffff02191690556002016020816001010492830192600103026200045b565b505b5090506200049c9190620004a0565b5090565b620004d191905b80821115620004cd57600081816101000a81549061ffff021916905550600101620004a7565b5090565b90565b61417380620004e46000396000f3fe6080604052600436106101665760003560e01c80638da5cb5b116100d1578063cea9d26f1161008a578063e6fd48bc11610064578063e6fd48bc14610fd9578063f2e2934114611010578063f2fde38b14611091578063f5f56b7a146110e257610166565b8063cea9d26f14610eb5578063d4eeb6ad14610f30578063de8f246c14610f9857610166565b80638da5cb5b14610c65578063aab79a6814610cbc578063ac5cf93414610d19578063b7352bee14610d8c578063b92693a114610dff578063c225135d14610e5657610166565b806348d3297c1161012357806348d3297c14610a60578063522f681514610ae4578063547e3f0614610b3f5780635c975abb14610b9057806363b26e7614610bbf578063853255cc14610c1057610166565b806316c38b3c14610849578063200d2ed214610886578063223e8eff1461090e57806322c8c2cc1461097757806327187991146109d4578063294b2ed014610a0f575b6006601b9054906101000a900462ffffff1662ffffff165a1161018857600080fd5b6000600260149054906101000a900463ffffffff1663ffffffff161180156101c75750600260149054906101000a900463ffffffff1663ffffffff1642115b61021c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806141216027913960400191505060405180910390fd5b600060035411610277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806140f7602a913960400191505060405180910390fd5b61027f611176565b156102f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f574553494f4e205075626c69632d53616c65206973207061757365642e00000081525060200191505060405180910390fd5b600e60009054906101000a900461ffff1661ffff16600e60069054906101000a900461ffff1661ffff161115610390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f574553494f4e205075626c69632d53616c6520436c6f7365642e00000000000081525060200191505060405180910390fd5b600660009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff163410156103bf57600080fd5b600660099054906101000a900468ffffffffffffffffff1668ffffffffffffffffff163411156103ee57600080fd5b6103f661118d565b600061040134611793565b905060008190506000806000805b600760009054906101000a900462ffffff1662ffffff165a1180156104345750600085115b80156104685750600e60009054906101000a900461ffff1661ffff16600e60069054906101000a900461ffff1661ffff1611155b1561049b576000610478866117cb565b8097508192505050610493818661194390919063ffffffff16565b94505061040f565b6104ae858761195d90919063ffffffff16565b91506104b982611974565b9050600660129054906101000a900468ffffffffffffffffff1668ffffffffffffffffff16341061050a576104f8600a856119ac90919063ffffffff16565b9250610503836119ee565b61050957fe5b5b601f60009054906101000a900460ff1680156105265750600084115b1561055657610546610541848661194390919063ffffffff16565b611bfd565b61054c57fe5b61055581611e0c565b5b60008511156105ca57600061056a86611974565b905061057f813461195d90919063ffffffff16565b91503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156105c7573d6000803e3d6000fd5b50505b60008111156106a0576105e96001600f5461194390919063ffffffff16565b600f819055506106048160165461194390919063ffffffff16565b60168190555061065c81602c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b602c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600e60029054906101000a900461ffff1661ffff16600e60089054906101000a900461ffff1661ffff16111561072c57610725601954610717601a546107096018546106fb60175460165461195d90919063ffffffff16565b61195d90919063ffffffff16565b61195d90919063ffffffff16565b61195d90919063ffffffff16565b90506107b4565b6107b1662386f26fc100006107a3662386f26fc10000610795601954610787601a5461077960185461076b60175460165461195d90919063ffffffff16565b61195d90919063ffffffff16565b61195d90919063ffffffff16565b61195d90919063ffffffff16565b6119ac90919063ffffffff16565b61203890919063ffffffff16565b90505b6107c98160195461194390919063ffffffff16565b601981905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610837573d6000803e3d6000fd5b50600161084057fe5b50505050505050005b34801561085557600080fd5b506108846004803603602081101561086c57600080fd5b8101908080351515906020019092919050505061206c565b005b34801561089257600080fd5b5061089b612208565b604051808d81526020018c61ffff1661ffff1681526020018b61ffff1661ffff1681526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019c5050505050505050505050505060405180910390f35b34801561091a57600080fd5b5061095d6004803603602081101561093157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122dc565b604051808215151515815260200191505060405180910390f35b34801561098357600080fd5b506109d26004803603604081101561099a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612332565b005b3480156109e057600080fd5b50610a0d600480360360208110156109f757600080fd5b8101908080359060200190929190505050612438565b005b348015610a1b57600080fd5b50610a5e60048036036020811015610a3257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124e6565b005b348015610a6c57600080fd5b50610a9d60048036036020811015610a8357600080fd5b81019080803561ffff169060200190929190505050612639565b604051808981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b348015610af057600080fd5b50610b3d60048036036040811015610b0757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061273c565b005b348015610b4b57600080fd5b50610b8e60048036036020811015610b6257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612844565b005b348015610b9c57600080fd5b50610ba5611176565b604051808215151515815260200191505060405180910390f35b348015610bcb57600080fd5b50610c0e60048036036020811015610be257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061299d565b005b348015610c1c57600080fd5b50610c25612b3b565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b348015610c7157600080fd5b50610c7a612b77565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cc857600080fd5b50610d0360048036036040811015610cdf57600080fd5b8101908080359060200190929190803561ffff169060200190929190505050612ba0565b6040518082815260200191505060405180910390f35b348015610d2557600080fd5b50610d7660048036036040811015610d3c57600080fd5b81019080803561ffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bda565b6040518082815260200191505060405180910390f35b348015610d9857600080fd5b50610de960048036036040811015610daf57600080fd5b81019080803561ffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c3d565b6040518082815260200191505060405180910390f35b348015610e0b57600080fd5b50610e14612ca0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e6257600080fd5b50610eb360048036036040811015610e7957600080fd5b81019080803561ffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cc6565b005b348015610ec157600080fd5b50610f2e60048036036060811015610ed857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e5d565b005b348015610f3c57600080fd5b50610f6d60048036036020811015610f5357600080fd5b81019080803561ffff16906020019092919050505061308d565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b348015610fa457600080fd5b50610fd760048036036020811015610fbb57600080fd5b81019080803563ffffffff1690602001909291905050506130ff565b005b348015610fe557600080fd5b50610fee61317c565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b34801561101c57600080fd5b5061105f6004803603602081101561103357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613196565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34801561109d57600080fd5b506110e0600480360360208110156110b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132f1565b005b3480156110ee57600080fd5b5061111f6004803603602081101561110557600080fd5b81019080803561ffff169060200190929190505050613448565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015611162578082015181840152602081019050611147565b505050509050019250505060405180910390f35b6000600160149054906101000a900460ff16905090565b6022600061119b9190614088565b602160006111a991906140a9565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2aafa21336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561124857600080fd5b505afa15801561125c573d6000803e3d6000fd5b505050506040513d602081101561127257600080fd5b8101908080519060200190929190505050601f60006101000a81548160ff021916908315150217905550600460009054906101000a900461ffff1661ffff16602081905550600033905060008090505b600f8161ffff16101561178f576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632cf003c2846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561137057600080fd5b505afa158015611384573d6000803e3d6000fd5b505050506040513d602081101561139a57600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113e7575061178f565b8161ffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ec8f95fc836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561148b57600080fd5b505afa15801561149f573d6000803e3d6000fd5b505050506040513d60208110156114b557600080fd5b8101908080519060200190929190505050111561177e57602f6000600e60089054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661165757602e6000600e60089054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506001602f6000600e60089054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61169a60058361ffff16600f811061166b57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1660205461195d90919063ffffffff16565b602081905550602160058361ffff16600f81106116b357fe5b601091828204019190066002029054906101000a900461ffff16908060018154018082558091505090600182039060005260206000209060109182820401919006600202909192909190916101000a81548161ffff021916908361ffff1602179055505060228190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b8092505080806001019150506112c2565b5050565b60006117c4670de0b6b3a76400006117b66003548561203890919063ffffffff16565b6119ac90919063ffffffff16565b9050919050565b60008060006117e9600e60069054906101000a900461ffff166134f1565b905060008161182c8660246000600e60069054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000205461194390919063ffffffff16565b116118a85761183a85613542565b61184385613942565b905061184f8186613975565b61185557fe5b60246000600e60069054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000205482141561189757611890613c24565b61189657fe5b5b80600080905093509350505061193e565b60006118e860246000600e60069054906101000a900461ffff1661ffff1661ffff168152602001908152602001600020548461195d90919063ffffffff16565b905060006118ff828861195d90919063ffffffff16565b905061190a82613542565b61191382613942565b925061191f8383613975565b61192557fe5b61192d613c24565b61193357fe5b828195509550505050505b915091565b600081830190508281101561195457fe5b80905092915050565b60008282111561196957fe5b818303905092915050565b60006119a5600354611997670de0b6b3a76400008561203890919063ffffffff16565b6119ac90919063ffffffff16565b9050919050565b60008082116119b757fe5b60008284816119c257fe5b0490508284816119ce57fe5b068184020184146119db57fe5b8284816119e457fe5b0491505092915050565b6000611a06600160115461194390919063ffffffff16565b601181905550611a218260145461194390919063ffffffff16565b601481905550611a7982602a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b602a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611b6557600080fd5b505af1158015611b79573d6000803e3d6000fd5b505050506040513d6020811015611b8f57600080fd5b8101908080519060200190929190505050611ba657fe5b3373ffffffffffffffffffffffffffffffffffffffff167f8cef011d049c0be8d14f16155c3f72d75dac8e53b3ef9f891271bf21e4f2ad59836040518082815260200191505060405180910390a260019050919050565b6000611c15600160125461194390919063ffffffff16565b601281905550611c308260155461194390919063ffffffff16565b601581905550611c8882602b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b602b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611d7457600080fd5b505af1158015611d88573d6000803e3d6000fd5b505050506040513d6020811015611d9e57600080fd5b8101908080519060200190929190505050611db557fe5b3373ffffffffffffffffffffffffffffffffffffffff167f9ad543bbf8e55db3c0825f34dfd2be0bb9c9fd5ad3dfb31fa72fed925d7706a2836040518082815260200191505060405180910390a260019050919050565b600081905060008090505b6021805490508161ffff161015611fe5576000611e886064611e7a60218561ffff1681548110611e4357fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff168761203890919063ffffffff16565b6119ac90919063ffffffff16565b9050600060228361ffff1681548110611e9d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611edf8260175461194390919063ffffffff16565b601781905550611f3782602d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b602d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f8d828561195d90919063ffffffff16565b93508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611fd5573d6000803e3d6000fd5b5050508080600101915050611e17565b50600060205411156120345761202d61201c606461200e6020548661203890919063ffffffff16565b6119ac90919063ffffffff16565b601a5461194390919063ffffffff16565b601a819055505b5050565b60008083141561204b5760009050612066565b81830290508183828161205a57fe5b041461206257fe5b8090505b92915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120c557600080fd5b600160149054906101000a900460ff1680156120df575080155b15612167576000600160146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1612205565b600160149054906101000a900460ff161580156121815750805b156122045760018060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b5b50565b6000806000806000806000806000806000806003549b50600e60009054906101000a900461ffff1661ffff16600e60069054906101000a900461ffff1661ffff16111561227a57600e60009054906101000a900461ffff169a50600e60029054906101000a900461ffff1699506122a1565b600e60069054906101000a900461ffff169a50600e60089054906101000a900461ffff1699505b600d549850601e549750600f549650601054955060115494506012549350601354925060145491506015549050909192939495969798999a9b565b6000602360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461238b57600080fd5b80602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f7309a1bee0ae3b528b2e9f11ab2abd82b54426646b40c5bef678f09554bd7c8f82604051808215151515815260200191505060405180910390a25050565b602360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661248e57600080fd5b806003819055503373ffffffffffffffffffffffffffffffffffffffff167f4c93251017d1829354b31aa6cb37ab6ec1b2af6a073553f6073a7a3420cf7393826040518082815260200191505060405180910390a250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461253f57600080fd5b6000612549613dd3565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561258557600080fd5b61259a81601b5461194390919063ffffffff16565b601b819055508173ffffffffffffffffffffffffffffffffffffffff167ffcd200d7cba84a55eb61ba9209300062477f6f08297653f398fa5489b65a1704826040518082815260200191505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612634573d6000803e3d6000fd5b505050565b600080600080600080600080600e60009054906101000a900461ffff1661ffff168961ffff16111561269e5760008060008060008060008087975086965085955084945083935082925081915080905097509750975097509750975097509750612731565b6126a789613df1565b9750602560008a61ffff1661ffff1681526020019081526020016000205494506126d089613e27565b96506126e5858861195d90919063ffffffff16565b9550602460008a61ffff1661ffff16815260200190815260200160002054915061270e896134f1565b9350612723828561195d90919063ffffffff16565b925061272e89613e42565b90505b919395975091939597565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461279557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127cf57600080fd5b60003073ffffffffffffffffffffffffffffffffffffffff16319050818110156127f857600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561283e573d6000803e3d6000fd5b50505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461289d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128d757600080fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fd36aafedb017e43b79d3cf6aa1987d3fbb9fff33e1738c71dbf6b2abaadbded060405160405180910390a35050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129f657600080fd5b6000612a4b601954612a3d601a54612a2f601854612a2160175460165461195d90919063ffffffff16565b61195d90919063ffffffff16565b61195d90919063ffffffff16565b61195d90919063ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a8757600080fd5b612a9c8160195461194390919063ffffffff16565b6019819055508173ffffffffffffffffffffffffffffffffffffffff167fe4de4c8dc6ab2404c805abf5db58633d76fc08b6c8b2c0a34d3a47bfb73663bf826040518082815260200191505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612b36573d6000803e3d6000fd5b505050565b60008060008060008060006016549650601754955060185494506019549350601a549250601b549150612b6c613dd3565b905090919293949596565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612bd2612bae83613df1565b612bc4620f42408661203890919063ffffffff16565b6119ac90919063ffffffff16565b905092915050565b6000603160008461ffff1661ffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000603060008461ffff1661ffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d1f57600080fd5b6000612d2a83613e9e565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d6657600080fd5b612d9481602860008661ffff1661ffff1681526020019081526020016000205461194390919063ffffffff16565b602860008561ffff1661ffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f69ccd39c099e91512b4f9c8d1664c05f38430681d4d594a1deec4ace4e7a6e0d8483604051808361ffff1661ffff1681526020018281526020019250505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612e57573d6000803e3d6000fd5b50505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612eb657600080fd5b6000839050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ef557600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612f7457600080fd5b505afa158015612f88573d6000803e3d6000fd5b505050506040513d6020811015612f9e57600080fd5b8101908080519060200190929190505050905082811015612fbe57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561304557600080fd5b505af1158015613059573d6000803e3d6000fd5b505050506040513d602081101561306f57600080fd5b810190808051906020019092919050505061308657fe5b5050505050565b600080600080602660008661ffff1661ffff168152602001908152602001600020549350602760008661ffff1661ffff168152602001908152602001600020549250602860008661ffff1661ffff1681526020019081526020016000205491506130f685613e9e565b90509193509193565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461315857600080fd5b80600260146101000a81548163ffffffff021916908363ffffffff16021790555050565b6000600260149054906101000a900463ffffffff16905090565b6000806000806000602960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549450602a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549350602b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250602c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150602d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905091939590929450565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461334a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561338457600080fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060602e60008361ffff1661ffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156134e557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161349b575b50505050509050919050565b6000806135216135108461ffff16600b5461203890919063ffffffff16565b600a5461194390919063ffffffff16565b9050600c5481111561353857600c5491505061353d565b809150505b919050565b600061354d82611974565b9050600061355a83613ef0565b90506135d78360306000600e60089054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b60306000600e60089054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136818360246000600e60069054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000205461194390919063ffffffff16565b60246000600e60069054906101000a900461ffff1661ffff1661ffff168152602001908152602001600020819055506136ee8260266000600e60089054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000205461194390919063ffffffff16565b60266000600e60089054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000208190555061375b8160276000600e60089054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000205461194390919063ffffffff16565b60276000600e60089054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000208190555061379f8160185461194390919063ffffffff16565b601881905550601f60009054906101000a900460ff161561393d5760008090505b6021805490508161ffff16101561393b576138878460316000600e60089054906101000a900461ffff1661ffff1661ffff168152602001908152602001600020600060228561ffff168154811061381357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b60316000600e60089054906101000a900461ffff1661ffff1661ffff168152602001908152602001600020600060228461ffff16815481106138c557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806001019150506137c0565b505b505050565b600061396e600d54613960620f42408561203890919063ffffffff16565b6119ac90919063ffffffff16565b9050919050565b600061398d600160105461194390919063ffffffff16565b6010819055506139a88360135461194390919063ffffffff16565b6013819055506139ec8360256000600e60069054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000205461194390919063ffffffff16565b60256000600e60069054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002081905550613a6d83602960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b602960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613b5957600080fd5b505af1158015613b6d573d6000803e3d6000fd5b505050506040513d6020811015613b8357600080fd5b8101908080519060200190929190505050613b9a57fe5b3373ffffffffffffffffffffffffffffffffffffffff167f6157a4b729216e44c36dedcad906c31c6808c4c80ea68ecddf83aa5c0066fa0b600e60069054906101000a900461ffff168560035486604051808561ffff1661ffff16815260200184815260200183815260200182815260200194505050505060405180910390a26001905092915050565b60003373ffffffffffffffffffffffffffffffffffffffff167feb233b5b7ba017d2651d779b7619d1a70758bcd13049019e0dd121077a1e1a2f600e60069054906101000a900461ffff16604051808261ffff16815260200191505060405180910390a2613cb06001600e60069054906101000a900461ffff1661ffff16613f2c90919063ffffffff16565b600e60066101000a81548161ffff021916908361ffff160217905550613ce5600e60069054906101000a900461ffff16613df1565b600d81905550613d04600e60069054906101000a900461ffff16613e42565b601e819055506000613d25600e60069054906101000a900461ffff16613f4e565b90508061ffff16600e60089054906101000a900461ffff1661ffff161015613dcb573373ffffffffffffffffffffffffffffffffffffffff167f7d2797fdf1b9f35ccf52e7b904a608332c1db1d8c7f2ff7f28ea7f2d6f87996c600e60089054906101000a900461ffff16604051808261ffff1661ffff16815260200191505060405180910390a280600e60086101000a81548161ffff021916908361ffff1602179055505b600191505090565b6000613dec601b54601a5461195d90919063ffffffff16565b905090565b6000613e20613e0f8361ffff1660095461203890919063ffffffff16565b60085461194390919063ffffffff16565b9050919050565b6000613e3b613e35836134f1565b83612ba0565b9050919050565b6000613e97613e86600e60009054906101000a900461ffff1661ffff16613e788561ffff16601d5461203890919063ffffffff16565b6119ac90919063ffffffff16565b601c5461194390919063ffffffff16565b9050919050565b6000613ee9602860008461ffff1661ffff16815260200190815260200160002054602760008561ffff1661ffff1681526020019081526020016000205461195d90919063ffffffff16565b9050919050565b6000613f25613f206305f5e100613f12601e548661203890919063ffffffff16565b6119ac90919063ffffffff16565b611974565b9050919050565b600081830190508261ffff168161ffff161015613f4557fe5b80905092915050565b6000808261ffff161115613fe3576000613f85600e60049054906101000a900461ffff168461ffff16613fed90919063ffffffff16565b90506000613fb0600e60049054906101000a900461ffff168561ffff1661405b90919063ffffffff16565b61ffff161115613fda57613fd260018261ffff16613f2c90919063ffffffff16565b915050613fe8565b80915050613fe8565b600190505b919050565b6000808261ffff1611613ffc57fe5b60008261ffff168461ffff168161400f57fe5b0461ffff1690508261ffff168461ffff168161402757fe5b0661ffff16818461ffff1602018461ffff161461404057fe5b8261ffff168461ffff168161405157fe5b0491505092915050565b6000808261ffff16141561406e57600080fd5b8161ffff168361ffff168161407f57fe5b06905092915050565b50805460008255906000526020600020908101906140a691906140d1565b50565b50805460008255600f0160109004906000526020600020908101906140ce91906140d1565b50565b6140f391905b808211156140ef5760008160009055506001016140d7565b5090565b9056fe417564697420455448207072696365206d7573742062652067726561746572207468616e207a65726f2e574553494f4e205075626c69632d53616c6520686173206e6f742073746172746564207965742ea165627a7a72305820fa6d6185eea275883ca43434abea818b8eeba930611110a8c8afa515489f8fde0029

Deployed Bytecode

0x6080604052600436106101665760003560e01c80638da5cb5b116100d1578063cea9d26f1161008a578063e6fd48bc11610064578063e6fd48bc14610fd9578063f2e2934114611010578063f2fde38b14611091578063f5f56b7a146110e257610166565b8063cea9d26f14610eb5578063d4eeb6ad14610f30578063de8f246c14610f9857610166565b80638da5cb5b14610c65578063aab79a6814610cbc578063ac5cf93414610d19578063b7352bee14610d8c578063b92693a114610dff578063c225135d14610e5657610166565b806348d3297c1161012357806348d3297c14610a60578063522f681514610ae4578063547e3f0614610b3f5780635c975abb14610b9057806363b26e7614610bbf578063853255cc14610c1057610166565b806316c38b3c14610849578063200d2ed214610886578063223e8eff1461090e57806322c8c2cc1461097757806327187991146109d4578063294b2ed014610a0f575b6006601b9054906101000a900462ffffff1662ffffff165a1161018857600080fd5b6000600260149054906101000a900463ffffffff1663ffffffff161180156101c75750600260149054906101000a900463ffffffff1663ffffffff1642115b61021c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806141216027913960400191505060405180910390fd5b600060035411610277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806140f7602a913960400191505060405180910390fd5b61027f611176565b156102f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f574553494f4e205075626c69632d53616c65206973207061757365642e00000081525060200191505060405180910390fd5b600e60009054906101000a900461ffff1661ffff16600e60069054906101000a900461ffff1661ffff161115610390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f574553494f4e205075626c69632d53616c6520436c6f7365642e00000000000081525060200191505060405180910390fd5b600660009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff163410156103bf57600080fd5b600660099054906101000a900468ffffffffffffffffff1668ffffffffffffffffff163411156103ee57600080fd5b6103f661118d565b600061040134611793565b905060008190506000806000805b600760009054906101000a900462ffffff1662ffffff165a1180156104345750600085115b80156104685750600e60009054906101000a900461ffff1661ffff16600e60069054906101000a900461ffff1661ffff1611155b1561049b576000610478866117cb565b8097508192505050610493818661194390919063ffffffff16565b94505061040f565b6104ae858761195d90919063ffffffff16565b91506104b982611974565b9050600660129054906101000a900468ffffffffffffffffff1668ffffffffffffffffff16341061050a576104f8600a856119ac90919063ffffffff16565b9250610503836119ee565b61050957fe5b5b601f60009054906101000a900460ff1680156105265750600084115b1561055657610546610541848661194390919063ffffffff16565b611bfd565b61054c57fe5b61055581611e0c565b5b60008511156105ca57600061056a86611974565b905061057f813461195d90919063ffffffff16565b91503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156105c7573d6000803e3d6000fd5b50505b60008111156106a0576105e96001600f5461194390919063ffffffff16565b600f819055506106048160165461194390919063ffffffff16565b60168190555061065c81602c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b602c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600e60029054906101000a900461ffff1661ffff16600e60089054906101000a900461ffff1661ffff16111561072c57610725601954610717601a546107096018546106fb60175460165461195d90919063ffffffff16565b61195d90919063ffffffff16565b61195d90919063ffffffff16565b61195d90919063ffffffff16565b90506107b4565b6107b1662386f26fc100006107a3662386f26fc10000610795601954610787601a5461077960185461076b60175460165461195d90919063ffffffff16565b61195d90919063ffffffff16565b61195d90919063ffffffff16565b61195d90919063ffffffff16565b6119ac90919063ffffffff16565b61203890919063ffffffff16565b90505b6107c98160195461194390919063ffffffff16565b601981905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610837573d6000803e3d6000fd5b50600161084057fe5b50505050505050005b34801561085557600080fd5b506108846004803603602081101561086c57600080fd5b8101908080351515906020019092919050505061206c565b005b34801561089257600080fd5b5061089b612208565b604051808d81526020018c61ffff1661ffff1681526020018b61ffff1661ffff1681526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019c5050505050505050505050505060405180910390f35b34801561091a57600080fd5b5061095d6004803603602081101561093157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122dc565b604051808215151515815260200191505060405180910390f35b34801561098357600080fd5b506109d26004803603604081101561099a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612332565b005b3480156109e057600080fd5b50610a0d600480360360208110156109f757600080fd5b8101908080359060200190929190505050612438565b005b348015610a1b57600080fd5b50610a5e60048036036020811015610a3257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124e6565b005b348015610a6c57600080fd5b50610a9d60048036036020811015610a8357600080fd5b81019080803561ffff169060200190929190505050612639565b604051808981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b348015610af057600080fd5b50610b3d60048036036040811015610b0757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061273c565b005b348015610b4b57600080fd5b50610b8e60048036036020811015610b6257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612844565b005b348015610b9c57600080fd5b50610ba5611176565b604051808215151515815260200191505060405180910390f35b348015610bcb57600080fd5b50610c0e60048036036020811015610be257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061299d565b005b348015610c1c57600080fd5b50610c25612b3b565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b348015610c7157600080fd5b50610c7a612b77565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cc857600080fd5b50610d0360048036036040811015610cdf57600080fd5b8101908080359060200190929190803561ffff169060200190929190505050612ba0565b6040518082815260200191505060405180910390f35b348015610d2557600080fd5b50610d7660048036036040811015610d3c57600080fd5b81019080803561ffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bda565b6040518082815260200191505060405180910390f35b348015610d9857600080fd5b50610de960048036036040811015610daf57600080fd5b81019080803561ffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c3d565b6040518082815260200191505060405180910390f35b348015610e0b57600080fd5b50610e14612ca0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e6257600080fd5b50610eb360048036036040811015610e7957600080fd5b81019080803561ffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cc6565b005b348015610ec157600080fd5b50610f2e60048036036060811015610ed857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e5d565b005b348015610f3c57600080fd5b50610f6d60048036036020811015610f5357600080fd5b81019080803561ffff16906020019092919050505061308d565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b348015610fa457600080fd5b50610fd760048036036020811015610fbb57600080fd5b81019080803563ffffffff1690602001909291905050506130ff565b005b348015610fe557600080fd5b50610fee61317c565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b34801561101c57600080fd5b5061105f6004803603602081101561103357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613196565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34801561109d57600080fd5b506110e0600480360360208110156110b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132f1565b005b3480156110ee57600080fd5b5061111f6004803603602081101561110557600080fd5b81019080803561ffff169060200190929190505050613448565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015611162578082015181840152602081019050611147565b505050509050019250505060405180910390f35b6000600160149054906101000a900460ff16905090565b6022600061119b9190614088565b602160006111a991906140a9565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e2aafa21336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561124857600080fd5b505afa15801561125c573d6000803e3d6000fd5b505050506040513d602081101561127257600080fd5b8101908080519060200190929190505050601f60006101000a81548160ff021916908315150217905550600460009054906101000a900461ffff1661ffff16602081905550600033905060008090505b600f8161ffff16101561178f576000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632cf003c2846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561137057600080fd5b505afa158015611384573d6000803e3d6000fd5b505050506040513d602081101561139a57600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113e7575061178f565b8161ffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ec8f95fc836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561148b57600080fd5b505afa15801561149f573d6000803e3d6000fd5b505050506040513d60208110156114b557600080fd5b8101908080519060200190929190505050111561177e57602f6000600e60089054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661165757602e6000600e60089054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506001602f6000600e60089054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b61169a60058361ffff16600f811061166b57fe5b601091828204019190066002029054906101000a900461ffff1661ffff1660205461195d90919063ffffffff16565b602081905550602160058361ffff16600f81106116b357fe5b601091828204019190066002029054906101000a900461ffff16908060018154018082558091505090600182039060005260206000209060109182820401919006600202909192909190916101000a81548161ffff021916908361ffff1602179055505060228190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b8092505080806001019150506112c2565b5050565b60006117c4670de0b6b3a76400006117b66003548561203890919063ffffffff16565b6119ac90919063ffffffff16565b9050919050565b60008060006117e9600e60069054906101000a900461ffff166134f1565b905060008161182c8660246000600e60069054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000205461194390919063ffffffff16565b116118a85761183a85613542565b61184385613942565b905061184f8186613975565b61185557fe5b60246000600e60069054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000205482141561189757611890613c24565b61189657fe5b5b80600080905093509350505061193e565b60006118e860246000600e60069054906101000a900461ffff1661ffff1661ffff168152602001908152602001600020548461195d90919063ffffffff16565b905060006118ff828861195d90919063ffffffff16565b905061190a82613542565b61191382613942565b925061191f8383613975565b61192557fe5b61192d613c24565b61193357fe5b828195509550505050505b915091565b600081830190508281101561195457fe5b80905092915050565b60008282111561196957fe5b818303905092915050565b60006119a5600354611997670de0b6b3a76400008561203890919063ffffffff16565b6119ac90919063ffffffff16565b9050919050565b60008082116119b757fe5b60008284816119c257fe5b0490508284816119ce57fe5b068184020184146119db57fe5b8284816119e457fe5b0491505092915050565b6000611a06600160115461194390919063ffffffff16565b601181905550611a218260145461194390919063ffffffff16565b601481905550611a7982602a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b602a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611b6557600080fd5b505af1158015611b79573d6000803e3d6000fd5b505050506040513d6020811015611b8f57600080fd5b8101908080519060200190929190505050611ba657fe5b3373ffffffffffffffffffffffffffffffffffffffff167f8cef011d049c0be8d14f16155c3f72d75dac8e53b3ef9f891271bf21e4f2ad59836040518082815260200191505060405180910390a260019050919050565b6000611c15600160125461194390919063ffffffff16565b601281905550611c308260155461194390919063ffffffff16565b601581905550611c8882602b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b602b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611d7457600080fd5b505af1158015611d88573d6000803e3d6000fd5b505050506040513d6020811015611d9e57600080fd5b8101908080519060200190929190505050611db557fe5b3373ffffffffffffffffffffffffffffffffffffffff167f9ad543bbf8e55db3c0825f34dfd2be0bb9c9fd5ad3dfb31fa72fed925d7706a2836040518082815260200191505060405180910390a260019050919050565b600081905060008090505b6021805490508161ffff161015611fe5576000611e886064611e7a60218561ffff1681548110611e4357fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff168761203890919063ffffffff16565b6119ac90919063ffffffff16565b9050600060228361ffff1681548110611e9d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611edf8260175461194390919063ffffffff16565b601781905550611f3782602d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b602d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f8d828561195d90919063ffffffff16565b93508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611fd5573d6000803e3d6000fd5b5050508080600101915050611e17565b50600060205411156120345761202d61201c606461200e6020548661203890919063ffffffff16565b6119ac90919063ffffffff16565b601a5461194390919063ffffffff16565b601a819055505b5050565b60008083141561204b5760009050612066565b81830290508183828161205a57fe5b041461206257fe5b8090505b92915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120c557600080fd5b600160149054906101000a900460ff1680156120df575080155b15612167576000600160146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1612205565b600160149054906101000a900460ff161580156121815750805b156122045760018060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b5b50565b6000806000806000806000806000806000806003549b50600e60009054906101000a900461ffff1661ffff16600e60069054906101000a900461ffff1661ffff16111561227a57600e60009054906101000a900461ffff169a50600e60029054906101000a900461ffff1699506122a1565b600e60069054906101000a900461ffff169a50600e60089054906101000a900461ffff1699505b600d549850601e549750600f549650601054955060115494506012549350601354925060145491506015549050909192939495969798999a9b565b6000602360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461238b57600080fd5b80602360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f7309a1bee0ae3b528b2e9f11ab2abd82b54426646b40c5bef678f09554bd7c8f82604051808215151515815260200191505060405180910390a25050565b602360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661248e57600080fd5b806003819055503373ffffffffffffffffffffffffffffffffffffffff167f4c93251017d1829354b31aa6cb37ab6ec1b2af6a073553f6073a7a3420cf7393826040518082815260200191505060405180910390a250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461253f57600080fd5b6000612549613dd3565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561258557600080fd5b61259a81601b5461194390919063ffffffff16565b601b819055508173ffffffffffffffffffffffffffffffffffffffff167ffcd200d7cba84a55eb61ba9209300062477f6f08297653f398fa5489b65a1704826040518082815260200191505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612634573d6000803e3d6000fd5b505050565b600080600080600080600080600e60009054906101000a900461ffff1661ffff168961ffff16111561269e5760008060008060008060008087975086965085955084945083935082925081915080905097509750975097509750975097509750612731565b6126a789613df1565b9750602560008a61ffff1661ffff1681526020019081526020016000205494506126d089613e27565b96506126e5858861195d90919063ffffffff16565b9550602460008a61ffff1661ffff16815260200190815260200160002054915061270e896134f1565b9350612723828561195d90919063ffffffff16565b925061272e89613e42565b90505b919395975091939597565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461279557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127cf57600080fd5b60003073ffffffffffffffffffffffffffffffffffffffff16319050818110156127f857600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561283e573d6000803e3d6000fd5b50505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461289d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128d757600080fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fd36aafedb017e43b79d3cf6aa1987d3fbb9fff33e1738c71dbf6b2abaadbded060405160405180910390a35050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129f657600080fd5b6000612a4b601954612a3d601a54612a2f601854612a2160175460165461195d90919063ffffffff16565b61195d90919063ffffffff16565b61195d90919063ffffffff16565b61195d90919063ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a8757600080fd5b612a9c8160195461194390919063ffffffff16565b6019819055508173ffffffffffffffffffffffffffffffffffffffff167fe4de4c8dc6ab2404c805abf5db58633d76fc08b6c8b2c0a34d3a47bfb73663bf826040518082815260200191505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612b36573d6000803e3d6000fd5b505050565b60008060008060008060006016549650601754955060185494506019549350601a549250601b549150612b6c613dd3565b905090919293949596565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612bd2612bae83613df1565b612bc4620f42408661203890919063ffffffff16565b6119ac90919063ffffffff16565b905092915050565b6000603160008461ffff1661ffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000603060008461ffff1661ffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d1f57600080fd5b6000612d2a83613e9e565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d6657600080fd5b612d9481602860008661ffff1661ffff1681526020019081526020016000205461194390919063ffffffff16565b602860008561ffff1661ffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f69ccd39c099e91512b4f9c8d1664c05f38430681d4d594a1deec4ace4e7a6e0d8483604051808361ffff1661ffff1681526020018281526020019250505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612e57573d6000803e3d6000fd5b50505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612eb657600080fd5b6000839050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ef557600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612f7457600080fd5b505afa158015612f88573d6000803e3d6000fd5b505050506040513d6020811015612f9e57600080fd5b8101908080519060200190929190505050905082811015612fbe57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561304557600080fd5b505af1158015613059573d6000803e3d6000fd5b505050506040513d602081101561306f57600080fd5b810190808051906020019092919050505061308657fe5b5050505050565b600080600080602660008661ffff1661ffff168152602001908152602001600020549350602760008661ffff1661ffff168152602001908152602001600020549250602860008661ffff1661ffff1681526020019081526020016000205491506130f685613e9e565b90509193509193565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461315857600080fd5b80600260146101000a81548163ffffffff021916908363ffffffff16021790555050565b6000600260149054906101000a900463ffffffff16905090565b6000806000806000602960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549450602a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549350602b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250602c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150602d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905091939590929450565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461334a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561338457600080fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060602e60008361ffff1661ffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156134e557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161349b575b50505050509050919050565b6000806135216135108461ffff16600b5461203890919063ffffffff16565b600a5461194390919063ffffffff16565b9050600c5481111561353857600c5491505061353d565b809150505b919050565b600061354d82611974565b9050600061355a83613ef0565b90506135d78360306000600e60089054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b60306000600e60089054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136818360246000600e60069054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000205461194390919063ffffffff16565b60246000600e60069054906101000a900461ffff1661ffff1661ffff168152602001908152602001600020819055506136ee8260266000600e60089054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000205461194390919063ffffffff16565b60266000600e60089054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000208190555061375b8160276000600e60089054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000205461194390919063ffffffff16565b60276000600e60089054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000208190555061379f8160185461194390919063ffffffff16565b601881905550601f60009054906101000a900460ff161561393d5760008090505b6021805490508161ffff16101561393b576138878460316000600e60089054906101000a900461ffff1661ffff1661ffff168152602001908152602001600020600060228561ffff168154811061381357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b60316000600e60089054906101000a900461ffff1661ffff1661ffff168152602001908152602001600020600060228461ffff16815481106138c557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806001019150506137c0565b505b505050565b600061396e600d54613960620f42408561203890919063ffffffff16565b6119ac90919063ffffffff16565b9050919050565b600061398d600160105461194390919063ffffffff16565b6010819055506139a88360135461194390919063ffffffff16565b6013819055506139ec8360256000600e60069054906101000a900461ffff1661ffff1661ffff1681526020019081526020016000205461194390919063ffffffff16565b60256000600e60069054906101000a900461ffff1661ffff1661ffff16815260200190815260200160002081905550613a6d83602960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194390919063ffffffff16565b602960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613b5957600080fd5b505af1158015613b6d573d6000803e3d6000fd5b505050506040513d6020811015613b8357600080fd5b8101908080519060200190929190505050613b9a57fe5b3373ffffffffffffffffffffffffffffffffffffffff167f6157a4b729216e44c36dedcad906c31c6808c4c80ea68ecddf83aa5c0066fa0b600e60069054906101000a900461ffff168560035486604051808561ffff1661ffff16815260200184815260200183815260200182815260200194505050505060405180910390a26001905092915050565b60003373ffffffffffffffffffffffffffffffffffffffff167feb233b5b7ba017d2651d779b7619d1a70758bcd13049019e0dd121077a1e1a2f600e60069054906101000a900461ffff16604051808261ffff16815260200191505060405180910390a2613cb06001600e60069054906101000a900461ffff1661ffff16613f2c90919063ffffffff16565b600e60066101000a81548161ffff021916908361ffff160217905550613ce5600e60069054906101000a900461ffff16613df1565b600d81905550613d04600e60069054906101000a900461ffff16613e42565b601e819055506000613d25600e60069054906101000a900461ffff16613f4e565b90508061ffff16600e60089054906101000a900461ffff1661ffff161015613dcb573373ffffffffffffffffffffffffffffffffffffffff167f7d2797fdf1b9f35ccf52e7b904a608332c1db1d8c7f2ff7f28ea7f2d6f87996c600e60089054906101000a900461ffff16604051808261ffff1661ffff16815260200191505060405180910390a280600e60086101000a81548161ffff021916908361ffff1602179055505b600191505090565b6000613dec601b54601a5461195d90919063ffffffff16565b905090565b6000613e20613e0f8361ffff1660095461203890919063ffffffff16565b60085461194390919063ffffffff16565b9050919050565b6000613e3b613e35836134f1565b83612ba0565b9050919050565b6000613e97613e86600e60009054906101000a900461ffff1661ffff16613e788561ffff16601d5461203890919063ffffffff16565b6119ac90919063ffffffff16565b601c5461194390919063ffffffff16565b9050919050565b6000613ee9602860008461ffff1661ffff16815260200190815260200160002054602760008561ffff1661ffff1681526020019081526020016000205461195d90919063ffffffff16565b9050919050565b6000613f25613f206305f5e100613f12601e548661203890919063ffffffff16565b6119ac90919063ffffffff16565b611974565b9050919050565b600081830190508261ffff168161ffff161015613f4557fe5b80905092915050565b6000808261ffff161115613fe3576000613f85600e60049054906101000a900461ffff168461ffff16613fed90919063ffffffff16565b90506000613fb0600e60049054906101000a900461ffff168561ffff1661405b90919063ffffffff16565b61ffff161115613fda57613fd260018261ffff16613f2c90919063ffffffff16565b915050613fe8565b80915050613fe8565b600190505b919050565b6000808261ffff1611613ffc57fe5b60008261ffff168461ffff168161400f57fe5b0461ffff1690508261ffff168461ffff168161402757fe5b0661ffff16818461ffff1602018461ffff161461404057fe5b8261ffff168461ffff168161405157fe5b0491505092915050565b6000808261ffff16141561406e57600080fd5b8161ffff168361ffff168161407f57fe5b06905092915050565b50805460008255906000526020600020908101906140a691906140d1565b50565b50805460008255600f0160109004906000526020600020908101906140ce91906140d1565b50565b6140f391905b808211156140ef5760008160009055506001016140d7565b5090565b9056fe417564697420455448207072696365206d7573742062652067726561746572207468616e207a65726f2e574553494f4e205075626c69632d53616c6520686173206e6f742073746172746564207965742ea165627a7a72305820fa6d6185eea275883ca43434abea818b8eeba930611110a8c8afa515489f8fde0029

Deployed Bytecode Sourcemap

7483:25538:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18945:7;;;;;;;;;;;18933:19;;:9;:19;18925:28;;;;;;19094:1;19076:15;;;;;;;;;;;:19;;;:44;;;;;19105:15;;;;;;;;;;;19099:21;;:3;:21;19076:44;19068:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19197:1;19183:11;;:15;19175:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19265:8;:6;:8::i;:::-;19264:9;19256:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19336:9;;;;;;;;;;;19326:19;;:6;;;;;;;;;;;:19;;;;19318:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24589:7;;;;;;;;;;;24576:20;;:9;:20;;24568:29;;;;;;24629:7;;;;;;;;;;;24616:20;;:9;:20;;24608:29;;;;;;24687:23;:21;:23::i;:::-;24721:19;24743:18;24751:9;24743:7;:18::i;:::-;24721:40;;24772:19;24794:11;24772:33;;24816:22;24849:21;24881:17;24909;24965:252;24984:6;;;;;;;;;;;24972:18;;:9;:18;:37;;;;;25008:1;24994:11;:15;24972:37;:60;;;;;25023:9;;;;;;;;;;;25013:19;;:6;;;;;;;;;;;:19;;;;24972:60;24965:252;;;25049:24;25122:15;25125:11;25122:2;:15::i;:::-;25088:49;;;;;;;;25169:36;25188:16;25169:14;:18;;:36;;;;:::i;:::-;25152:53;;24965:252;;;;25258:28;25274:11;25258;:15;;:28;;;;:::i;:::-;25246:40;;25309:18;25317:9;25309:7;:18::i;:::-;25297:30;;25379:9;;;;;;;;;;;25366:22;;:9;:22;25362:150;;25421:22;25440:2;25421:14;:18;;:22;;;;:::i;:::-;25405:38;;25465:34;25485:13;25465:19;:34::i;:::-;25458:42;;;;25362:150;25594:13;;;;;;;;;;;:35;;;;;25628:1;25611:14;:18;25594:35;25590:264;;;25691:60;25717:33;25736:13;25717:14;:18;;:33;;;;:::i;:::-;25691:25;:60::i;:::-;25684:68;;;;25803:39;25832:9;25803:28;:39::i;:::-;25590:264;25920:1;25906:11;:15;25902:226;;;25938:19;25960:20;25968:11;25960:7;:20::i;:::-;25938:42;;26009:26;26023:11;26009:9;:13;;:26;;;;:::i;:::-;25997:38;;26084:10;:19;;:32;26104:11;26084:32;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26084:32:0;25902:226;;26176:1;26164:9;:13;26160:210;;;26201:11;26210:1;26201:4;;:8;;:11;;;;:::i;:::-;26194:4;:18;;;;26238:23;26251:9;26238:8;;:12;;:23;;;;:::i;:::-;26227:8;:34;;;;26311:47;26348:9;26311:20;:32;26332:10;26311:32;;;;;;;;;;;;;;;;:36;;:47;;;;:::i;:::-;26276:20;:32;26297:10;26276:32;;;;;;;;;;;;;;;:82;;;;26160:210;26403:17;26445:10;;;;;;;;;;;26435:20;;:7;;;;;;;;;;;:20;;;26431:280;;;26482:78;26551:8;;26482:64;26534:11;;26482:47;26516:12;;26482:29;26495:15;;26482:8;;:12;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;:51;;:64;;;;:::i;:::-;:68;;:78;;;;:::i;:::-;26470:90;;26431:280;;;26601:110;26700:10;26601:94;26684:10;26601:78;26670:8;;26601:64;26653:11;;26601:47;26635:12;;26601:29;26614:15;;26601:8;;:12;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;:51;;:64;;;;:::i;:::-;:68;;:78;;;;:::i;:::-;:82;;:94;;;;:::i;:::-;:98;;:110;;;;:::i;:::-;26589:122;;26431:280;26735:23;26748:9;26735:8;;:12;;:23;;;;:::i;:::-;26724:8;:34;;;;26769:9;;;;;;;;;;;:18;;:29;26788:9;26769:29;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26769:29:0;26846:4;26839:12;;;;19387:1;;;;;;;7483:25538;6459:281;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6459:281:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6459:281:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;16673:1387;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16673:1387:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13289:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13289:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13289:125:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13484:194;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13484:194:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13484:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13055:164;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13055:164:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13055:164:0;;;;;;;;;;;;;;;;;:::i;:::-;;15899:319;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15899:319:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15899:319:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;20523:1197;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20523:1197:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20523:1197:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5426:241;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5426:241:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5426:241:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4531:272;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4531:272:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4531:272:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;6091:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6091:78:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16276:350;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16276:350:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16276:350:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;18104:721;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18104:721:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3797:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3797:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14527:180;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14527:180:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14527:180:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24098:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24098:166:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24098:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23835:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23835:178:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23835:178:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7623:75;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7623:75:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15232:423;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15232:423:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15232:423:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5033:339;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5033:339:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5033:339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22071:659;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22071:659:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22071:659:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12705:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12705:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12705:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;12549:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12549:96:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22784:741;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22784:741:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22784:741:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4227:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4227:248:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4227:248:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;23595:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23595:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23595:158:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;23595:158:0;;;;;;;;;;;;;;;;;6091:78;6130:4;6154:7;;;;;;;;;;;6147:14;;6091:78;:::o;26923:1002::-;26982:11;;26975:18;;;;:::i;:::-;27011:9;;27004:16;;;;:::i;:::-;27049:6;;;;;;;;;;;:18;;;27068:10;27049:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27049:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27049:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27049:30:0;;;;;;;;;;;;;;;;27033:13;;:46;;;;;;;;;;;;;;;;;;27102:29;;;;;;;;;;;27090:41;;:9;:41;;;;27144:16;27163:10;27144:29;;27188:8;27199:1;27188:12;;27184:734;27206:32;27202:1;:36;;;27184:734;;;27260:20;27283:6;;;;;;;;;;;:15;;;27299:8;27283:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27283:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27283:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27283:25:0;;;;;;;;;;;;;;;;27260:48;;27341:12;27329:24;;:8;:24;;;27325:52;;;27372:5;;;27325:52;27430:1;27398:33;;:6;;;;;;;;;;;:15;;;27414:12;27398:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27398:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27398:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27398:29:0;;;;;;;;;;;;;;;;:33;27394:473;;;27457:20;:29;27478:7;;;;;;;;;;;27457:29;;;;;;;;;;;;;;;:43;27487:12;27457:43;;;;;;;;;;;;;;;;;;;;;;;;;27452:212;;27525:18;:27;27544:7;;;;;;;;;;;27525:27;;;;;;;;;;;;;;;27558:12;27525:46;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27525:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27640:4;27594:20;:29;27615:7;;;;;;;;;;;27594:29;;;;;;;;;;;;;;;:43;27624:12;27594:43;;;;;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;27452:212;27696:43;27710:25;27736:1;27710:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27696:43;;:9;;:13;;:43;;;;:::i;:::-;27684:9;:55;;;;27758:9;27773:25;27799:1;27773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27758:44;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27758:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27821:11;27838:12;27821:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27821:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27394:473;27894:12;27883:23;;27184:734;27240:3;;;;;;;27184:734;;;;26923:1002;:::o;13980:126::-;14035:7;14062:36;14090:7;14062:23;14073:11;;14062:6;:10;;:23;;;;:::i;:::-;:27;;:36;;;;:::i;:::-;14055:43;;13980:126;;;:::o;27978:1020::-;28026:7;28035;28055:21;28079:19;28091:6;;;;;;;;;;;28079:11;:19::i;:::-;28055:43;;28109:22;28209:13;28169:36;28195:9;28169:13;:21;28183:6;;;;;;;;;;;28169:21;;;;;;;;;;;;;;;;:25;;:36;;;;:::i;:::-;:53;28165:444;;28239:18;28247:9;28239:7;:18::i;:::-;28291:21;28302:9;28291:10;:21::i;:::-;28274:38;;28334:47;28355:14;28371:9;28334:20;:47::i;:::-;28327:55;;;;28477:13;:21;28491:6;;;;;;;;;;;28477:21;;;;;;;;;;;;;;;;28460:13;:38;28456:99;;;28526:12;:10;:12::i;:::-;28519:20;;;;28456:99;28579:14;28595:1;28571:26;;;;;;;;;;;28165:444;28645:17;28665:40;28683:13;:21;28697:6;;;;;;;;;;;28683:21;;;;;;;;;;;;;;;;28665:13;:17;;:40;;;;:::i;:::-;28645:60;;28716:19;28738:24;28752:9;28738;:13;;:24;;;;:::i;:::-;28716:46;;28775:18;28783:9;28775:7;:18::i;:::-;28823:21;28834:9;28823:10;:21::i;:::-;28806:38;;28862:47;28883:14;28899:9;28862:20;:47::i;:::-;28855:55;;;;28928:12;:10;:12::i;:::-;28921:20;;;;28962:14;28978:11;28954:36;;;;;;;;27978:1020;;;;:::o;349:141::-;407:9;437:1;433;:5;429:9;;461:1;456;:6;;449:14;;;;481:1;474:8;;349:141;;;;:::o;628:123::-;686:7;718:1;713;:6;;706:14;;;;742:1;738;:5;731:12;;628:123;;;;:::o;14156:126::-;14211:7;14238:36;14262:11;;14238:19;14249:7;14238:6;:10;;:19;;;;:::i;:::-;:23;;:36;;;;:::i;:::-;14231:43;;14156:126;;;:::o;1190:187::-;1248:7;1279:1;1275;:5;1268:13;;;;1292:9;1308:1;1304;:5;;;;;;1292:17;;1344:1;1340;:5;;;;;;1336:1;1332;:5;:13;1327:1;:18;1320:26;;;;1368:1;1364;:5;;;;;;1357:12;;;1190:187;;;;:::o;30770:402::-;30832:4;30867:22;30887:1;30867:15;;:19;;:22;;;;:::i;:::-;30849:15;:40;;;;30917:24;30934:6;30917:12;;:16;;:24;;;;:::i;:::-;30902:12;:39;;;;30986:43;31022:6;30986:19;:31;31006:10;30986:31;;;;;;;;;;;;;;;;:35;;:43;;;;:::i;:::-;30952:19;:31;30972:10;30952:31;;;;;;;;;;;;;;;:77;;;;31049:6;;;;;;;;;;;:15;;;31065:10;31077:6;31049:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31049:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31049:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31049:35:0;;;;;;;;;;;;;;;;31042:43;;;;31123:10;31101:41;;;31135:6;31101:41;;;;;;;;;;;;;;;;;;31160:4;31153:11;;30770:402;;;:::o;31240:440::-;31308:4;31347:26;31371:1;31347:19;;:23;;:26;;;;:::i;:::-;31325:19;:48;;;;31405:28;31426:6;31405:16;;:20;;:28;;;;:::i;:::-;31386:16;:47;;;;31484:49;31526:6;31484:25;:37;31510:10;31484:37;;;;;;;;;;;;;;;;:41;;:49;;;;:::i;:::-;31444:25;:37;31470:10;31444:37;;;;;;;;;;;;;;;:89;;;;31553:6;;;;;;;;;;;:15;;;31569:10;31581:6;31553:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31553:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31553:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31553:35:0;;;;;;;;;;;;;;;;31546:43;;;;31631:10;31605:45;;;31643:6;31605:45;;;;;;;;;;;;;;;;;;31668:4;31661:11;;31240:440;;;:::o;32301:717::-;32377:19;32399:9;32377:31;;32424:8;32435:1;32424:12;;32419:483;32442:9;:16;;;;32438:1;:20;;;32419:483;;;32480:19;32502:36;32534:3;32502:27;32516:9;32526:1;32516:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32502:27;;:9;:13;;:27;;;;:::i;:::-;:31;;:36;;;;:::i;:::-;32480:58;;32553:26;32598:11;32610:1;32598:14;;;;;;;;;;;;;;;;;;;;;;;;;;;32553:61;;32649:32;32669:11;32649:15;;:19;;:32;;;;:::i;:::-;32631:15;:50;;;;32733:51;32772:11;32733:22;:34;32756:10;32733:34;;;;;;;;;;;;;;;;:38;;:51;;;;:::i;:::-;32696:22;:34;32719:10;32696:34;;;;;;;;;;;;;;;:88;;;;32813:28;32829:11;32813;:15;;:28;;;;:::i;:::-;32799:42;;32858:10;:19;;:32;32878:11;32858:32;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32858:32:0;32419:483;;32460:3;;;;;;;32419:483;;;;32930:1;32918:9;;:13;32914:96;;;32960:50;32976:33;33005:3;32976:24;32990:9;;32976;:13;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;32960:11;;:15;;:50;;;;:::i;:::-;32946:11;:64;;;;32914:96;32301:717;;:::o;845:202::-;903:9;934:1;929;:6;925:47;;;959:1;952:8;;;;925:47;990:1;986;:5;982:9;;1018:1;1013;1009;:5;;;;;;:10;1002:18;;;;1038:1;1031:8;;845:202;;;;;:::o;6459:281::-;4023:6;;;;;;;;;;;4009:20;;:10;:20;;;4001:29;;;;;;6524:7;;;;;;;;;;;:17;;;;;6536:5;6535:6;6524:17;6520:213;;;6568:5;6558:7;;:15;;;;;;;;;;;;;;;;;;6593:20;6602:10;6593:20;;;;;;;;;;;;;;;;;;;;;;6520:213;;;6636:7;;;;;;;;;;;6635:8;:17;;;;;6647:5;6635:17;6631:102;;;6679:4;6669:7;;:14;;;;;;;;;;;;;;;;;;6703:18;6710:10;6703:18;;;;;;;;;;;;;;;;;;;;;;6631:102;6520:213;6459:281;:::o;16673:1387::-;16712:23;16781:12;16839:13;16898:22;16966:28;17040:11;17097:17;17160:22;17228:26;17300:20;17366:19;17431:23;17485:11;;17467:29;;17522:9;;;;;;;;;;;17513:18;;:6;;;;;;;;;;;:18;;;17509:180;;;17556:9;;;;;;;;;;;17548:17;;17589:10;;;;;;;;;;;17580:19;;17509:180;;;17640:6;;;;;;;;;;;17632:14;;17670:7;;;;;;;;;;;17661:16;;17509:180;17718:15;;17701:32;;17767:14;;17744:37;;17800:4;;17794:10;;17827;;17815:22;;17865:15;;17848:32;;17912:19;;17891:40;;17957:13;;17942:28;;17995:12;;17981:26;;18036:16;;18018:34;;16673:1387;;;;;;;;;;;;:::o;13289:125::-;13354:4;13378:19;:28;13398:7;13378:28;;;;;;;;;;;;;;;;;;;;;;;;;13371:35;;13289:125;;;:::o;13484:194::-;4023:6;;;;;;;;;;;4009:20;;:10;:20;;;4001:29;;;;;;13604:5;13573:19;:28;13593:7;13573:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;13655:7;13625:45;;;13664:5;13625:45;;;;;;;;;;;;;;;;;;;;;;13484:194;;:::o;13055:164::-;12941:19;:31;12961:10;12941:31;;;;;;;;;;;;;;;;;;;;;;;;;12933:40;;;;;;13149:5;13135:11;:19;;;;13200:10;13170:41;;;13193:5;13170:41;;;;;;;;;;;;;;;;;;13055:164;:::o;15899:319::-;4023:6;;;;;;;;;;;4009:20;;:10;:20;;;4001:29;;;;;;15974:19;15996:15;:13;:15::i;:::-;15974:37;;16044:1;16030:16;;:2;:16;;;;16022:25;;;;;;16084:38;16110:11;16084:21;;:25;;:38;;;;:::i;:::-;16060:21;:62;;;;16159:2;16138:37;;;16163:11;16138:37;;;;;;;;;;;;;;;;;;16186:2;:11;;:24;16198:11;16186:24;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16186:24:0;4041:1;15899:319;:::o;20523:1197::-;20584:22;20674:17;20759:20;20847:18;20933:14;21015:17;21100:15;21183:24;21237:9;;;;;;;;;;;21224:22;;:10;:22;;;21220:86;;;21271:1;21274;21277;21280;21283;21286;21289;21292;21263:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21220:86;21335:31;21355:10;21335:19;:31::i;:::-;21318:48;;21392:18;:30;21411:10;21392:30;;;;;;;;;;;;;;;;21379:43;;21445:26;21460:10;21445:14;:26::i;:::-;21433:38;;21497:25;21511:10;21497:9;:13;;:25;;;;:::i;:::-;21482:40;;21545:13;:25;21559:10;21545:25;;;;;;;;;;;;;;;;21535:35;;21590:23;21602:10;21590:11;:23::i;:::-;21581:32;;21636:19;21647:7;21636:6;:10;;:19;;;;:::i;:::-;21624:31;;21687:25;21701:10;21687:13;:25::i;:::-;21668:44;;20523:1197;;;;;;;;;;:::o;5426:241::-;4023:6;;;;;;;;;;;4009:20;;:10;:20;;;4001:29;;;;;;5537:1;5523:16;;:2;:16;;;;5515:25;;;;;;5551:15;5577:4;5569:21;;;5551:39;;5620:6;5609:7;:17;;5601:26;;;;;;5640:2;:11;;:19;5652:6;5640:19;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5640:19:0;4041:1;5426:241;;:::o;4531:272::-;4023:6;;;;;;;;;;;4009:20;;:10;:20;;;4001:29;;;;;;4645:1;4622:25;;:11;:25;;;;4614:34;;;;;;4659:26;4688:9;;;;;;;;;;;4659:38;;4720:11;4708:9;;:23;;;;;;;;;;;;;;;;;;4783:11;4747:48;;4763:18;4747:48;;;;;;;;;;;;4041:1;4531:272;:::o;16276:350::-;4023:6;;;;;;;;;;;4009:20;;:10;:20;;;4001:29;;;;;;16348:19;16370:78;16439:8;;16370:64;16422:11;;16370:47;16404:12;;16370:29;16383:15;;16370:8;;:12;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;:51;;:64;;;;:::i;:::-;:68;;:78;;;;:::i;:::-;16348:100;;16481:1;16467:16;;:2;:16;;;;16459:25;;;;;;16508;16521:11;16508:8;;:12;;:25;;;;:::i;:::-;16497:8;:36;;;;16567:2;16549:34;;;16571:11;16549:34;;;;;;;;;;;;;;;;;;16594:2;:11;;:24;16606:11;16594:24;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16594:24:0;4041:1;16276:350;:::o;18104:721::-;18139:15;18196:27;18265:19;18326:15;18383:18;18443:28;18513:24;18560:8;;18550:18;;18601:15;;18579:37;;18641:12;;18627:26;;18674:8;;18664:18;;18706:11;;18693:24;;18751:21;;18728:44;;18802:15;:13;:15::i;:::-;18783:34;;18104:721;;;;;;;:::o;3797:79::-;3835:7;3862:6;;;;;;;;;;;3855:13;;3797:79;:::o;14527:180::-;14613:7;14640:59;14667:31;14687:10;14667:19;:31::i;:::-;14640:22;14654:7;14640:9;:13;;:22;;;;:::i;:::-;:26;;:59;;;;:::i;:::-;14633:66;;14527:180;;;;:::o;24098:166::-;24186:7;24213:20;:34;24234:12;24213:34;;;;;;;;;;;;;;;:43;24248:7;24213:43;;;;;;;;;;;;;;;;24206:50;;24098:166;;;;:::o;23835:178::-;23929:7;23956:26;:40;23983:12;23956:40;;;;;;;;;;;;;;;:49;23997:7;23956:49;;;;;;;;;;;;;;;;23949:56;;23835:178;;;;:::o;7623:75::-;;;;;;;;;;;;;:::o;15232:423::-;4023:6;;;;;;;;;;;4009:20;;:10;:20;;;4001:29;;;;;;15329:19;15351:34;15372:12;15351:20;:34::i;:::-;15329:56;;15418:1;15404:16;;:2;:16;;;;15396:25;;;;;;15479:59;15526:11;15479:28;:42;15508:12;15479:42;;;;;;;;;;;;;;;;:46;;:59;;;;:::i;:::-;15434:28;:42;15463:12;15434:42;;;;;;;;;;;;;;;:104;;;;15596:2;15554:58;;;15582:12;15600:11;15554:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;15623:2;:11;;:24;15635:11;15623:24;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15623:24:0;4041:1;15232:423;;:::o;5033:339::-;4023:6;;;;;;;;;;;4009:20;;:10;:20;;;4001:29;;;;;;5138:13;5161:9;5138:33;;5210:1;5190:22;;:8;:22;;;;5182:31;;;;;;5224:15;5242:6;:16;;;5267:4;5242:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5242:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5242:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5242:31:0;;;;;;;;;;;;;;;;5224:49;;5303:6;5292:7;:17;;5284:26;;;;;;5330:6;:15;;;5346:8;5356:6;5330:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5330:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5330:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5330:33:0;;;;;;;;;;;;;;;;5323:41;;;;4041:1;;5033:339;;;:::o;22071:659::-;22144:15;22239:19;22338:29;22447:25;22495:14;:28;22510:12;22495:28;;;;;;;;;;;;;;;;22485:38;;22548:18;:32;22567:12;22548:32;;;;;;;;;;;;;;;;22534:46;;22615:28;:42;22644:12;22615:42;;;;;;;;;;;;;;;;22591:66;;22688:34;22709:12;22688:20;:34::i;:::-;22668:54;;22071:659;;;;;:::o;12705:110::-;4023:6;;;;;;;;;;;4009:20;;:10;:20;;;4001:29;;;;;;12798:9;12780:15;;:27;;;;;;;;;;;;;;;;;;12705:110;:::o;12549:96::-;12596:6;12622:15;;;;;;;;;;;12615:22;;12549:96;:::o;22784:741::-;22844:20;22931:19;23017:25;23109:20;23196:27;23251:20;:29;23272:7;23251:29;;;;;;;;;;;;;;;;23236:44;;23305:19;:28;23325:7;23305:28;;;;;;;;;;;;;;;;23291:42;;23364:25;:34;23390:7;23364:34;;;;;;;;;;;;;;;;23344:54;;23424:20;:29;23445:7;23424:29;;;;;;;;;;;;;;;;23409:44;;23486:22;:31;23509:7;23486:31;;;;;;;;;;;;;;;;23464:53;;22784:741;;;;;;;:::o;4227:248::-;4023:6;;;;;;;;;;;4009:20;;:10;:20;;;4001:29;;;;;;4330:1;4310:22;;:8;:22;;;;4302:31;;;;;;4344:23;4370:6;;;;;;;;;;;4344:32;;4396:8;4387:6;;:17;;;;;;;;;;;;;;;;;;4458:8;4420:47;;4441:15;4420:47;;;;;;;;;;;;4041:1;4227:248;:::o;23595:158::-;23664:25;23713:18;:32;23732:12;23713:32;;;;;;;;;;;;;;;23702:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23595:158;;;:::o;19935:293::-;19997:7;20017:16;20036:59;20060:34;20083:10;20060:34;;:18;;:22;;:34;;;;:::i;:::-;20036:19;;:23;;:59;;;;:::i;:::-;20017:78;;20123:17;;20112:8;:28;20108:85;;;20164:17;;20157:24;;;;;20108:85;20212:8;20205:15;;;19935:293;;;;:::o;29049:1069::-;29104:17;29124:18;29132:9;29124:7;:18::i;:::-;29104:38;;29153:21;29177:26;29193:9;29177:15;:26::i;:::-;29153:50;;29266:62;29318:9;29266:26;:35;29293:7;;;;;;;;;;;29266:35;;;;;;;;;;;;;;;:47;29302:10;29266:47;;;;;;;;;;;;;;;;:51;;:62;;;;:::i;:::-;29216:26;:35;29243:7;;;;;;;;;;;29216:35;;;;;;;;;;;;;;;:47;29252:10;29216:47;;;;;;;;;;;;;;;:112;;;;29409:36;29435:9;29409:13;:21;29423:6;;;;;;;;;;;29409:21;;;;;;;;;;;;;;;;:25;;:36;;;;:::i;:::-;29385:13;:21;29399:6;;;;;;;;;;;29385:21;;;;;;;;;;;;;;;:60;;;;29522:38;29550:9;29522:14;:23;29537:7;;;;;;;;;;;29522:23;;;;;;;;;;;;;;;;:27;;:38;;;;:::i;:::-;29496:14;:23;29511:7;;;;;;;;;;;29496:23;;;;;;;;;;;;;;;:64;;;;29638:46;29670:13;29638:18;:27;29657:7;;;;;;;;;;;29638:27;;;;;;;;;;;;;;;;:31;;:46;;;;:::i;:::-;29608:18;:27;29627:7;;;;;;;;;;;29608:27;;;;;;;;;;;;;;;:76;;;;29740:31;29757:13;29740:12;;:16;;:31;;;;:::i;:::-;29725:12;:46;;;;29881:13;;;;;;;;;;;29877:234;;;29916:8;29927:1;29916:12;;29911:189;29934:9;:16;;;;29930:1;:20;;;29911:189;;;30024:60;30074:9;30024:20;:29;30045:7;;;;;;;;;;;30024:29;;;;;;;;;;;;;;;:45;30054:11;30066:1;30054:14;;;;;;;;;;;;;;;;;;;;;;;;;;;30024:45;;;;;;;;;;;;;;;;:49;;:60;;;;:::i;:::-;29976:20;:29;29997:7;;;;;;;;;;;29976:29;;;;;;;;;;;;;;;:45;30006:11;30018:1;30006:14;;;;;;;;;;;;;;;;;;;;;;;;;;;29976:45;;;;;;;;;;;;;;;:108;;;;29952:3;;;;;;;29911:189;;;;29877:234;29049:1069;;;:::o;14335:139::-;14396:7;14423:43;14450:15;;14423:22;14437:7;14423:9;:13;;:22;;;;:::i;:::-;:26;;:43;;;;:::i;:::-;14416:50;;14335:139;;;:::o;30181:527::-;30263:4;30293:17;30308:1;30293:10;;:14;;:17;;;;:::i;:::-;30280:10;:30;;;;30339:25;30357:6;30339:13;;:17;;:25;;;;:::i;:::-;30323:13;:41;;;;30404:38;30435:6;30404:18;:26;30423:6;;;;;;;;;;;30404:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;30375:18;:26;30394:6;;;;;;;;;;;30375:26;;;;;;;;;;;;;;;:67;;;;30488:44;30525:6;30488:20;:32;30509:10;30488:32;;;;;;;;;;;;;;;;:36;;:44;;;;:::i;:::-;30453:20;:32;30474:10;30453:32;;;;;;;;;;;;;;;:79;;;;30552:6;;;;;;;;;;;:15;;;30568:10;30580:6;30552:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30552:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30552:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30552:35:0;;;;;;;;;;;;;;;;30545:43;;;;30635:10;30604:74;;;30627:6;;;;;;;;;;;30647;30655:11;;30668:9;30604:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30696:4;30689:11;;30181:527;;;;:::o;31735:494::-;31774:4;31816:10;31796:31;;;31808:6;;;;;;;;;;;31796:31;;;;;;;;;;;;;;;;;;;;31847:13;31858:1;31847:6;;;;;;;;;;;:10;;;;:13;;;;:::i;:::-;31838:6;;:22;;;;;;;;;;;;;;;;;;31889:27;31909:6;;;;;;;;;;;31889:19;:27::i;:::-;31871:15;:45;;;;31944:21;31958:6;;;;;;;;;;;31944:13;:21::i;:::-;31927:14;:38;;;;32011:21;32035:18;32046:6;;;;;;;;;;;32035:10;:18::i;:::-;32011:42;;32078:14;32068:24;;:7;;;;;;;;;;;:24;;;32064:134;;;32136:10;32114:33;;;32127:7;;;;;;;;;;;32114:33;;;;;;;;;;;;;;;;;;;;;;32172:14;32162:7;;:24;;;;;;;;;;;;;;;;;;32064:134;32217:4;32210:11;;;31735:494;:::o;15718:120::-;15765:7;15792:38;15808:21;;15792:11;;:15;;:38;;;;:::i;:::-;15785:45;;15718:120;:::o;13760:170::-;13830:7;13857:65;13884:37;13910:10;13884:37;;:21;;:25;;:37;;;;:::i;:::-;13857:22;;:26;;:65;;;;:::i;:::-;13850:72;;13760:170;;;:::o;20300:154::-;20365:7;20392:54;20410:23;20422:10;20410:11;:23::i;:::-;20435:10;20392:17;:54::i;:::-;20385:61;;20300:154;;;:::o;19452:181::-;19516:7;19543:82;19569:55;19614:9;;;;;;;;;;;19569:55;;:40;19598:10;19569:40;;:24;;:28;;:40;;;;:::i;:::-;:44;;:55;;;;:::i;:::-;19543:21;;:25;;:82;;;;:::i;:::-;19536:89;;19452:181;;;:::o;21792:188::-;21865:7;21892:80;21929:28;:42;21958:12;21929:42;;;;;;;;;;;;;;;;21892:18;:32;21911:12;21892:32;;;;;;;;;;;;;;;;:36;;:80;;;;:::i;:::-;21885:87;;21792:188;;;:::o;19698:154::-;19764:7;19791:53;19799:44;19833:9;19799:29;19813:14;;19799:9;:13;;:29;;;;:::i;:::-;:33;;:44;;;;:::i;:::-;19791:7;:53::i;:::-;19784:60;;19698:154;;;:::o;1891:138::-;1947:8;1976:1;1972;:5;1968:9;;2000:1;1995:6;;:1;:6;;;;1988:14;;;;2020:1;2013:8;;1891:138;;;;:::o;14787:364::-;14848:6;14884:1;14871:10;:14;;;14867:256;;;14902:21;14926:29;14941:13;;;;;;;;;;;14926:10;:14;;;;:29;;;;:::i;:::-;14902:53;;15008:1;14976:29;14991:13;;;;;;;;;;;14976:10;:14;;;;:29;;;;:::i;:::-;:33;;;14972:102;;;15037:21;15056:1;15037:14;:18;;;;:21;;;;:::i;:::-;15030:28;;;;;14972:102;15097:14;15090:21;;;;;14867:256;15142:1;15135:8;;14787:364;;;;:::o;2723:184::-;2779:6;2809:1;2805;:5;;;2798:13;;;;2822:9;2838:1;2834:5;;:1;:5;;;;;;;;2822:17;;;;2874:1;2870:5;;:1;:5;;;;;;;;2862:13;;2866:1;2862;:5;;;:13;2857:1;:18;;;2850:26;;;;2898:1;2894:5;;:1;:5;;;;;;;;2887:12;;;2723:184;;;;:::o;3068:121::-;3124:6;3156:1;3151;:6;;;;3143:15;;;;;;3180:1;3176:5;;:1;:5;;;;;;;;3169:12;;3068:121;;;;:::o;7483:25538::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://fa6d6185eea275883ca43434abea818b8eeba930611110a8c8afa515489f8fde

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.