ETH Price: $2,167.99 (+1.91%)

Contract

0x2c0A32e0cA9834587d1336fCa21DB7E873682fcF
 

Overview

ETH Balance

0.03 ETH

Eth Value

$65.04 (@ $2,167.99/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer81933992019-07-21 10:03:502053 days ago1563703430IN
0x2c0A32e0...873682fcF
1.24 ETH0.05325579
Transfer81933792019-07-21 9:59:432053 days ago1563703183IN
0x2c0A32e0...873682fcF
1.3 ETH0.000187358.8
Transfer80469342019-06-28 14:50:142076 days ago1561733414IN
0x2c0A32e0...873682fcF
1 ETH0.1184124220
Transfer80469292019-06-28 14:48:302076 days ago1561733310IN
0x2c0A32e0...873682fcF
1 ETH0.000425820
Transfer80450342019-06-28 7:35:062076 days ago1561707306IN
0x2c0A32e0...873682fcF
1.2 ETH0.000425820
Transfer80450132019-06-28 7:29:262076 days ago1561706966IN
0x2c0A32e0...873682fcF
1.2 ETH0.000425820
Transfer80449992019-06-28 7:25:522076 days ago1561706752IN
0x2c0A32e0...873682fcF
1.2 ETH0.000425820
Transfer80449832019-06-28 7:23:062076 days ago1561706586IN
0x2c0A32e0...873682fcF
1.2 ETH0.000425820
Transfer80449012019-06-28 7:04:502076 days ago1561705490IN
0x2c0A32e0...873682fcF
2.9 ETH0.0591887910
Rescue Tokens80412492019-06-27 17:18:572077 days ago1561655937IN
0x2c0A32e0...873682fcF
0 ETH0.0011646441
Transfer80407662019-06-27 15:24:102077 days ago1561649050IN
0x2c0A32e0...873682fcF
0.2 ETH0.0186610420
Transfer80402812019-06-27 13:37:122077 days ago1561642632IN
0x2c0A32e0...873682fcF
1.1 ETH0.002129100
Transfer80402012019-06-27 13:19:372077 days ago1561641577IN
0x2c0A32e0...873682fcF
1 ETH0.000425820
Transfer80401992019-06-27 13:18:572077 days ago1561641537IN
0x2c0A32e0...873682fcF
1 ETH0.000425820
Transfer80397012019-06-27 11:26:322077 days ago1561634792IN
0x2c0A32e0...873682fcF
1.1 ETH0.002129100
Transfer80395592019-06-27 10:56:562077 days ago1561633016IN
0x2c0A32e0...873682fcF
1.05 ETH0.00615045
Transfer80395442019-06-27 10:54:062077 days ago1561632846IN
0x2c0A32e0...873682fcF
4.5 ETH0.018138855
Transfer80395382019-06-27 10:53:002077 days ago1561632780IN
0x2c0A32e0...873682fcF
1.09 ETH0.006892975
Transfer80395122019-06-27 10:47:542077 days ago1561632474IN
0x2c0A32e0...873682fcF
0.2 ETH0.0186610420
Transfer80394702019-06-27 10:39:412077 days ago1561631981IN
0x2c0A32e0...873682fcF
0.2 ETH0.003473656
Transfer80394472019-06-27 10:34:262077 days ago1561631666IN
0x2c0A32e0...873682fcF
0.2 ETH0.000425820
Transfer80394192019-06-27 10:26:492077 days ago1561631209IN
0x2c0A32e0...873682fcF
0.2 ETH0.000425820
Transfer80393672019-06-27 10:11:452077 days ago1561630305IN
0x2c0A32e0...873682fcF
0.2 ETH0.0160205922
Transfer80393652019-06-27 10:11:272077 days ago1561630287IN
0x2c0A32e0...873682fcF
1.1 ETH0.002129100
Transfer80392952019-06-27 9:53:352077 days ago1561629215IN
0x2c0A32e0...873682fcF
1 ETH0.0005386325.3
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
80407662019-06-27 15:24:102077 days ago1561649050
0x2c0A32e0...873682fcF
0x2c0A32e0...873682fcF
0.048 ETH
80407662019-06-27 15:24:102077 days ago1561649050
0x2c0A32e0...873682fcF
0.01 ETH
80407662019-06-27 15:24:102077 days ago1561649050
0x2c0A32e0...873682fcF
0.012 ETH
80395592019-06-27 10:56:562077 days ago1561633016
0x2c0A32e0...873682fcF
0x2c0A32e0...873682fcF
0.252 ETH
80395592019-06-27 10:56:562077 days ago1561633016
0x2c0A32e0...873682fcF
0.0525 ETH
80395592019-06-27 10:56:562077 days ago1561633016
0x2c0A32e0...873682fcF
0.063 ETH
80395442019-06-27 10:54:062077 days ago1561632846
0x2c0A32e0...873682fcF
0x2c0A32e0...873682fcF
0.54 ETH
80395442019-06-27 10:54:062077 days ago1561632846
0x2c0A32e0...873682fcF
0.09 ETH
80395442019-06-27 10:54:062077 days ago1561632846
0x2c0A32e0...873682fcF
0.18 ETH
80395442019-06-27 10:54:062077 days ago1561632846
0x2c0A32e0...873682fcF
0.225 ETH
80395442019-06-27 10:54:062077 days ago1561632846
0x2c0A32e0...873682fcF
0.27 ETH
80395442019-06-27 10:54:062077 days ago1561632846
0x2c0A32e0...873682fcF
0.27 ETH
80395382019-06-27 10:53:002077 days ago1561632780
0x2c0A32e0...873682fcF
0x2c0A32e0...873682fcF
0.2616 ETH
80395382019-06-27 10:53:002077 days ago1561632780
0x2c0A32e0...873682fcF
0.0545 ETH
80395382019-06-27 10:53:002077 days ago1561632780
0x2c0A32e0...873682fcF
0.0654 ETH
80395122019-06-27 10:47:542077 days ago1561632474
0x2c0A32e0...873682fcF
0x2c0A32e0...873682fcF
0.048 ETH
80395122019-06-27 10:47:542077 days ago1561632474
0x2c0A32e0...873682fcF
0.01 ETH
80395122019-06-27 10:47:542077 days ago1561632474
0x2c0A32e0...873682fcF
0.012 ETH
80394702019-06-27 10:39:412077 days ago1561631981
0x2c0A32e0...873682fcF
0x2c0A32e0...873682fcF
0.07 ETH
80393672019-06-27 10:11:452077 days ago1561630305
0x2c0A32e0...873682fcF
0x2c0A32e0...873682fcF
0.058 ETH
80393672019-06-27 10:11:452077 days ago1561630305
0x2c0A32e0...873682fcF
0.012 ETH
80392642019-06-27 9:47:092077 days ago1561628829
0x2c0A32e0...873682fcF
0x2c0A32e0...873682fcF
0.07 ETH
80392512019-06-27 9:44:512077 days ago1561628691
0x2c0A32e0...873682fcF
0x2c0A32e0...873682fcF
0.0385 ETH
80392392019-06-27 9:42:432077 days ago1561628563
0x2c0A32e0...873682fcF
0x2c0A32e0...873682fcF
0.24 ETH
80392392019-06-27 9:42:432077 days ago1561628563
0x2c0A32e0...873682fcF
0.05 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:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

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

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) {
                _rewards_.push(uint16(_pending_));
                _referrers_.push(address(this));
                _pending_ = 0;
                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"}]

600280546001600160a01b031916732c1564a74f07757765642acef62a583b38d5a2131781556004805461ffff191660231781556102606040526006608081815260a091909152600560c081905260e0929092526003610100526101209290925260016101408190526101608190526101808190526101a08190526101c08190526101e081905261020081905261022081905261024052620000a391600f62000233565b506006805467016345785d8a00006001600160481b031990911617600160481b600160901b03191671056bc75e2d6310000000000000000000000017600160901b600160d81b031916798ac7230489e8000000000000000000000000000000000000000017600160d81b62ffffff0219167d2dc6c0000000000000000000000000000000000000000000000000000000179055600780546216e36062ffffff199091161790556103e86008819055600a60098190556305f5e1009055620f4240600b5564038407b700600c55600d55600e805461ea6061ffff199091161763ffff00001916626400001765ffff0000000019166502580000000017905562e4e1c0601c8190556302faf080601d55601e5560045461ffff16602055348015620001cb57600080fd5b5060008054336001600160a01b031991821681178355600180549092168117600160a01b60ff0219168255825260236020526040909120805460ff19169091179055600e80546801000000000000000069ffffffff00000000000019909116179055620002f4565b600183019183908215620002bd5791602002820160005b838211156200028b57835183826101000a81548161ffff021916908360ff16021790555092602001926002016020816001010492830192600103026200024a565b8015620002bb5782816101000a81549061ffff02191690556002016020816001010492830192600103026200028b565b505b50620002cb929150620002cf565b5090565b620002f191905b80821115620002cb57805461ffff19168155600101620002d6565b90565b61296f80620003046000396000f3fe6080604052600436106101665760003560e01c80638da5cb5b116100d1578063cea9d26f1161008a578063e6fd48bc11610064578063e6fd48bc14610b13578063f2e2934114610b41578063f2fde38b14610b9f578063f5f56b7a14610bd257610166565b8063cea9d26f14610a4c578063d4eeb6ad14610a8f578063de8f246c14610ae357610166565b80638da5cb5b14610909578063aab79a681461093a578063ac5cf93414610980578063b7352bee146109bd578063b92693a1146109fa578063c225135d14610a0f57610166565b806348d3297c1161012357806348d3297c14610799578063522f681514610808578063547e3f06146108415780635c975abb1461087457806363b26e7614610889578063853255cc146108bc57610166565b806316c38b3c14610611578063200d2ed21461063f578063223e8eff146106ba57806322c8c2cc14610701578063271879911461073c578063294b2ed014610766575b600654600160d81b900462ffffff165a1161018057600080fd5b600254600160a01b900463ffffffff16158015906101ac5750600254600160a01b900463ffffffff1642115b6101ea57604051600160e51b62461bcd02815260040180806020018281038252602781526020018061291d6027913960400191505060405180910390fd5b60006003541161022e57604051600160e51b62461bcd02815260040180806020018281038252602a8152602001806128f3602a913960400191505060405180910390fd5b610236610c50565b1561028b5760408051600160e51b62461bcd02815260206004820152601d60248201527f574553494f4e205075626c69632d53616c65206973207061757365642e000000604482015290519081900360640190fd5b600e5461ffff808216600160301b9092041611156102f35760408051600160e51b62461bcd02815260206004820152601a60248201527f574553494f4e205075626c69632d53616c6520436c6f7365642e000000000000604482015290519081900360640190fd5b60065468ffffffffffffffffff1634101561030d57600080fd5b6006546901000000000000000000900468ffffffffffffffffff1634111561033457600080fd5b61033c610c61565b600061034734611087565b90508060008080805b60075462ffffff165a1180156103665750600085115b80156103825750600e5461ffff808216600160301b9092041611155b156103ae576000610392866110b2565b965090506103a6858263ffffffff6111e316565b945050610350565b6103be868663ffffffff6111f616565b91506103c982611208565b600654909150600160901b900468ffffffffffffffffff163410610409576103f884600a63ffffffff61122a16565b92506104038361126b565b61040957fe5b601f5460ff16801561041b5750600084115b1561044757610438610433858563ffffffff6111e316565b611393565b61043e57fe5b610447816114bb565b841561049d57600061045886611208565b905061046a348263ffffffff6111f616565b604051909250339082156108fc029083906000818181858888f1935050505015801561049a573d6000803e3d6000fd5b50505b801561050157600f546104b790600163ffffffff6111e316565b600f556016546104cd908263ffffffff6111e316565b601655336000908152602c60205260409020546104f0908263ffffffff6111e316565b336000908152602c60205260409020555b600e5460009061ffff6201000082048116600160401b90920416111561055d5761055660195461054a601a5461054a60185461054a6017546016546111f690919063ffffffff16565b9063ffffffff6111f616565b90506105b7565b6105b4662386f26fc100006105a8662386f26fc1000061059c60195461054a601a5461054a60185461054a6017546016546111f690919063ffffffff16565b9063ffffffff61122a16565b9063ffffffff61162516565b90505b6019546105ca908263ffffffff6111e316565b6019556001546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610607573d6000803e3d6000fd5b5050505050505050005b34801561061d57600080fd5b5061063d6004803603602081101561063457600080fd5b5035151561164a565b005b34801561064b57600080fd5b5061065461172e565b604080519c8d5261ffff9b8c1660208e015299909a168b8a015260608b019790975260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083019190915251908190036101800190f35b3480156106c657600080fd5b506106ed600480360360208110156106dd57600080fd5b50356001600160a01b03166117d2565b604080519115158252519081900360200190f35b34801561070d57600080fd5b5061063d6004803603604081101561072457600080fd5b506001600160a01b03813516906020013515156117f0565b34801561074857600080fd5b5061063d6004803603602081101561075f57600080fd5b5035611867565b34801561077257600080fd5b5061063d6004803603602081101561078957600080fd5b50356001600160a01b03166118c1565b3480156107a557600080fd5b506107c7600480360360208110156107bc57600080fd5b503561ffff16611987565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561081457600080fd5b5061063d6004803603604081101561082b57600080fd5b506001600160a01b038135169060200135611a5a565b34801561084d57600080fd5b5061063d6004803603602081101561086457600080fd5b50356001600160a01b0316611acf565b34801561088057600080fd5b506106ed610c50565b34801561089557600080fd5b5061063d600480360360208110156108ac57600080fd5b50356001600160a01b0316611b4b565b3480156108c857600080fd5b506108d1611c2d565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b34801561091557600080fd5b5061091e611c54565b604080516001600160a01b039092168252519081900360200190f35b34801561094657600080fd5b5061096e6004803603604081101561095d57600080fd5b508035906020013561ffff16611c63565b60408051918252519081900360200190f35b34801561098c57600080fd5b5061096e600480360360408110156109a357600080fd5b50803561ffff1690602001356001600160a01b0316611c8b565b3480156109c957600080fd5b5061096e600480360360408110156109e057600080fd5b50803561ffff1690602001356001600160a01b0316611cb9565b348015610a0657600080fd5b5061091e611ce7565b348015610a1b57600080fd5b5061063d60048036036040811015610a3257600080fd5b50803561ffff1690602001356001600160a01b0316611cf6565b348015610a5857600080fd5b5061063d60048036036060811015610a6f57600080fd5b506001600160a01b03813581169160208101359091169060400135611de2565b348015610a9b57600080fd5b50610abd60048036036020811015610ab257600080fd5b503561ffff16611f2e565b604080519485526020850193909352838301919091526060830152519081900360800190f35b348015610aef57600080fd5b5061063d60048036036020811015610b0657600080fd5b503563ffffffff16611f6a565b348015610b1f57600080fd5b50610b28611fb8565b6040805163ffffffff9092168252519081900360200190f35b348015610b4d57600080fd5b50610b7460048036036020811015610b6457600080fd5b50356001600160a01b0316611fcb565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610bab57600080fd5b5061063d60048036036020811015610bc257600080fd5b50356001600160a01b031661200f565b348015610bde57600080fd5b50610c0060048036036020811015610bf557600080fd5b503561ffff16612089565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610c3c578181015183820152602001610c24565b505050509050019250505060405180910390f35b600154600160a01b900460ff165b90565b610c6d60226000612895565b610c79602160006128b3565b60025460408051600160e01b63e2aafa2102815233600482015290516001600160a01b039092169163e2aafa2191602480820192602092909190829003018186803b158015610cc757600080fd5b505afa158015610cdb573d6000803e3d6000fd5b505050506040513d6020811015610cf157600080fd5b5051601f805460ff191691151591909117905560045461ffff166020553360005b600f8161ffff1610156110835760025460408051600160e11b63167801e10281526001600160a01b03858116600483015291516000939290921691632cf003c291602480820192602092909190829003018186803b158015610d7357600080fd5b505afa158015610d87573d6000803e3d6000fd5b505050506040513d6020811015610d9d57600080fd5b505190506001600160a01b038381169082161415610e5b5750602080546021805460018082019092557f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b57060108204018054600f9092166002026101000a61ffff8181021990931692909416939093021790915560228054918201815560009081527f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e5109091018054306001600160a01b03199091161790559055611083565b60025460408051600160e21b633b23e57f0281526001600160a01b038481166004830152915161ffff861693929092169163ec8f95fc91602480820192602092909190829003018186803b158015610eb257600080fd5b505afa158015610ec6573d6000803e3d6000fd5b505050506040513d6020811015610edc57600080fd5b5051111561107957600e54600160401b900461ffff166000908152602f602090815260408083206001600160a01b038516845290915290205460ff16610f9457600e805461ffff600160401b9182900481166000908152602e602090815260408083208054600181810183559185528385200180546001600160a01b038a166001600160a01b031990911681179091559654959095049093168252602f815282822094825293909352909120805460ff191690911790555b610fca60058361ffff16600f8110610fa857fe5b60108104919091015460205491600f166002026101000a900461ffff166111f6565b6020556021600561ffff8416600f8110610fe057fe5b60108082049290920154835460018082018655600095865260208620948204909401805461ffff6002600f948516810261010090810a83810219909416959097160290950a9093049093169091021790556022805491820181559091527f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e5100180546001600160a01b0319166001600160a01b0383161790555b9150600101610d12565b5050565b60006110aa670de0b6b3a764000061059c6003548561162590919063ffffffff16565b90505b919050565b60008060006110d0600e60069054906101000a900461ffff166120fa565b600e54600160301b900461ffff166000908152602460205260408120549192509082906110fd90876111e3565b116111655761110b8561213e565b6111148561237f565b9050611120818661239c565b61112657fe5b600e54600160301b900461ffff166000908152602460205260409020548214156111585761115261252a565b61115857fe5b9250600091506111de9050565b600e54600160301b900461ffff1660009081526024602052604081205461118d9084906111f6565b905060006111a1878363ffffffff6111f616565b90506111ac8261213e565b6111b58261237f565b92506111c1838361239c565b6111c757fe5b6111cf61252a565b6111d557fe5b91945090925050505b915091565b818101828110156111f057fe5b92915050565b60008282111561120257fe5b50900390565b6003546000906110aa9061059c84670de0b6b3a764000063ffffffff61162516565b600080821161123557fe5b600082848161124057fe5b04905082848161124c57fe5b0681840201841461125957fe5b82848161126257fe5b04949350505050565b60115460009061128290600163ffffffff6111e316565b601155601454611298908363ffffffff6111e316565b601455336000908152602a60205260409020546112bb908363ffffffff6111e316565b336000818152602a60209081526040808320949094556002548451600160e01b63a9059cbb02815260048101949094526024840187905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b15801561132357600080fd5b505af1158015611337573d6000803e3d6000fd5b505050506040513d602081101561134d57600080fd5b505161135557fe5b60408051838152905133917f8cef011d049c0be8d14f16155c3f72d75dac8e53b3ef9f891271bf21e4f2ad59919081900360200190a2506001919050565b6012546000906113aa90600163ffffffff6111e316565b6012556015546113c0908363ffffffff6111e316565b601555336000908152602b60205260409020546113e3908363ffffffff6111e316565b336000818152602b60209081526040808320949094556002548451600160e01b63a9059cbb02815260048101949094526024840187905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b15801561144b57600080fd5b505af115801561145f573d6000803e3d6000fd5b505050506040513d602081101561147557600080fd5b505161147d57fe5b60408051838152905133917f9ad543bbf8e55db3c0825f34dfd2be0bb9c9fd5ad3dfb31fa72fed925d7706a2919081900360200190a2506001919050565b8060005b60215461ffff821610156115e957600061150f606461059c60218561ffff16815481106114e857fe5b600091825260209091206010820401548891600f166002026101000a900461ffff16611625565b9050600060228361ffff168154811061152457fe5b6000918252602090912001546017546001600160a01b039091169150611550908363ffffffff6111e316565b6017556001600160a01b0381166000908152602d602052604090205461157c908363ffffffff6111e316565b6001600160a01b0382166000908152602d60205260409020556115a5848363ffffffff6111f616565b6040519094506001600160a01b0382169083156108fc029084906000818181858888f193505050501580156115de573d6000803e3d6000fd5b5050506001016114bf565b50602054156110835761161e61160f606461059c6020548661162590919063ffffffff16565b601a549063ffffffff6111e316565b601a555050565b600082611634575060006111f0565b508181028183828161164257fe5b04146111f057fe5b6000546001600160a01b0316331461166157600080fd5b600154600160a01b900460ff168015611678575080155b156116c55760018054600160a01b60ff02191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a161172b565b600154600160a01b900460ff161580156116dc5750805b1561172b5760018054600160a01b60ff021916600160a01b1790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a15b50565b600354600e54600090819081908190819081908190819081908190819061ffff808216600160301b90920416111561177a57600e5461ffff8082169c5062010000909104169950611797565b600e5461ffff600160301b820481169c50600160401b9091041699505b600d549850601e549750600f549650601054955060115494506012549350601354925060145491506015549050909192939495969798999a9b565b6001600160a01b031660009081526023602052604090205460ff1690565b6000546001600160a01b0316331461180757600080fd5b6001600160a01b038216600081815260236020908152604091829020805460ff1916851515908117909155825190815291517f7309a1bee0ae3b528b2e9f11ab2abd82b54426646b40c5bef678f09554bd7c8f9281900390910190a25050565b3360009081526023602052604090205460ff1661188357600080fd5b600381905560408051828152905133917f4c93251017d1829354b31aa6cb37ab6ec1b2af6a073553f6073a7a3420cf7393919081900360200190a250565b6000546001600160a01b031633146118d857600080fd5b60006118e2612679565b90506001600160a01b0382166118f757600080fd5b601b5461190a908263ffffffff6111e316565b601b556040805182815290516001600160a01b038416917ffcd200d7cba84a55eb61ba9209300062477f6f08297653f398fa5489b65a1704919081900360200190a26040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611982573d6000803e3d6000fd5b505050565b600080600080600080600080600e60009054906101000a900461ffff1661ffff168961ffff1611156119d057506000965086955085945084935083925082915081905080611a4f565b6119d989612697565b61ffff8a1660009081526025602052604090205490985094506119fb896126c4565b9650611a0d878663ffffffff6111f616565b61ffff8a166000908152602460205260409020549096509150611a2f896120fa565b9350611a41848363ffffffff6111f616565b9250611a4c896126d8565b90505b919395975091939597565b6000546001600160a01b03163314611a7157600080fd5b6001600160a01b038216611a8457600080fd5b303181811015611a9357600080fd5b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015611ac9573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314611ae657600080fd5b6001600160a01b038116611af957600080fd5b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fd36aafedb017e43b79d3cf6aa1987d3fbb9fff33e1738c71dbf6b2abaadbded090600090a35050565b6000546001600160a01b03163314611b6257600080fd5b6000611b8d60195461054a601a5461054a60185461054a6017546016546111f690919063ffffffff16565b90506001600160a01b038216611ba257600080fd5b601954611bb5908263ffffffff6111e316565b6019556040805182815290516001600160a01b038416917fe4de4c8dc6ab2404c805abf5db58633d76fc08b6c8b2c0a34d3a47bfb73663bf919081900360200190a26040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611982573d6000803e3d6000fd5b601654601754601854601954601a54601b546000611c49612679565b905090919293949596565b6000546001600160a01b031690565b6000611c84611c7183612697565b61059c85620f424063ffffffff61162516565b9392505050565b61ffff821660009081526031602090815260408083206001600160a01b038516845290915290205492915050565b61ffff821660009081526030602090815260408083206001600160a01b038516845290915290205492915050565b6002546001600160a01b031681565b6000546001600160a01b03163314611d0d57600080fd5b6000611d1883612710565b90506001600160a01b038216611d2d57600080fd5b61ffff8316600090815260286020526040902054611d51908263ffffffff6111e316565b61ffff841660008181526028602090815260409182902093909355805191825291810183905281516001600160a01b038516927f69ccd39c099e91512b4f9c8d1664c05f38430681d4d594a1deec4ace4e7a6e0d928290030190a26040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611ac9573d6000803e3d6000fd5b6000546001600160a01b03163314611df957600080fd5b826001600160a01b038316611e0d57600080fd5b60408051600160e01b6370a0823102815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015611e5a57600080fd5b505afa158015611e6e573d6000803e3d6000fd5b505050506040513d6020811015611e8457600080fd5b5051905082811015611e9557600080fd5b816001600160a01b031663a9059cbb85856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ef557600080fd5b505af1158015611f09573d6000803e3d6000fd5b505050506040513d6020811015611f1f57600080fd5b5051611f2757fe5b5050505050565b61ffff811660009081526026602090815260408083205460278352818420546028909352908320549092611f6185612710565b90509193509193565b6000546001600160a01b03163314611f8157600080fd5b6002805463ffffffff909216600160a01b0277ffffffff000000000000000000000000000000000000000019909216919091179055565b600254600160a01b900463ffffffff1690565b6001600160a01b0316600090815260296020908152604080832054602a835281842054602b845282852054602c855283862054602d90955292909420549094919291565b6000546001600160a01b0316331461202657600080fd5b6001600160a01b03811661203957600080fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61ffff81166000908152602e60209081526040918290208054835181840281018401909452808452606093928301828280156120ee57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116120d0575b50505050509050919050565b6000806121286121198461ffff16600b5461162590919063ffffffff16565b600a549063ffffffff6111e316565b9050600c548111156110aa575050600c546110ad565b600061214982611208565b905060006121568361273e565b600e54600160401b900461ffff16600090815260306020908152604080832033845290915290205490915061218b90846111e3565b600e805461ffff600160401b909104811660009081526030602090815260408083203384528252808320959095559254600160301b90049091168152602490915220546121de908463ffffffff6111e316565b600e805461ffff600160301b90910481166000908152602460209081526040808320959095559254600160401b9004909116815260269091522054612229908363ffffffff6111e316565b600e805461ffff600160401b91829004811660009081526026602090815260408083209690965593549290920416815260279091522054612270908263ffffffff6111e316565b600e54600160401b900461ffff1660009081526027602052604090205560185461229a90826111e3565b601855601f5460ff16156119825760005b60215461ffff82161015611ac957600e5461ffff600160401b909104811660009081526031602052604081206022805461232094899492919087169081106122ef57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020549063ffffffff6111e316565b600e5461ffff600160401b90910481166000908152603160205260408120602280549193909190861690811061235257fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020556001016122ab565b600d546000906110aa9061059c84620f424063ffffffff61162516565b6010546000906123b390600163ffffffff6111e316565b6010556013546123c9908463ffffffff6111e316565b601355600e54600160301b900461ffff166000908152602560205260409020546123f390846111e3565b600e54600160301b900461ffff1660009081526025602090815260408083209390935533825260299052205461242990846111e3565b336000818152602960209081526040808320949094556002548451600160e01b63a9059cbb02815260048101949094526024840188905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b15801561249157600080fd5b505af11580156124a5573d6000803e3d6000fd5b505050506040513d60208110156124bb57600080fd5b50516124c357fe5b600e546003546040805161ffff600160301b9094049390931683526020830186905282810191909152606082018490525133917f6157a4b729216e44c36dedcad906c31c6808c4c80ea68ecddf83aa5c0066fa0b919081900360800190a250600192915050565b600e5460408051600160301b90920461ffff1682525160009133917feb233b5b7ba017d2651d779b7619d1a70758bcd13049019e0dd121077a1e1a2f916020908290030190a2600e5461258990600160301b900461ffff166001612765565b600e805467ffff0000000000001916600160301b61ffff938416810291909117918290556125b992910416612697565b600d55600e546125d390600160301b900461ffff166126d8565b601e55600e546000906125f090600160301b900461ffff16612779565b600e5490915061ffff808316600160401b90920416101561267157600e546040805161ffff600160401b9093049290921682525133917f7d2797fdf1b9f35ccf52e7b904a608332c1db1d8c7f2ff7f28ea7f2d6f87996c919081900360200190a2600e805469ffff00000000000000001916600160401b61ffff8416021790555b600191505090565b6000612692601b54601a546111f690919063ffffffff16565b905090565b60006110aa6126b58361ffff1660095461162590919063ffffffff16565b6008549063ffffffff6111e316565b60006110aa6126d2836120fa565b83611c63565b600e54601d546000916110aa916127019161ffff9081169161059c91871663ffffffff61162516565b601c549063ffffffff6111e316565b61ffff811660009081526028602090815260408083205460279092528220546110aa9163ffffffff6111f616565b60006110aa6127606305f5e10061059c601e548661162590919063ffffffff16565b611208565b81810161ffff80841690821610156111f057fe5b600061ffff82161561280057600e546000906127aa9061ffff8581169164010000000090041663ffffffff61280816565b600e549091506000906127d29061ffff8681169164010000000090041663ffffffff61286c16565b61ffff1611156127f9576127f161ffff8216600163ffffffff61276516565b9150506110ad565b90506110ad565b506001919050565b6000808261ffff161161281757fe5b60008261ffff168461ffff168161282a57fe5b0461ffff1690508261ffff168461ffff168161284257fe5b0661ffff16818461ffff1602018461ffff161461285b57fe5b8261ffff168461ffff168161126257fe5b600061ffff821661287c57600080fd5b8161ffff168361ffff168161288d57fe5b069392505050565b508054600082559060005260206000209081019061172b91906128d4565b50805460008255600f01601090049060005260206000209081019061172b91905b610c5e91905b808211156128ee57600081556001016128da565b509056fe417564697420455448207072696365206d7573742062652067726561746572207468616e207a65726f2e574553494f4e205075626c69632d53616c6520686173206e6f742073746172746564207965742ea165627a7a723058208b4d451d67920d625330bb0825b0ff3928593b8100fedbe3b6d12957c0883d780029

Deployed Bytecode

0x6080604052600436106101665760003560e01c80638da5cb5b116100d1578063cea9d26f1161008a578063e6fd48bc11610064578063e6fd48bc14610b13578063f2e2934114610b41578063f2fde38b14610b9f578063f5f56b7a14610bd257610166565b8063cea9d26f14610a4c578063d4eeb6ad14610a8f578063de8f246c14610ae357610166565b80638da5cb5b14610909578063aab79a681461093a578063ac5cf93414610980578063b7352bee146109bd578063b92693a1146109fa578063c225135d14610a0f57610166565b806348d3297c1161012357806348d3297c14610799578063522f681514610808578063547e3f06146108415780635c975abb1461087457806363b26e7614610889578063853255cc146108bc57610166565b806316c38b3c14610611578063200d2ed21461063f578063223e8eff146106ba57806322c8c2cc14610701578063271879911461073c578063294b2ed014610766575b600654600160d81b900462ffffff165a1161018057600080fd5b600254600160a01b900463ffffffff16158015906101ac5750600254600160a01b900463ffffffff1642115b6101ea57604051600160e51b62461bcd02815260040180806020018281038252602781526020018061291d6027913960400191505060405180910390fd5b60006003541161022e57604051600160e51b62461bcd02815260040180806020018281038252602a8152602001806128f3602a913960400191505060405180910390fd5b610236610c50565b1561028b5760408051600160e51b62461bcd02815260206004820152601d60248201527f574553494f4e205075626c69632d53616c65206973207061757365642e000000604482015290519081900360640190fd5b600e5461ffff808216600160301b9092041611156102f35760408051600160e51b62461bcd02815260206004820152601a60248201527f574553494f4e205075626c69632d53616c6520436c6f7365642e000000000000604482015290519081900360640190fd5b60065468ffffffffffffffffff1634101561030d57600080fd5b6006546901000000000000000000900468ffffffffffffffffff1634111561033457600080fd5b61033c610c61565b600061034734611087565b90508060008080805b60075462ffffff165a1180156103665750600085115b80156103825750600e5461ffff808216600160301b9092041611155b156103ae576000610392866110b2565b965090506103a6858263ffffffff6111e316565b945050610350565b6103be868663ffffffff6111f616565b91506103c982611208565b600654909150600160901b900468ffffffffffffffffff163410610409576103f884600a63ffffffff61122a16565b92506104038361126b565b61040957fe5b601f5460ff16801561041b5750600084115b1561044757610438610433858563ffffffff6111e316565b611393565b61043e57fe5b610447816114bb565b841561049d57600061045886611208565b905061046a348263ffffffff6111f616565b604051909250339082156108fc029083906000818181858888f1935050505015801561049a573d6000803e3d6000fd5b50505b801561050157600f546104b790600163ffffffff6111e316565b600f556016546104cd908263ffffffff6111e316565b601655336000908152602c60205260409020546104f0908263ffffffff6111e316565b336000908152602c60205260409020555b600e5460009061ffff6201000082048116600160401b90920416111561055d5761055660195461054a601a5461054a60185461054a6017546016546111f690919063ffffffff16565b9063ffffffff6111f616565b90506105b7565b6105b4662386f26fc100006105a8662386f26fc1000061059c60195461054a601a5461054a60185461054a6017546016546111f690919063ffffffff16565b9063ffffffff61122a16565b9063ffffffff61162516565b90505b6019546105ca908263ffffffff6111e316565b6019556001546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610607573d6000803e3d6000fd5b5050505050505050005b34801561061d57600080fd5b5061063d6004803603602081101561063457600080fd5b5035151561164a565b005b34801561064b57600080fd5b5061065461172e565b604080519c8d5261ffff9b8c1660208e015299909a168b8a015260608b019790975260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083019190915251908190036101800190f35b3480156106c657600080fd5b506106ed600480360360208110156106dd57600080fd5b50356001600160a01b03166117d2565b604080519115158252519081900360200190f35b34801561070d57600080fd5b5061063d6004803603604081101561072457600080fd5b506001600160a01b03813516906020013515156117f0565b34801561074857600080fd5b5061063d6004803603602081101561075f57600080fd5b5035611867565b34801561077257600080fd5b5061063d6004803603602081101561078957600080fd5b50356001600160a01b03166118c1565b3480156107a557600080fd5b506107c7600480360360208110156107bc57600080fd5b503561ffff16611987565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561081457600080fd5b5061063d6004803603604081101561082b57600080fd5b506001600160a01b038135169060200135611a5a565b34801561084d57600080fd5b5061063d6004803603602081101561086457600080fd5b50356001600160a01b0316611acf565b34801561088057600080fd5b506106ed610c50565b34801561089557600080fd5b5061063d600480360360208110156108ac57600080fd5b50356001600160a01b0316611b4b565b3480156108c857600080fd5b506108d1611c2d565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b34801561091557600080fd5b5061091e611c54565b604080516001600160a01b039092168252519081900360200190f35b34801561094657600080fd5b5061096e6004803603604081101561095d57600080fd5b508035906020013561ffff16611c63565b60408051918252519081900360200190f35b34801561098c57600080fd5b5061096e600480360360408110156109a357600080fd5b50803561ffff1690602001356001600160a01b0316611c8b565b3480156109c957600080fd5b5061096e600480360360408110156109e057600080fd5b50803561ffff1690602001356001600160a01b0316611cb9565b348015610a0657600080fd5b5061091e611ce7565b348015610a1b57600080fd5b5061063d60048036036040811015610a3257600080fd5b50803561ffff1690602001356001600160a01b0316611cf6565b348015610a5857600080fd5b5061063d60048036036060811015610a6f57600080fd5b506001600160a01b03813581169160208101359091169060400135611de2565b348015610a9b57600080fd5b50610abd60048036036020811015610ab257600080fd5b503561ffff16611f2e565b604080519485526020850193909352838301919091526060830152519081900360800190f35b348015610aef57600080fd5b5061063d60048036036020811015610b0657600080fd5b503563ffffffff16611f6a565b348015610b1f57600080fd5b50610b28611fb8565b6040805163ffffffff9092168252519081900360200190f35b348015610b4d57600080fd5b50610b7460048036036020811015610b6457600080fd5b50356001600160a01b0316611fcb565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610bab57600080fd5b5061063d60048036036020811015610bc257600080fd5b50356001600160a01b031661200f565b348015610bde57600080fd5b50610c0060048036036020811015610bf557600080fd5b503561ffff16612089565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610c3c578181015183820152602001610c24565b505050509050019250505060405180910390f35b600154600160a01b900460ff165b90565b610c6d60226000612895565b610c79602160006128b3565b60025460408051600160e01b63e2aafa2102815233600482015290516001600160a01b039092169163e2aafa2191602480820192602092909190829003018186803b158015610cc757600080fd5b505afa158015610cdb573d6000803e3d6000fd5b505050506040513d6020811015610cf157600080fd5b5051601f805460ff191691151591909117905560045461ffff166020553360005b600f8161ffff1610156110835760025460408051600160e11b63167801e10281526001600160a01b03858116600483015291516000939290921691632cf003c291602480820192602092909190829003018186803b158015610d7357600080fd5b505afa158015610d87573d6000803e3d6000fd5b505050506040513d6020811015610d9d57600080fd5b505190506001600160a01b038381169082161415610e5b5750602080546021805460018082019092557f3a6357012c1a3ae0a17d304c9920310382d968ebcc4b1771f41c6b304205b57060108204018054600f9092166002026101000a61ffff8181021990931692909416939093021790915560228054918201815560009081527f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e5109091018054306001600160a01b03199091161790559055611083565b60025460408051600160e21b633b23e57f0281526001600160a01b038481166004830152915161ffff861693929092169163ec8f95fc91602480820192602092909190829003018186803b158015610eb257600080fd5b505afa158015610ec6573d6000803e3d6000fd5b505050506040513d6020811015610edc57600080fd5b5051111561107957600e54600160401b900461ffff166000908152602f602090815260408083206001600160a01b038516845290915290205460ff16610f9457600e805461ffff600160401b9182900481166000908152602e602090815260408083208054600181810183559185528385200180546001600160a01b038a166001600160a01b031990911681179091559654959095049093168252602f815282822094825293909352909120805460ff191690911790555b610fca60058361ffff16600f8110610fa857fe5b60108104919091015460205491600f166002026101000a900461ffff166111f6565b6020556021600561ffff8416600f8110610fe057fe5b60108082049290920154835460018082018655600095865260208620948204909401805461ffff6002600f948516810261010090810a83810219909416959097160290950a9093049093169091021790556022805491820181559091527f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e5100180546001600160a01b0319166001600160a01b0383161790555b9150600101610d12565b5050565b60006110aa670de0b6b3a764000061059c6003548561162590919063ffffffff16565b90505b919050565b60008060006110d0600e60069054906101000a900461ffff166120fa565b600e54600160301b900461ffff166000908152602460205260408120549192509082906110fd90876111e3565b116111655761110b8561213e565b6111148561237f565b9050611120818661239c565b61112657fe5b600e54600160301b900461ffff166000908152602460205260409020548214156111585761115261252a565b61115857fe5b9250600091506111de9050565b600e54600160301b900461ffff1660009081526024602052604081205461118d9084906111f6565b905060006111a1878363ffffffff6111f616565b90506111ac8261213e565b6111b58261237f565b92506111c1838361239c565b6111c757fe5b6111cf61252a565b6111d557fe5b91945090925050505b915091565b818101828110156111f057fe5b92915050565b60008282111561120257fe5b50900390565b6003546000906110aa9061059c84670de0b6b3a764000063ffffffff61162516565b600080821161123557fe5b600082848161124057fe5b04905082848161124c57fe5b0681840201841461125957fe5b82848161126257fe5b04949350505050565b60115460009061128290600163ffffffff6111e316565b601155601454611298908363ffffffff6111e316565b601455336000908152602a60205260409020546112bb908363ffffffff6111e316565b336000818152602a60209081526040808320949094556002548451600160e01b63a9059cbb02815260048101949094526024840187905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b15801561132357600080fd5b505af1158015611337573d6000803e3d6000fd5b505050506040513d602081101561134d57600080fd5b505161135557fe5b60408051838152905133917f8cef011d049c0be8d14f16155c3f72d75dac8e53b3ef9f891271bf21e4f2ad59919081900360200190a2506001919050565b6012546000906113aa90600163ffffffff6111e316565b6012556015546113c0908363ffffffff6111e316565b601555336000908152602b60205260409020546113e3908363ffffffff6111e316565b336000818152602b60209081526040808320949094556002548451600160e01b63a9059cbb02815260048101949094526024840187905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b15801561144b57600080fd5b505af115801561145f573d6000803e3d6000fd5b505050506040513d602081101561147557600080fd5b505161147d57fe5b60408051838152905133917f9ad543bbf8e55db3c0825f34dfd2be0bb9c9fd5ad3dfb31fa72fed925d7706a2919081900360200190a2506001919050565b8060005b60215461ffff821610156115e957600061150f606461059c60218561ffff16815481106114e857fe5b600091825260209091206010820401548891600f166002026101000a900461ffff16611625565b9050600060228361ffff168154811061152457fe5b6000918252602090912001546017546001600160a01b039091169150611550908363ffffffff6111e316565b6017556001600160a01b0381166000908152602d602052604090205461157c908363ffffffff6111e316565b6001600160a01b0382166000908152602d60205260409020556115a5848363ffffffff6111f616565b6040519094506001600160a01b0382169083156108fc029084906000818181858888f193505050501580156115de573d6000803e3d6000fd5b5050506001016114bf565b50602054156110835761161e61160f606461059c6020548661162590919063ffffffff16565b601a549063ffffffff6111e316565b601a555050565b600082611634575060006111f0565b508181028183828161164257fe5b04146111f057fe5b6000546001600160a01b0316331461166157600080fd5b600154600160a01b900460ff168015611678575080155b156116c55760018054600160a01b60ff02191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a161172b565b600154600160a01b900460ff161580156116dc5750805b1561172b5760018054600160a01b60ff021916600160a01b1790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a15b50565b600354600e54600090819081908190819081908190819081908190819061ffff808216600160301b90920416111561177a57600e5461ffff8082169c5062010000909104169950611797565b600e5461ffff600160301b820481169c50600160401b9091041699505b600d549850601e549750600f549650601054955060115494506012549350601354925060145491506015549050909192939495969798999a9b565b6001600160a01b031660009081526023602052604090205460ff1690565b6000546001600160a01b0316331461180757600080fd5b6001600160a01b038216600081815260236020908152604091829020805460ff1916851515908117909155825190815291517f7309a1bee0ae3b528b2e9f11ab2abd82b54426646b40c5bef678f09554bd7c8f9281900390910190a25050565b3360009081526023602052604090205460ff1661188357600080fd5b600381905560408051828152905133917f4c93251017d1829354b31aa6cb37ab6ec1b2af6a073553f6073a7a3420cf7393919081900360200190a250565b6000546001600160a01b031633146118d857600080fd5b60006118e2612679565b90506001600160a01b0382166118f757600080fd5b601b5461190a908263ffffffff6111e316565b601b556040805182815290516001600160a01b038416917ffcd200d7cba84a55eb61ba9209300062477f6f08297653f398fa5489b65a1704919081900360200190a26040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611982573d6000803e3d6000fd5b505050565b600080600080600080600080600e60009054906101000a900461ffff1661ffff168961ffff1611156119d057506000965086955085945084935083925082915081905080611a4f565b6119d989612697565b61ffff8a1660009081526025602052604090205490985094506119fb896126c4565b9650611a0d878663ffffffff6111f616565b61ffff8a166000908152602460205260409020549096509150611a2f896120fa565b9350611a41848363ffffffff6111f616565b9250611a4c896126d8565b90505b919395975091939597565b6000546001600160a01b03163314611a7157600080fd5b6001600160a01b038216611a8457600080fd5b303181811015611a9357600080fd5b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015611ac9573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314611ae657600080fd5b6001600160a01b038116611af957600080fd5b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fd36aafedb017e43b79d3cf6aa1987d3fbb9fff33e1738c71dbf6b2abaadbded090600090a35050565b6000546001600160a01b03163314611b6257600080fd5b6000611b8d60195461054a601a5461054a60185461054a6017546016546111f690919063ffffffff16565b90506001600160a01b038216611ba257600080fd5b601954611bb5908263ffffffff6111e316565b6019556040805182815290516001600160a01b038416917fe4de4c8dc6ab2404c805abf5db58633d76fc08b6c8b2c0a34d3a47bfb73663bf919081900360200190a26040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611982573d6000803e3d6000fd5b601654601754601854601954601a54601b546000611c49612679565b905090919293949596565b6000546001600160a01b031690565b6000611c84611c7183612697565b61059c85620f424063ffffffff61162516565b9392505050565b61ffff821660009081526031602090815260408083206001600160a01b038516845290915290205492915050565b61ffff821660009081526030602090815260408083206001600160a01b038516845290915290205492915050565b6002546001600160a01b031681565b6000546001600160a01b03163314611d0d57600080fd5b6000611d1883612710565b90506001600160a01b038216611d2d57600080fd5b61ffff8316600090815260286020526040902054611d51908263ffffffff6111e316565b61ffff841660008181526028602090815260409182902093909355805191825291810183905281516001600160a01b038516927f69ccd39c099e91512b4f9c8d1664c05f38430681d4d594a1deec4ace4e7a6e0d928290030190a26040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611ac9573d6000803e3d6000fd5b6000546001600160a01b03163314611df957600080fd5b826001600160a01b038316611e0d57600080fd5b60408051600160e01b6370a0823102815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015611e5a57600080fd5b505afa158015611e6e573d6000803e3d6000fd5b505050506040513d6020811015611e8457600080fd5b5051905082811015611e9557600080fd5b816001600160a01b031663a9059cbb85856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ef557600080fd5b505af1158015611f09573d6000803e3d6000fd5b505050506040513d6020811015611f1f57600080fd5b5051611f2757fe5b5050505050565b61ffff811660009081526026602090815260408083205460278352818420546028909352908320549092611f6185612710565b90509193509193565b6000546001600160a01b03163314611f8157600080fd5b6002805463ffffffff909216600160a01b0277ffffffff000000000000000000000000000000000000000019909216919091179055565b600254600160a01b900463ffffffff1690565b6001600160a01b0316600090815260296020908152604080832054602a835281842054602b845282852054602c855283862054602d90955292909420549094919291565b6000546001600160a01b0316331461202657600080fd5b6001600160a01b03811661203957600080fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61ffff81166000908152602e60209081526040918290208054835181840281018401909452808452606093928301828280156120ee57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116120d0575b50505050509050919050565b6000806121286121198461ffff16600b5461162590919063ffffffff16565b600a549063ffffffff6111e316565b9050600c548111156110aa575050600c546110ad565b600061214982611208565b905060006121568361273e565b600e54600160401b900461ffff16600090815260306020908152604080832033845290915290205490915061218b90846111e3565b600e805461ffff600160401b909104811660009081526030602090815260408083203384528252808320959095559254600160301b90049091168152602490915220546121de908463ffffffff6111e316565b600e805461ffff600160301b90910481166000908152602460209081526040808320959095559254600160401b9004909116815260269091522054612229908363ffffffff6111e316565b600e805461ffff600160401b91829004811660009081526026602090815260408083209690965593549290920416815260279091522054612270908263ffffffff6111e316565b600e54600160401b900461ffff1660009081526027602052604090205560185461229a90826111e3565b601855601f5460ff16156119825760005b60215461ffff82161015611ac957600e5461ffff600160401b909104811660009081526031602052604081206022805461232094899492919087169081106122ef57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020549063ffffffff6111e316565b600e5461ffff600160401b90910481166000908152603160205260408120602280549193909190861690811061235257fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020556001016122ab565b600d546000906110aa9061059c84620f424063ffffffff61162516565b6010546000906123b390600163ffffffff6111e316565b6010556013546123c9908463ffffffff6111e316565b601355600e54600160301b900461ffff166000908152602560205260409020546123f390846111e3565b600e54600160301b900461ffff1660009081526025602090815260408083209390935533825260299052205461242990846111e3565b336000818152602960209081526040808320949094556002548451600160e01b63a9059cbb02815260048101949094526024840188905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b15801561249157600080fd5b505af11580156124a5573d6000803e3d6000fd5b505050506040513d60208110156124bb57600080fd5b50516124c357fe5b600e546003546040805161ffff600160301b9094049390931683526020830186905282810191909152606082018490525133917f6157a4b729216e44c36dedcad906c31c6808c4c80ea68ecddf83aa5c0066fa0b919081900360800190a250600192915050565b600e5460408051600160301b90920461ffff1682525160009133917feb233b5b7ba017d2651d779b7619d1a70758bcd13049019e0dd121077a1e1a2f916020908290030190a2600e5461258990600160301b900461ffff166001612765565b600e805467ffff0000000000001916600160301b61ffff938416810291909117918290556125b992910416612697565b600d55600e546125d390600160301b900461ffff166126d8565b601e55600e546000906125f090600160301b900461ffff16612779565b600e5490915061ffff808316600160401b90920416101561267157600e546040805161ffff600160401b9093049290921682525133917f7d2797fdf1b9f35ccf52e7b904a608332c1db1d8c7f2ff7f28ea7f2d6f87996c919081900360200190a2600e805469ffff00000000000000001916600160401b61ffff8416021790555b600191505090565b6000612692601b54601a546111f690919063ffffffff16565b905090565b60006110aa6126b58361ffff1660095461162590919063ffffffff16565b6008549063ffffffff6111e316565b60006110aa6126d2836120fa565b83611c63565b600e54601d546000916110aa916127019161ffff9081169161059c91871663ffffffff61162516565b601c549063ffffffff6111e316565b61ffff811660009081526028602090815260408083205460279092528220546110aa9163ffffffff6111f616565b60006110aa6127606305f5e10061059c601e548661162590919063ffffffff16565b611208565b81810161ffff80841690821610156111f057fe5b600061ffff82161561280057600e546000906127aa9061ffff8581169164010000000090041663ffffffff61280816565b600e549091506000906127d29061ffff8681169164010000000090041663ffffffff61286c16565b61ffff1611156127f9576127f161ffff8216600163ffffffff61276516565b9150506110ad565b90506110ad565b506001919050565b6000808261ffff161161281757fe5b60008261ffff168461ffff168161282a57fe5b0461ffff1690508261ffff168461ffff168161284257fe5b0661ffff16818461ffff1602018461ffff161461285b57fe5b8261ffff168461ffff168161126257fe5b600061ffff821661287c57600080fd5b8161ffff168361ffff168161288d57fe5b069392505050565b508054600082559060005260206000209081019061172b91906128d4565b50805460008255600f01601090049060005260206000209081019061172b91905b610c5e91905b808211156128ee57600081556001016128da565b509056fe417564697420455448207072696365206d7573742062652067726561746572207468616e207a65726f2e574553494f4e205075626c69632d53616c6520686173206e6f742073746172746564207965742ea165627a7a723058208b4d451d67920d625330bb0825b0ff3928593b8100fedbe3b6d12957c0883d780029

Deployed Bytecode Sourcemap

7412:25689:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18874:7;;-1:-1:-1;;;18874:7:0;;;;18862:9;:19;18854:28;;;;;;19005:15;;-1:-1:-1;;;19005:15:0;;;;:19;;;;:44;;-1:-1:-1;19034:15:0;;-1:-1:-1;;;19034:15:0;;;;19028:3;:21;19005:44;18997:96;;;;-1:-1:-1;;;;;18997:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19126:1;19112:11;;:15;19104:70;;;;-1:-1:-1;;;;;19104:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19194:8;:6;:8::i;:::-;19193:9;19185:51;;;;;-1:-1:-1;;;;;19185:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19265:9;;;;;;-1:-1:-1;;;19255:6:0;;;;:19;;19247:58;;;;;-1:-1:-1;;;;;19247:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24518:7;;;;24505:9;:20;;24497:29;;;;;;24558:7;;;;;;;24545:9;:20;;24537:29;;;;;;24616:23;:21;:23::i;:::-;24650:19;24672:18;24680:9;24672:7;:18::i;:::-;24650:40;-1:-1:-1;24650:40:0;24701:19;;;;24894:252;24913:6;;;;24901:9;:18;:37;;;;;24937:1;24923:11;:15;24901:37;:60;;;;-1:-1:-1;24952:9:0;;;;;;-1:-1:-1;;;24942:6:0;;;;:19;;24901:60;24894:252;;;24978:24;25051:15;25054:11;25051:2;:15::i;:::-;25017:49;-1:-1:-1;25017:49:0;-1:-1:-1;25098:36:0;:14;25017:49;25098:36;:18;:36;:::i;:::-;25081:53;;24894:252;;;;25187:28;:11;25203;25187:28;:15;:28;:::i;:::-;25175:40;;25238:18;25246:9;25238:7;:18::i;:::-;25308:9;;25226:30;;-1:-1:-1;;;;25308:9:0;;;;25295;:22;25291:150;;25350:22;:14;25369:2;25350:22;:18;:22;:::i;:::-;25334:38;;25394:34;25414:13;25394:19;:34::i;:::-;25387:42;;;;25523:13;;;;:35;;;;;25557:1;25540:14;:18;25523:35;25519:264;;;25620:60;25646:33;:14;25665:13;25646:33;:18;:33;:::i;:::-;25620:25;:60::i;:::-;25613:68;;;;25732:39;25761:9;25732:28;:39::i;:::-;25835:15;;25831:226;;25867:19;25889:20;25897:11;25889:7;:20::i;:::-;25867:42;-1:-1:-1;25938:26:0;:9;25867:42;25938:26;:13;:26;:::i;:::-;26013:32;;25926:38;;-1:-1:-1;26013:10:0;;:32;;;;;26033:11;;26013:32;;;;26033:11;26013:10;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26013:32:0;25831:226;;26093:13;;26089:210;;26130:4;;:11;;26139:1;26130:11;:8;:11;:::i;:::-;26123:4;:18;26167:8;;:23;;26180:9;26167:23;:12;:23;:::i;:::-;26156:8;:34;26261:10;26240:32;;;;:20;:32;;;;;;:47;;26277:9;26240:47;:36;:47;:::i;:::-;26226:10;26205:32;;;;:20;:32;;;;;:82;26089:210;26374:10;;26332:17;;26374:10;;;;;;-1:-1:-1;;;26364:7:0;;;;:20;26360:280;;;26411:78;26480:8;;26411:64;26463:11;;26411:47;26445:12;;26411:29;26424:15;;26411:8;;:12;;:29;;;;:::i;:::-;:33;:47;:33;:47;:::i;:78::-;26399:90;;26360:280;;;26530:110;26629:10;26530:94;26613:10;26530:78;26599:8;;26530:64;26582:11;;26530:47;26564:12;;26530:29;26543:15;;26530:8;;:12;;:29;;;;:::i;:78::-;:82;:94;:82;:94;:::i;:::-;:98;:110;:98;:110;:::i;:::-;26518:122;;26360:280;26664:8;;:23;;26677:9;26664:23;:12;:23;:::i;:::-;26653:8;:34;26698:9;;:29;;-1:-1:-1;;;;;26698:9:0;;;;:29;;;;;26717:9;;26698;:29;:9;:29;26717:9;26698;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;19316:1:0;;;;;;;7412:25689;6388:281;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6388:281:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6388:281:0;;;;:::i;:::-;;16602:1387;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16602:1387:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13218:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13218:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13218:125:0;-1:-1:-1;;;;;13218:125:0;;:::i;:::-;;;;;;;;;;;;;;;;;;13413:194;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13413:194:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13413:194:0;;;;;;;;;;:::i;12984:164::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12984:164:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12984:164:0;;:::i;15828:319::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15828:319:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15828:319:0;-1:-1:-1;;;;;15828:319:0;;:::i;20452:1197::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20452:1197:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20452:1197:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5355:241;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5355:241:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5355:241:0;;;;;;;;:::i;4460:272::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4460:272:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4460:272:0;-1:-1:-1;;;;;4460:272:0;;:::i;6020:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6020:78:0;;;:::i;16205:350::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16205:350:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16205:350:0;-1:-1:-1;;;;;16205:350:0;;:::i;18033:721::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18033:721:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3726:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3726:79:0;;;:::i;:::-;;;;-1:-1:-1;;;;;3726:79:0;;;;;;;;;;;;;;14456:180;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14456:180:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14456:180:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24027:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24027:166:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24027:166:0;;;;;;;;-1:-1:-1;;;;;24027:166:0;;:::i;23764:178::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23764:178:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23764:178:0;;;;;;;;-1:-1:-1;;;;;23764:178:0;;:::i;7552:75::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7552:75:0;;;:::i;15161:423::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15161:423:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15161:423:0;;;;;;;;-1:-1:-1;;;;;15161:423:0;;:::i;4962:339::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4962:339:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4962:339:0;;;;;;;;;;;;;;;;;:::i;22000:659::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22000:659:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22000:659:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12634:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12634:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12634:110:0;;;;:::i;12478:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12478:96:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22713:741;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22713:741:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22713:741:0;-1:-1:-1;;;;;22713:741:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4156:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4156:248:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4156:248:0;-1:-1:-1;;;;;4156:248:0;;:::i;23524:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23524:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23524:158:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;23524:158:0;;;;;;;;;;;;;;;;;6020:78;6083:7;;-1:-1:-1;;;6083:7:0;;;;6020:78;;:::o;26852:1153::-;26904:18;26911:11;;26904:18;:::i;:::-;26933:16;26940:9;;26933:16;:::i;:::-;26978:6;;:30;;;-1:-1:-1;;;;;26978:30:0;;26997:10;26978:30;;;;;;-1:-1:-1;;;;;26978:6:0;;;;:18;;:30;;;;;;;;;;;;;;;:6;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;26978:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26978:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26978:30:0;26962:13;:46;;-1:-1:-1;;26962:46:0;;;;;;;;;;27031:29;;;;26978:30;27019:41;27092:10;-1:-1:-1;27113:885:0;27135:32;27131:1;:36;;;27113:885;;;27212:6;;:25;;;-1:-1:-1;;;;;27212:25:0;;-1:-1:-1;;;;;27212:25:0;;;;;;;;;27189:20;;27212:6;;;;;:15;;:25;;;;;;;;;;;;;;;:6;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;27212:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27212:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27212:25:0;;-1:-1:-1;;;;;;27258:24:0;;;;;;;27254:204;;;-1:-1:-1;27325:9:0;;;27303;27:10:-1;;39:1;23:18;;;45:23;;;27303:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27355:11;27:10:-1;;23:18;;;45:23;;-1:-1;27355:31:0;;;;;;;;;27380:4;-1:-1:-1;;;;;;27355:31:0;;;;;;27405:13;;27437:5;;27254:204;27478:6;;:29;;;-1:-1:-1;;;;;27478:29:0;;-1:-1:-1;;;;;27478:29:0;;;;;;;;;:33;;;;:6;;;;;:15;;:29;;;;;;;;;;;;;;;:6;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;27478:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27478:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27478:29:0;:33;27474:473;;;27558:7;;-1:-1:-1;;;27558:7:0;;;;27537:29;;;;:20;:29;;;;;;;;-1:-1:-1;;;;;27537:43:0;;;;;;;;;;;;27532:212;;27624:7;;;;-1:-1:-1;;;27624:7:0;;;;;;27605:27;;;;:18;:27;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;27605:46:0;;;;;;;;;-1:-1:-1;;;;;27605:46:0;;-1:-1:-1;;;;;;27605:46:0;;;;;;;;27695:7;;;;;;;;;27674:29;;:20;:29;;;;;:43;;;;;;;;;;:50;;-1:-1:-1;;27674:50:0;;;;;;27532:212;27776:43;27790:25;27816:1;27790:28;;;;;;;;;;;;;;;;;27776:9;;;27790:28;;;;;;;;;;27776:13;:43::i;:::-;27764:9;:55;27838:9;27853:25;:28;;;;;;;;;;;;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;27838:44:0;;;;;;;;;;;;;;27853:28;;;27838:44;;;;;27853:28;27838:44;;;;;;;;;;27853:28;;;;;;;;;;;;;;27838:44;;;;;;27901:11;27:10:-1;;23:18;;;45:23;;27901:30:0;;;;;;;-1:-1:-1;;;;;;27901:30:0;-1:-1:-1;;;;;27901:30:0;;;;;27474:473;27974:12;-1:-1:-1;27169:3:0;;27113:885;;;;26852:1153;:::o;13909:126::-;13964:7;13991:36;14019:7;13991:23;14002:11;;13991:6;:10;;:23;;;;:::i;:36::-;13984:43;;13909:126;;;;:::o;28058:1020::-;28106:7;28115;28135:21;28159:19;28171:6;;;;;;;;;;;28159:11;:19::i;:::-;28263:6;;-1:-1:-1;;;28263:6:0;;;;28189:22;28249:21;;;:13;:21;;;;;;28135:43;;-1:-1:-1;28189:22:0;28135:43;;28249:36;;28275:9;28249:25;:36::i;:::-;:53;28245:444;;28319:18;28327:9;28319:7;:18::i;:::-;28371:21;28382:9;28371:10;:21::i;:::-;28354:38;;28414:47;28435:14;28451:9;28414:20;:47::i;:::-;28407:55;;;;28571:6;;-1:-1:-1;;;28571:6:0;;;;28557:21;;;;:13;:21;;;;;;28540:38;;28536:99;;;28606:12;:10;:12::i;:::-;28599:20;;;;28659:14;-1:-1:-1;28675:1:0;;-1:-1:-1;28651:26:0;;-1:-1:-1;28651:26:0;28245:444;28777:6;;-1:-1:-1;;;28777:6:0;;;;28725:17;28763:21;;;:13;:21;;;;;;28745:40;;:13;;:17;:40::i;:::-;28725:60;-1:-1:-1;28796:19:0;28818:24;:9;28725:60;28818:24;:13;:24;:::i;:::-;28796:46;;28855:18;28863:9;28855:7;:18::i;:::-;28903:21;28914:9;28903:10;:21::i;:::-;28886:38;;28942:47;28963:14;28979:9;28942:20;:47::i;:::-;28935:55;;;;29008:12;:10;:12::i;:::-;29001:20;;;;29042:14;;-1:-1:-1;29058:11:0;;-1:-1:-1;;;28058:1020:0;;;;:::o;278:141::-;362:5;;;385:6;;;;378:14;;;;278:141;;;;:::o;557:123::-;615:7;647:1;642;:6;;635:14;;;;-1:-1:-1;667:5:0;;;557:123::o;14085:126::-;14191:11;;14140:7;;14167:36;;:19;:6;14178:7;14167:19;:10;:19;:::i;1119:187::-;1177:7;1208:1;1204;:5;1197:13;;;;1221:9;1237:1;1233;:5;;;;;;1221:17;;1273:1;1269;:5;;;;;;1265:1;1261;:5;:13;1256:1;:18;1249:26;;;;1297:1;1293;:5;;;;;;;1119:187;-1:-1:-1;;;;1119:187:0:o;30850:402::-;30947:15;;30912:4;;30947:22;;30967:1;30947:22;:19;:22;:::i;:::-;30929:15;:40;30997:12;;:24;;31014:6;30997:24;:16;:24;:::i;:::-;30982:12;:39;31086:10;31066:31;;;;:19;:31;;;;;;:43;;31102:6;31066:43;:35;:43;:::i;:::-;31052:10;31032:31;;;;:19;:31;;;;;;;;:77;;;;31129:6;;:35;;-1:-1:-1;;;;;31129:35:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31129:6:0;;;;:15;;:35;;;;;;;;;;;;;:6;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;31129:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31129:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31129:35:0;31122:43;;;;31181:41;;;;;;;;31203:10;;31181:41;;;;;;;;;;-1:-1:-1;31240:4:0;30850:402;;;:::o;31320:440::-;31427:19;;31388:4;;31427:26;;31451:1;31427:26;:23;:26;:::i;:::-;31405:19;:48;31485:16;;:28;;31506:6;31485:28;:20;:28;:::i;:::-;31466:16;:47;31590:10;31564:37;;;;:25;:37;;;;;;:49;;31606:6;31564:49;:41;:49;:::i;:::-;31550:10;31524:37;;;;:25;:37;;;;;;;;:89;;;;31633:6;;:35;;-1:-1:-1;;;;;31633:35:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31633:6:0;;;;:15;;:35;;;;;;;;;;;;;:6;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;31633:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31633:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31633:35:0;31626:43;;;;31685:45;;;;;;;;31711:10;;31685:45;;;;;;;;;;-1:-1:-1;31748:4:0;31320:440;;;:::o;32381:717::-;32479:9;32457:19;32499:483;32522:9;:16;32518:20;;;;32499:483;;;32560:19;32582:36;32614:3;32582:27;32596:9;32606:1;32596:12;;;;;;;;;;;;;;;;;;;;;;;32582:9;;32596:12;;;;;;;;;;32582:13;:27::i;:36::-;32560:58;;32633:26;32678:11;32690:1;32678:14;;;;;;;;;;;;;;;;;;;;32729:15;;-1:-1:-1;;;;;32678:14:0;;;;-1:-1:-1;32729:32:0;;32749:11;32729:32;:19;:32;:::i;:::-;32711:15;:50;-1:-1:-1;;;;;32813:34:0;;;;;;:22;:34;;;;;;:51;;32852:11;32813:51;:38;:51;:::i;:::-;-1:-1:-1;;;;;32776:34:0;;;;;;:22;:34;;;;;:88;32893:28;:11;32909;32893:28;:15;:28;:::i;:::-;32938:32;;32879:42;;-1:-1:-1;;;;;;32938:19:0;;;:32;;;;;32958:11;;32938:32;;;;32958:11;32938:19;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;32540:3:0;;32499:483;;;-1:-1:-1;32998:9:0;;:13;32994:96;;33040:50;33056:33;33085:3;33056:24;33070:9;;33056;:13;;:24;;;;:::i;:33::-;33040:11;;;:50;:15;:50;:::i;:::-;33026:11;:64;32381:717;;:::o;774:202::-;832:9;858:6;854:47;;-1:-1:-1;888:1:0;881:8;;854:47;-1:-1:-1;915:5:0;;;919:1;915;:5;:1;938:5;;;;;:10;931:18;;;6388:281;3952:6;;-1:-1:-1;;;;;3952:6:0;3938:10;:20;3930:29;;;;;;6453:7;;-1:-1:-1;;;6453:7:0;;;;:17;;;;;6465:5;6464:6;6453:17;6449:213;;;6487:7;:15;;-1:-1:-1;;;;;;6487:15:0;;;6522:20;;;6531:10;6522:20;;;;;;;;;;;;;6449:213;;;6565:7;;-1:-1:-1;;;6565:7:0;;;;6564:8;:17;;;;;6576:5;6564:17;6560:102;;;6608:4;6598:14;;-1:-1:-1;;;;;;6598:14:0;-1:-1:-1;;;6598:14:0;;;6632:18;;;6639:10;6632:18;;;;;;;;;;;;;6560:102;6388:281;:::o;16602:1387::-;17414:11;;17451:9;;16641:23;;;;;;;;;;;;;;;;;;;;;;17451:9;;;;-1:-1:-1;;;17442:6:0;;;;:18;17438:180;;;17485:9;;;;;;;-1:-1:-1;17518:10:0;;;;;;-1:-1:-1;17438:180:0;;;17569:6;;;-1:-1:-1;;;17569:6:0;;;;;-1:-1:-1;;;;17599:7:0;;;;;-1:-1:-1;17438:180:0;17647:15;;17630:32;;17696:14;;17673:37;;17729:4;;17723:10;;17756;;17744:22;;17794:15;;17777:32;;17841:19;;17820:40;;17886:13;;17871:28;;17924:12;;17910:26;;17965:16;;17947:34;;16602:1387;;;;;;;;;;;;:::o;13218:125::-;-1:-1:-1;;;;;13307:28:0;13283:4;13307:28;;;:19;:28;;;;;;;;;13218:125::o;13413:194::-;3952:6;;-1:-1:-1;;;;;3952:6:0;3938:10;:20;3930:29;;;;;;-1:-1:-1;;;;;13502:28:0;;;;;;:19;:28;;;;;;;;;:36;;-1:-1:-1;;13502:36:0;;;;;;;;;;13554:45;;;;;;;;;;;;;;;;;13413:194;;:::o;12984:164::-;12890:10;12870:31;;;;:19;:31;;;;;;;;12862:40;;;;;;13064:11;:19;;;13099:41;;;;;;;;13129:10;;13099:41;;;;;;;;;;12984:164;:::o;15828:319::-;3952:6;;-1:-1:-1;;;;;3952:6:0;3938:10;:20;3930:29;;;;;;15903:19;15925:15;:13;:15::i;:::-;15903:37;-1:-1:-1;;;;;;15959:16:0;;15951:25;;;;;;16013:21;;:38;;16039:11;16013:38;:25;:38;:::i;:::-;15989:21;:62;16067:37;;;;;;;;-1:-1:-1;;;;;16067:37:0;;;;;;;;;;;;;16115:24;;-1:-1:-1;;;;;16115:11:0;;;:24;;;;;16127:11;;16115:24;;;;16127:11;16115;:24;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16115:24:0;3970:1;15828:319;:::o;20452:1197::-;20513:22;20603:17;20688:20;20776:18;20862:14;20944:17;21029:15;21112:24;21166:9;;;;;;;;;;;21153:22;;:10;:22;;;21149:86;;;-1:-1:-1;21200:1:0;;-1:-1:-1;21200:1:0;;-1:-1:-1;21200:1:0;;-1:-1:-1;21200:1:0;;-1:-1:-1;21200:1:0;;-1:-1:-1;21200:1:0;;-1:-1:-1;21200:1:0;;-1:-1:-1;21200:1:0;21192:31;;21149:86;21264:31;21284:10;21264:19;:31::i;:::-;21321:30;;;;;;;:18;:30;;;;;;21247:48;;-1:-1:-1;21321:30:0;-1:-1:-1;21374:26:0;21340:10;21374:14;:26::i;:::-;21362:38;-1:-1:-1;21426:25:0;21362:38;21440:10;21426:25;:13;:25;:::i;:::-;21474;;;;;;;:13;:25;;;;;;21411:40;;-1:-1:-1;21474:25:0;-1:-1:-1;21519:23:0;21488:10;21519:11;:23::i;:::-;21510:32;-1:-1:-1;21565:19:0;21510:32;21576:7;21565:19;:10;:19;:::i;:::-;21553:31;;21616:25;21630:10;21616:13;:25::i;:::-;21597:44;;20452:1197;;;;;;;;;;:::o;5355:241::-;3952:6;;-1:-1:-1;;;;;3952:6:0;3938:10;:20;3930:29;;;;;;-1:-1:-1;;;;;5452:16:0;;5444:25;;;;;;5506:4;5498:21;5538:17;;;;5530:26;;;;;;5569:19;;-1:-1:-1;;;;;5569:11:0;;;:19;;;;;5581:6;;5569:19;;;;5581:6;5569:11;:19;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5569:19:0;3970:1;5355:241;;:::o;4460:272::-;3952:6;;-1:-1:-1;;;;;3952:6:0;3938:10;:20;3930:29;;;;;;-1:-1:-1;;;;;4551:25:0;;4543:34;;;;;;4617:9;;;-1:-1:-1;;;;;4637:23:0;;;-1:-1:-1;;;;;;4637:23:0;;;;;;;4676:48;;4617:9;;;4637:23;4617:9;;4676:48;;4588:26;;4676:48;3970:1;4460:272;:::o;16205:350::-;3952:6;;-1:-1:-1;;;;;3952:6:0;3938:10;:20;3930:29;;;;;;16277:19;16299:78;16368:8;;16299:64;16351:11;;16299:47;16333:12;;16299:29;16312:15;;16299:8;;:12;;:29;;;;:::i;:78::-;16277:100;-1:-1:-1;;;;;;16396:16:0;;16388:25;;;;;;16437:8;;:25;;16450:11;16437:25;:12;:25;:::i;:::-;16426:8;:36;16478:34;;;;;;;;-1:-1:-1;;;;;16478:34:0;;;;;;;;;;;;;16523:24;;-1:-1:-1;;;;;16523:11:0;;;:24;;;;;16535:11;;16523:24;;;;16535:11;16523;:24;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;18033:721:0;18489:8;;18530:15;;18570:12;;18603:8;;18635:11;;18680:21;;18068:15;18731;:13;:15::i;:::-;18712:34;;18033:721;;;;;;;:::o;3726:79::-;3764:7;3791:6;-1:-1:-1;;;;;3791:6:0;3726:79;:::o;14456:180::-;14542:7;14569:59;14596:31;14616:10;14596:19;:31::i;:::-;14569:22;:9;14583:7;14569:22;:13;:22;:::i;:59::-;14562:66;14456:180;-1:-1:-1;;;14456:180:0:o;24027:166::-;24142:34;;;24115:7;24142:34;;;:20;:34;;;;;;;;-1:-1:-1;;;;;24142:43:0;;;;;;;;;;24027:166;;;;:::o;23764:178::-;23885:40;;;23858:7;23885:40;;;:26;:40;;;;;;;;-1:-1:-1;;;;;23885:49:0;;;;;;;;;;23764:178;;;;:::o;7552:75::-;;;-1:-1:-1;;;;;7552:75:0;;:::o;15161:423::-;3952:6;;-1:-1:-1;;;;;3952:6:0;3938:10;:20;3930:29;;;;;;15258:19;15280:34;15301:12;15280:20;:34::i;:::-;15258:56;-1:-1:-1;;;;;;15333:16:0;;15325:25;;;;;;15408:42;;;;;;;:28;:42;;;;;;:59;;15455:11;15408:59;:46;:59;:::i;:::-;15363:42;;;;;;;:28;:42;;;;;;;;;:104;;;;15483:58;;;;;;;;;;;;;-1:-1:-1;;;;;15483:58:0;;;;;;;;;;;15552:24;;-1:-1:-1;;;;;15552:11:0;;;:24;;;;;15564:11;;15552:24;;;;15564:11;15552;:24;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;4962:339:0;3952:6;;-1:-1:-1;;;;;3952:6:0;3938:10;:20;3930:29;;;;;;5090:9;-1:-1:-1;;;;;5119:22:0;;5111:31;;;;;;5171;;;-1:-1:-1;;;;;5171:31:0;;5196:4;5171:31;;;;;;5153:15;;-1:-1:-1;;;;;5171:16:0;;;;;:31;;;;;;;;;;;;;;;:16;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;5171:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5171:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5171:31:0;;-1:-1:-1;5221:17:0;;;;5213:26;;;;;;5259:6;-1:-1:-1;;;;;5259:15:0;;5275:8;5285:6;5259:33;;;;;;;;;;;;;-1:-1:-1;;;;;5259:33:0;-1:-1:-1;;;;;5259:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5259:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5259:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5259:33:0;5252:41;;;;3970:1;;4962:339;;;:::o;22000:659::-;22424:28;;;22073:15;22424:28;;;:14;:28;;;;;;;;;22477:18;:32;;;;;;22544:28;:42;;;;;;;22424:28;;22617:34;22439:12;22617:20;:34::i;:::-;22597:54;;22000:659;;;;;:::o;12634:110::-;3952:6;;-1:-1:-1;;;;;3952:6:0;3938:10;:20;3930:29;;;;;;12709:15;:27;;;;;;-1:-1:-1;;;12709:27:0;-1:-1:-1;;12709:27:0;;;;;;;;;12634:110::o;12478:96::-;12551:15;;-1:-1:-1;;;12551:15:0;;;;;12478:96::o;22713:741::-;-1:-1:-1;;;;;23180:29:0;22773:20;23180:29;;;:20;:29;;;;;;;;;23234:19;:28;;;;;;23293:25;:34;;;;;;23353:20;:29;;;;;;23415:22;:31;;;;;;;;23180:29;;23293:34;;23353:29;22713:741::o;4156:248::-;3952:6;;-1:-1:-1;;;;;3952:6:0;3938:10;:20;3930:29;;;;;;-1:-1:-1;;;;;4239:22:0;;4231:31;;;;;;4273:23;4299:6;;-1:-1:-1;;;;;4316:17:0;;;-1:-1:-1;;;;;;4316:17:0;;;;;;4349:47;;4299:6;;;;;;;4349:47;;4273:23;4349:47;3970:1;4156:248;:::o;23524:158::-;23642:32;;;;;;;:18;:32;;;;;;;;;23631:43;;;;;;;;;;;;;;;;;23593:25;;23631:43;;;23642:32;23631:43;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23631:43:0;;;;;;;;;;;;;;;;;;;;;;;23524:158;;;:::o;19864:293::-;19926:7;19946:16;19965:59;19989:34;20012:10;19989:34;;:18;;:22;;:34;;;;:::i;:::-;19965:19;;;:59;:23;:59;:::i;:::-;19946:78;;20052:17;;20041:8;:28;20037:85;;;-1:-1:-1;;20093:17:0;;20086:24;;29129:1069;29184:17;29204:18;29212:9;29204:7;:18::i;:::-;29184:38;;29233:21;29257:26;29273:9;29257:15;:26::i;:::-;29373:7;;-1:-1:-1;;;29373:7:0;;;;29346:35;;;;:26;:35;;;;;;;;29382:10;29346:47;;;;;;;;29233:50;;-1:-1:-1;29346:62:0;;29398:9;29346:51;:62::i;:::-;29323:7;;;;-1:-1:-1;;;29323:7:0;;;;;29296:35;;;;:26;:35;;;;;;;;29332:10;29296:47;;;;;;;:112;;;;29503:6;;-1:-1:-1;;;29503:6:0;;;;;29489:21;;:13;:21;;;;;:36;;29515:9;29489:36;:25;:36;:::i;:::-;29479:6;;;;-1:-1:-1;;;29479:6:0;;;;;29465:21;;;;:13;:21;;;;;;;;:60;;;;29617:7;;-1:-1:-1;;;29617:7:0;;;;;29602:23;;:14;:23;;;;;:38;;29630:9;29602:38;:27;:38;:::i;:::-;29591:7;;;;-1:-1:-1;;;29591:7:0;;;;;;29576:23;;;;:14;:23;;;;;;;;:64;;;;29737:7;;;;;;;29718:27;;:18;:27;;;;;:46;;29750:13;29718:46;:31;:46;:::i;:::-;29707:7;;-1:-1:-1;;;29707:7:0;;;;29688:27;;;;:18;:27;;;;;:76;29820:12;;:31;;29837:13;29820:16;:31::i;:::-;29805:12;:46;29961:13;;;;29957:234;;;29996:8;29991:189;30014:9;:16;30010:20;;;;29991:189;;;30125:7;;;-1:-1:-1;;;30125:7:0;;;;;30104:29;;;;:20;:29;;;;;30134:11;:14;;30104:60;;30154:9;;30104:29;30134:11;:14;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30134:14:0;30104:45;;;;;;;;;;;;;;:60;:49;:60;:::i;:::-;30077:7;;;-1:-1:-1;;;30077:7:0;;;;;30056:29;;;;:20;:29;;;;;30086:11;:14;;30056:29;;30086:11;;:14;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30086:14:0;30056:45;;;;;;;;;;;;:108;30086:14;30032:3;29991:189;;14264:139;14379:15;;14325:7;;14352:43;;:22;:9;14366:7;14352:22;:13;:22;:::i;30261:527::-;30373:10;;30343:4;;30373:17;;30388:1;30373:17;:14;:17;:::i;:::-;30360:10;:30;30419:13;;:25;;30437:6;30419:25;:17;:25;:::i;:::-;30403:13;:41;30503:6;;-1:-1:-1;;;30503:6:0;;;;30484:26;;;;:18;:26;;;;;;:38;;30515:6;30484:30;:38::i;:::-;30474:6;;-1:-1:-1;;;30474:6:0;;;;30455:26;;;;:18;:26;;;;;;;;:67;;;;30589:10;30568:32;;:20;:32;;;;:44;;30605:6;30568:36;:44::i;:::-;30554:10;30533:32;;;;:20;:32;;;;;;;;:79;;;;30632:6;;:35;;-1:-1:-1;;;;;30632:35:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30632:6:0;;;;:15;;:35;;;;;;;;;;;;;:6;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;30632:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30632:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30632:35:0;30625:43;;;;30707:6;;30735:11;;30684:74;;;30707:6;-1:-1:-1;;;30707:6:0;;;;;;;30684:74;;;;;;;;;;;;;;;;;;;;;;30715:10;;30684:74;;;;;;;;;;-1:-1:-1;30776:4:0;30261:527;;;;:::o;31815:494::-;31888:6;;31876:31;;;-1:-1:-1;;;31888:6:0;;;;;31876:31;;;31854:4;;31896:10;;31876:31;;;;;;;;;;31927:6;;:13;;-1:-1:-1;;;31927:6:0;;;;31938:1;31927:10;:13::i;:::-;31918:6;:22;;-1:-1:-1;;31918:22:0;-1:-1:-1;;;31918:22:0;;;;;;;;;;;;;;31969:27;;31989:6;;;31969:19;:27::i;:::-;31951:15;:45;32038:6;;32024:21;;-1:-1:-1;;;32038:6:0;;;;32024:13;:21::i;:::-;32007:14;:38;32126:6;;32091:21;;32115:18;;-1:-1:-1;;;32126:6:0;;;;32115:10;:18::i;:::-;32148:7;;32091:42;;-1:-1:-1;32148:24:0;;;;-1:-1:-1;;;32148:7:0;;;;:24;32144:134;;;32207:7;;32194:33;;;32207:7;-1:-1:-1;;;32207:7:0;;;;;;;32194:33;;;32216:10;;32194:33;;;;;;;;;;32242:7;:24;;-1:-1:-1;;32242:24:0;-1:-1:-1;;;32242:24:0;;;;;;;32144:134;32297:4;32290:11;;;31815:494;:::o;15647:120::-;15694:7;15721:38;15737:21;;15721:11;;:15;;:38;;;;:::i;:::-;15714:45;;15647:120;:::o;13689:170::-;13759:7;13786:65;13813:37;13839:10;13813:37;;:21;;:25;;:37;;;;:::i;:::-;13786:22;;;:65;:26;:65;:::i;20229:154::-;20294:7;20321:54;20339:23;20351:10;20339:11;:23::i;:::-;20364:10;20321:17;:54::i;19381:181::-;19543:9;;19498:24;;19445:7;;19472:82;;19498:55;;19543:9;;;;;19498:40;;;;;:28;:40;:::i;:55::-;19472:21;;;:82;:25;:82;:::i;21721:188::-;21858:42;;;21794:7;21858:42;;;:28;:42;;;;;;;;;21821:18;:32;;;;;;:80;;;:36;:80;:::i;19627:154::-;19693:7;19720:53;19728:44;19762:9;19728:29;19742:14;;19728:9;:13;;:29;;;;:::i;:44::-;19720:7;:53::i;1820:138::-;1901:5;;;1924:6;;;;;;;;;1917:14;;;14716:364;14777:6;14800:14;;;;14796:256;;14870:13;;14831:21;;14855:29;;14870:13;14855:14;;;;14870:13;;;;14855:29;:14;:29;:::i;:::-;14920:13;;14831:53;;-1:-1:-1;14937:1:0;;14905:29;;14920:13;14905:14;;;;14920:13;;;;14905:29;:14;:29;:::i;:::-;:33;;;14901:102;;;14966:21;:18;;;14985:1;14966:21;:18;:21;:::i;:::-;14959:28;;;;;14901:102;15026:14;-1:-1:-1;15019:21:0;;14796:256;-1:-1:-1;15071:1:0;14716:364;;;:::o;2652:184::-;2708:6;2738:1;2734;:5;;;2727:13;;;;2751:9;2767:1;2763:5;;:1;:5;;;;;;;;2751:17;;;;2803:1;2799:5;;:1;:5;;;;;;;;2791:13;;2795:1;2791;:5;;;:13;2786:1;:18;;;2779:26;;;;2827:1;2823:5;;:1;:5;;;;;;2997:121;3053:6;3080;;;3072:15;;;;;;3109:1;3105:5;;:1;:5;;;;;;;;;2997:121;-1:-1:-1;;;2997:121:0:o;7412:25689::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://8b4d451d67920d625330bb0825b0ff3928593b8100fedbe3b6d12957c0883d78

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.