ETH Price: $2,717.25 (+1.87%)

Contract

0x66789100D0c5B1d8B891a0Ef16928d6D6C9DEc16
 

Overview

ETH Balance

5.527914261238095258 ETH

Eth Value

$15,020.71 (@ $2,717.25/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer90696872019-12-08 3:28:151900 days ago1575775695IN
0x66789100...D6C9DEc16
2.9 ETH0.010117688
Transfer90387772019-12-02 15:30:281905 days ago1575300628IN
0x66789100...D6C9DEc16
1.0538 ETH0.0129683911
Transfer90387742019-12-02 15:29:111905 days ago1575300551IN
0x66789100...D6C9DEc16
1.0538 ETH0.0154892211
Transfer90387662019-12-02 15:27:301905 days ago1575300450IN
0x66789100...D6C9DEc16
1.0482 ETH0.0141473412
Transfer90387612019-12-02 15:24:421905 days ago1575300282IN
0x66789100...D6C9DEc16
1.0478 ETH0.020145712
Transfer90385002019-12-02 14:16:491905 days ago1575296209IN
0x66789100...D6C9DEc16
1.099 ETH0.002490812
Transfer90384942019-12-02 14:15:201905 days ago1575296120IN
0x66789100...D6C9DEc16
1.099 ETH0.0018201112
Transfer90383862019-12-02 13:49:491905 days ago1575294589IN
0x66789100...D6C9DEc16
1.12 ETH0.0176375612
Transfer90383782019-12-02 13:48:221905 days ago1575294502IN
0x66789100...D6C9DEc16
1.096 ETH0.0147993712
Transfer90383372019-12-02 13:36:571905 days ago1575293817IN
0x66789100...D6C9DEc16
1.12 ETH0.011697567.59
Transfer89316202019-11-14 9:09:041923 days ago1573722544IN
0x66789100...D6C9DEc16
1.38 ETH0.0130239311
Set Ether Price87504962019-10-16 6:00:231953 days ago1571205623IN
0x66789100...D6C9DEc16
0 ETH0.0011740341
Transfer87397362019-10-14 13:28:331954 days ago1571059713IN
0x66789100...D6C9DEc16
1.084 ETH0.0155077611
Rescue Tokens87383792019-10-14 8:20:481955 days ago1571041248IN
0x66789100...D6C9DEc16
0 ETH0.0017669741
Transfer87365182019-10-14 1:25:201955 days ago1571016320IN
0x66789100...D6C9DEc16
1.1099 ETH0.0123328110
Set Ether Price87257752019-10-12 8:58:431956 days ago1570870723IN
0x66789100...D6C9DEc16
0 ETH0.0011766541
Transfer87245192019-10-12 4:03:121957 days ago1570852992IN
0x66789100...D6C9DEc16
1.1333 ETH0.0123328110
Transfer87245172019-10-12 4:02:361957 days ago1570852956IN
0x66789100...D6C9DEc16
1.1024 ETH0.0146979710
Transfer87245122019-10-12 4:01:371957 days ago1570852897IN
0x66789100...D6C9DEc16
1.1003 ETH0.0122823210
Set Ether Price87186022019-10-11 5:41:571958 days ago1570772517IN
0x66789100...D6C9DEc16
0 ETH0.0011740341
Transfer86682402019-10-03 8:40:421966 days ago1570092042IN
0x66789100...D6C9DEc16
1.4 ETH0.0197135514
Transfer86680802019-10-03 7:59:501966 days ago1570089590IN
0x66789100...D6C9DEc16
1 ETH0.0165052314
Transfer86679462019-10-03 7:28:391966 days ago1570087719IN
0x66789100...D6C9DEc16
1 ETH0.0238956416.97
Transfer86679432019-10-03 7:27:291966 days ago1570087649IN
0x66789100...D6C9DEc16
1 ETH0.0198062716.8
Transfer86679402019-10-03 7:26:481966 days ago1570087608IN
0x66789100...D6C9DEc16
1 ETH0.0214852816.98
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
1.44 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.029 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.029 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.029 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.029 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.029 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.029 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.029 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.029 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.058 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.087 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.116 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.145 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.174 ETH
90696872019-12-08 3:28:151900 days ago1575775695
0x66789100...D6C9DEc16
0.174 ETH
90387772019-12-02 15:30:281905 days ago1575300628
0x66789100...D6C9DEc16
0.53 ETH
90387772019-12-02 15:30:281905 days ago1575300628
0x66789100...D6C9DEc16
0.010538 ETH
90387772019-12-02 15:30:281905 days ago1575300628
0x66789100...D6C9DEc16
0.010538 ETH
90387772019-12-02 15:30:281905 days ago1575300628
0x66789100...D6C9DEc16
0.010538 ETH
90387772019-12-02 15:30:281905 days ago1575300628
0x66789100...D6C9DEc16
0.010538 ETH
90387772019-12-02 15:30:281905 days ago1575300628
0x66789100...D6C9DEc16
0.010538 ETH
90387772019-12-02 15:30:281905 days ago1575300628
0x66789100...D6C9DEc16
0.010538 ETH
90387772019-12-02 15:30:281905 days ago1575300628
0x66789100...D6C9DEc16
0.010538 ETH
90387772019-12-02 15:30:281905 days ago1575300628
0x66789100...D6C9DEc16
0.010538 ETH
90387772019-12-02 15:30:281905 days ago1575300628
0x66789100...D6C9DEc16
0.021076 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TGPublicSale

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-07-26
*/

pragma solidity ^0.5.7;

// TG 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 TG interface
 */
interface ITG {
    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 TG Public Sale
 */
contract TGPublicSale is Ownable, Pausable{
    using SafeMath16 for uint16;
    using SafeMath256 for uint256;

    // TG
    address TG_Addr = address(0);
    ITG public TG = ITG(TG_Addr);

    // 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 TG_USD_PRICE_START = 1000;       // $      0.00100 USD
    uint256 private TG_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 _TGUsdPrice = TG_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 _TGTxs;
    uint256 private _TGBonusTxs;
    uint256 private _TGWhitelistTxs;
    uint256 private _TGIssued;
    uint256 private _TGBonus;
    uint256 private _TGWhitelist;
    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 _stageTGIssued;

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

    // Account
    mapping (address => uint256) private _accountTGIssued;
    mapping (address => uint256) private _accountTGBonus;
    mapping (address => uint256) private _accountTGWhitelisted;
    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 TGBonusTransfered(address indexed to, uint256 amount);
    event TGWhitelistTransfered(address indexed to, uint256 amount);
    event TGIssuedTransfered(uint16 stageIndex, address indexed to, uint256 TGAmount, 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 TG price in USD, by stage index.
     */
    function stageTGUsdPrice(uint16 stageIndex) private view returns (uint256) {
        return TG_USD_PRICE_START.add(TG_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 => TG
     */
    function usd2TG(uint256 usdAmount) private view returns (uint256) {
        return usdAmount.mul(1000000).div(_TGUsdPrice);
    }

    /**
     * @dev USD => TG
     */
    function usd2TGByStage(uint256 usdAmount, uint16 stageIndex) public view returns (uint256) {
        return usdAmount.mul(1000000).div(stageTGUsdPrice(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 TGUsdPrice,
                                           uint256 currentTopSalesRatio,
                                           uint256 txs,
                                           uint256 TGTxs,
                                           uint256 TGBonusTxs,
                                           uint256 TGWhitelistTxs,
                                           uint256 TGIssued,
                                           uint256 TGBonus,
                                           uint256 TGWhitelist) {
        auditEtherPrice = _etherPrice;

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

        TGUsdPrice = _TGUsdPrice;
        currentTopSalesRatio = _topSalesRatio;

        txs = _txs;
        TGTxs = _TGTxs;
        TGBonusTxs = _TGBonusTxs;
        TGWhitelistTxs = _TGWhitelistTxs;
        TGIssued = _TGIssued;
        TGBonus = _TGBonus;
        TGWhitelist = _TGWhitelist;
    }

    /**
     * @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, "TG Public-Sale has not started yet.");
        require(_etherPrice > 0, "Audit ETH price must be greater than zero.");
        require(!paused(), "TG Public-Sale is paused.");
        require(_stage <= STAGE_MAX, "TG 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 stageTGCap(uint16 stageIndex) private view returns (uint256) {
        return usd2TGByStage(stageUsdCap(stageIndex), stageIndex);
    }

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

        TGUsdPrice = stageTGUsdPrice(stageIndex);

        TGSold = _stageTGIssued[stageIndex];
        TGCap = stageTGCap(stageIndex);
        TGOnSale = TGCap.sub(TGSold);

        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 TGIssued,
                                                                uint256 TGBonus,
                                                                uint256 TGWhitelisted,
                                                                uint256 weiPurchased,
                                                                uint256 weiReferralRewarded) {
        TGIssued = _accountTGIssued[account];
        TGBonus = _accountTGBonus[account];
        TGWhitelisted = _accountTGWhitelisted[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 TGs.
     */
    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 __TGIssued;
        uint256 __TGBonus;
        uint256 __usdUsed;
        uint256 __weiUsed;

        // USD => TG
        while (gasleft() > GAS_EX && __usdRemain > 0 && _stage <= STAGE_MAX) {
            uint256 __txTGIssued;
            (__txTGIssued, __usdRemain) = ex(__usdRemain);
            __TGIssued = __TGIssued.add(__txTGIssued);
        }

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

        // Bonus 10%
        if (msg.value >= WEI_BONUS) {
            __TGBonus = __TGIssued.div(10);
            assert(transferTGBonus(__TGBonus));
        }

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

            // 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_ = TG.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 = TG.referrer(__cursor);

            if (__cursor == __refAccount)
                break;

            if (TG.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 => TG
     */
    function ex(uint256 usdAmount) private returns (uint256, uint256) {
        uint256 __stageUsdCap = stageUsdCap(_stage);
        uint256 __TGIssued;

        if (_stageUsdSold[_stage].add(usdAmount) > __stageUsdCap) {
            // calc used usd
            uint256 __usdUsed = __stageUsdCap.sub(_stageUsdSold[_stage]);

            // calc usd remain
            uint256 __usdRemain = usdAmount.sub(__usdUsed);

            // count status
            exCount(__usdUsed);

            // calc token issued
            __TGIssued = usd2TG(__usdUsed);

            // commit
            assert(transferTGIssued(__TGIssued, __usdUsed));
            assert(closeStage());

            return (__TGIssued, __usdRemain);
        } else {
            // count status
            exCount(usdAmount);

            // calc token issued
            __TGIssued = usd2TG(usdAmount);

            // commit
            assert(transferTGIssued(__TGIssued, usdAmount));

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

            return (__TGIssued, 0);
        }
    }

    /**
     * @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 TG issued.
     */
    function transferTGIssued(uint256 amount, uint256 usdAmount) private returns (bool) {
        _TGTxs = _TGTxs.add(1);

        _TGIssued = _TGIssued.add(amount);
        _stageTGIssued[_stage] = _stageTGIssued[_stage].add(amount);
        _accountTGIssued[msg.sender] = _accountTGIssued[msg.sender].add(amount);

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

    /**
     * @dev Transfer TG bonus.
     */
    function transferTGBonus(uint256 amount) private returns (bool) {
        _TGBonusTxs = _TGBonusTxs.add(1);

        _TGBonus = _TGBonus.add(amount);
        _accountTGBonus[msg.sender] = _accountTGBonus[msg.sender].add(amount);

        assert(TG.transfer(msg.sender, amount));
        emit TGBonusTransfered(msg.sender, amount);
        return true;
    }

    /**
     * @dev Transfer TG whitelisted.
     */
    function transferTGWhitelisted(uint256 amount) private returns (bool) {
        _TGWhitelistTxs = _TGWhitelistTxs.add(1);

        _TGWhitelist = _TGWhitelist.add(amount);
        _accountTGWhitelisted[msg.sender] = _accountTGWhitelisted[msg.sender].add(amount);

        assert(TG.transfer(msg.sender, amount));
        emit TGWhitelistTransfered(msg.sender, amount);
        return true;
    }

    /**
     * Close current stage.
     */
    function closeStage() private returns (bool) {
        emit StageClosed(_stage, msg.sender);
        _stage = _stage.add(1);
        _TGUsdPrice = stageTGUsdPrice(_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));
    }

    /**
     * @dev set TG Address
     */
    function setTGAddress(address _TgAddr) public onlyOwner {
        TG_Addr = _TgAddr;
        TG = ITG(_TgAddr);
    }
}

Contract Security Audit

Contract ABI

[{"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":"TGUsdPrice","type":"uint256"},{"name":"currentTopSalesRatio","type":"uint256"},{"name":"txs","type":"uint256"},{"name":"TGTxs","type":"uint256"},{"name":"TGBonusTxs","type":"uint256"},{"name":"TGWhitelistTxs","type":"uint256"},{"name":"TGIssued","type":"uint256"},{"name":"TGBonus","type":"uint256"},{"name":"TGWhitelist","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":"TGUsdPrice","type":"uint256"},{"name":"TGCap","type":"uint256"},{"name":"TGOnSale","type":"uint256"},{"name":"TGSold","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":"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":false,"inputs":[{"name":"_TgAddr","type":"address"}],"name":"setTGAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TG","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":"usdAmount","type":"uint256"},{"name":"stageIndex","type":"uint16"}],"name":"usd2TGByStage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"accountQuery","outputs":[{"name":"TGIssued","type":"uint256"},{"name":"TGBonus","type":"uint256"},{"name":"TGWhitelisted","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":"TGBonusTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TGWhitelistTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"stageIndex","type":"uint16"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"TGAmount","type":"uint256"},{"indexed":false,"name":"auditEtherPrice","type":"uint256"},{"indexed":false,"name":"weiUsed","type":"uint256"}],"name":"TGIssuedTransfered","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"}]

600280546001600160a01b031990811682556003805490911681556005805461ffff191660231781556102606040526006608081815260a082905260c092909252600460e052610100929092526101209290925260016101408190526101608190526101808190526101a08190526101c08190526101e0819052610200819052610220819052610240526200009691600f62000224565b506007805467016345785d8a00006001600160481b031990911617600160481b600160901b03191671056bc75e2d6310000000000000000000000017600160901b600160d81b031916798ac7230489e8000000000000000000000000000000000000000017600160d81b62ffffff0219167d2dc6c0000000000000000000000000000000000000000000000000000000179055600880546216e36062ffffff199091161790556103e86009819055600a80556305f5e100600b55620f4240600c5564038407b700600d55600e55600f805461ea6061ffff199091161763ffff00001916626400001765ffff0000000019166502580000000017905562e4e1c0601d8190556302faf080601e55601f5560055461ffff16602155348015620001bc57600080fd5b5060008054336001600160a01b031991821681178355600180549092168117600160a01b60ff0219168255825260246020526040909120805460ff19169091179055600f80546801000000000000000069ffffffff00000000000019909116179055620002e5565b600183019183908215620002ae5791602002820160005b838211156200027c57835183826101000a81548161ffff021916908360ff16021790555092602001926002016020816001010492830192600103026200023b565b8015620002ac5782816101000a81549061ffff02191690556002016020816001010492830192600103026200027c565b505b50620002bc929150620002c0565b5090565b620002e291905b80821115620002bc57805461ffff19168155600101620002c7565b90565b61296280620002f56000396000f3fe6080604052600436106101815760003560e01c8063ac5cf934116100d1578063d4eeb6ad1161008a578063eaaeafb311610064578063eaaeafb314610b5b578063f2e2934114610b8f578063f2fde38b14610bed578063f5f56b7a14610c2057610181565b8063d4eeb6ad14610aa9578063de8f246c14610afd578063e6fd48bc14610b2d57610181565b8063ac5cf93414610955578063b7352bee146109a4578063baace5f3146109e1578063bcccdfbf14610a14578063c225135d14610a29578063cea9d26f14610a6657610181565b806348d3297c1161013e5780635c975abb116101185780635c975abb1461088f57806363b26e76146108a4578063853255cc146108d75780638da5cb5b1461092457610181565b806348d3297c146107b4578063522f681514610823578063547e3f061461085c57610181565b806316c38b3c1461062c578063200d2ed21461065a578063223e8eff146106d557806322c8c2cc1461071c5780632718799114610757578063294b2ed014610781575b600754600160d81b900462ffffff165a1161019b57600080fd5b600354600160a01b900463ffffffff16158015906101c75750600354600160a01b900463ffffffff1642115b61020557604051600160e51b62461bcd0281526004018080602001828103825260238152602001806129146023913960400191505060405180910390fd5b60006004541161024957604051600160e51b62461bcd02815260040180806020018281038252602a8152602001806128ea602a913960400191505060405180910390fd5b610251610c9e565b156102a65760408051600160e51b62461bcd02815260206004820152601960248201527f5447205075626c69632d53616c65206973207061757365642e00000000000000604482015290519081900360640190fd5b600f5461ffff808216600160301b90920416111561030e5760408051600160e51b62461bcd02815260206004820152601660248201527f5447205075626c69632d53616c6520436c6f7365642e00000000000000000000604482015290519081900360640190fd5b60075468ffffffffffffffffff1634101561032857600080fd5b6007546901000000000000000000900468ffffffffffffffffff1634111561034f57600080fd5b610357610caf565b600061036234611035565b90508060008080805b60085462ffffff165a1180156103815750600085115b801561039d5750600f5461ffff808216600160301b9092041611155b156103c95760006103ad86611060565b965090506103c1858263ffffffff61119716565b94505061036b565b6103d9868663ffffffff6111aa16565b91506103e4826111bc565b600754909150600160901b900468ffffffffffffffffff1634106104245761041384600a63ffffffff6111de16565b925061041e8361121f565b61042457fe5b60205460ff1680156104365750600084115b156104625761045361044e858563ffffffff61119716565b611347565b61045957fe5b6104628161146f565b84156104b8576000610473866111bc565b9050610485348263ffffffff6111aa16565b604051909250339082156108fc029083906000818181858888f193505050501580156104b5573d6000803e3d6000fd5b50505b801561051c576010546104d290600163ffffffff61119716565b6010556017546104e8908263ffffffff61119716565b601755336000908152602d602052604090205461050b908263ffffffff61119716565b336000908152602d60205260409020555b600f5460009061ffff6201000082048116600160401b90920416111561057857610571601a54610565601b546105656019546105656018546017546111aa90919063ffffffff16565b9063ffffffff6111aa16565b90506105d2565b6105cf662386f26fc100006105c3662386f26fc100006105b7601a54610565601b546105656019546105656018546017546111aa90919063ffffffff16565b9063ffffffff6111de16565b9063ffffffff6115d916565b90505b601a546105e5908263ffffffff61119716565b601a556001546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610622573d6000803e3d6000fd5b5050505050505050005b34801561063857600080fd5b506106586004803603602081101561064f57600080fd5b503515156115fe565b005b34801561066657600080fd5b5061066f6116e2565b604080519c8d5261ffff9b8c1660208e015299909a168b8a015260608b019790975260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083019190915251908190036101800190f35b3480156106e157600080fd5b50610708600480360360208110156106f857600080fd5b50356001600160a01b0316611786565b604080519115158252519081900360200190f35b34801561072857600080fd5b506106586004803603604081101561073f57600080fd5b506001600160a01b03813516906020013515156117a4565b34801561076357600080fd5b506106586004803603602081101561077a57600080fd5b503561181b565b34801561078d57600080fd5b50610658600480360360208110156107a457600080fd5b50356001600160a01b0316611875565b3480156107c057600080fd5b506107e2600480360360208110156107d757600080fd5b503561ffff1661193b565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561082f57600080fd5b506106586004803603604081101561084657600080fd5b506001600160a01b038135169060200135611a0e565b34801561086857600080fd5b506106586004803603602081101561087f57600080fd5b50356001600160a01b0316611a83565b34801561089b57600080fd5b50610708610c9e565b3480156108b057600080fd5b50610658600480360360208110156108c757600080fd5b50356001600160a01b0316611aff565b3480156108e357600080fd5b506108ec611be1565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b34801561093057600080fd5b50610939611c08565b604080516001600160a01b039092168252519081900360200190f35b34801561096157600080fd5b506109926004803603604081101561097857600080fd5b50803561ffff1690602001356001600160a01b0316611c17565b60408051918252519081900360200190f35b3480156109b057600080fd5b50610992600480360360408110156109c757600080fd5b50803561ffff1690602001356001600160a01b0316611c45565b3480156109ed57600080fd5b5061065860048036036020811015610a0457600080fd5b50356001600160a01b0316611c73565b348015610a2057600080fd5b50610939611cb6565b348015610a3557600080fd5b5061065860048036036040811015610a4c57600080fd5b50803561ffff1690602001356001600160a01b0316611cc5565b348015610a7257600080fd5b5061065860048036036060811015610a8957600080fd5b506001600160a01b03813581169160208101359091169060400135611db1565b348015610ab557600080fd5b50610ad760048036036020811015610acc57600080fd5b503561ffff16611efd565b604080519485526020850193909352838301919091526060830152519081900360800190f35b348015610b0957600080fd5b5061065860048036036020811015610b2057600080fd5b503563ffffffff16611f39565b348015610b3957600080fd5b50610b42611f87565b6040805163ffffffff9092168252519081900360200190f35b348015610b6757600080fd5b5061099260048036036040811015610b7e57600080fd5b508035906020013561ffff16611f9a565b348015610b9b57600080fd5b50610bc260048036036020811015610bb257600080fd5b50356001600160a01b0316611fc2565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610bf957600080fd5b5061065860048036036020811015610c1057600080fd5b50356001600160a01b0316612006565b348015610c2c57600080fd5b50610c4e60048036036020811015610c4357600080fd5b503561ffff16612080565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610c8a578181015183820152602001610c72565b505050509050019250505060405180910390f35b600154600160a01b900460ff165b90565b610cbb6023600061288c565b610cc7602260006128aa565b60035460408051600160e01b63e2aafa2102815233600482015290516001600160a01b039092169163e2aafa2191602480820192602092909190829003018186803b158015610d1557600080fd5b505afa158015610d29573d6000803e3d6000fd5b505050506040513d6020811015610d3f57600080fd5b50516020805460ff191691151591909117905560055461ffff166021553360005b600f8161ffff1610156110315760035460408051600160e11b63167801e10281526001600160a01b03858116600483015291516000939290921691632cf003c291602480820192602092909190829003018186803b158015610dc157600080fd5b505afa158015610dd5573d6000803e3d6000fd5b505050506040513d6020811015610deb57600080fd5b505190506001600160a01b038381169082161415610e095750611031565b60035460408051600160e21b633b23e57f0281526001600160a01b038481166004830152915161ffff861693929092169163ec8f95fc91602480820192602092909190829003018186803b158015610e6057600080fd5b505afa158015610e74573d6000803e3d6000fd5b505050506040513d6020811015610e8a57600080fd5b5051111561102757600f54600160401b900461ffff1660009081526030602090815260408083206001600160a01b038516845290915290205460ff16610f4257600f805461ffff600160401b9182900481166000908152602f602090815260408083208054600181810183559185528385200180546001600160a01b038a166001600160a01b0319909116811790915596549590950490931682526030815282822094825293909352909120805460ff191690911790555b610f7860068361ffff16600f8110610f5657fe5b60108104919091015460215491600f166002026101000a900461ffff166111aa565b6021556022600661ffff8416600f8110610f8e57fe5b60108082049290920154835460018082018655600095865260208620948204909401805461ffff6002600f948516810261010090810a83810219909416959097160290950a9093049093169091021790556023805491820181559091527fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f42300180546001600160a01b0319166001600160a01b0383161790555b9150600101610d60565b5050565b6000611058670de0b6b3a76400006105b7600454856115d990919063ffffffff16565b90505b919050565b600080600061107e600f60069054906101000a900461ffff166120f1565b600f54600160301b900461ffff166000908152602560205260408120549192509082906110ab9087611197565b111561112f57600f54600160301b900461ffff166000908152602560205260408120546110d99084906111aa565b905060006110ed878363ffffffff6111aa16565b90506110f882612135565b61110182612376565b925061110d8383612393565b61111357fe5b61111b612521565b61112157fe5b919450909250611192915050565b61113885612135565b61114185612376565b905061114d8186612393565b61115357fe5b600f54600160301b900461ffff166000908152602560205260409020548214156111855761117f612521565b61118557fe5b9250600091506111929050565b915091565b818101828110156111a457fe5b92915050565b6000828211156111b657fe5b50900390565b600454600090611058906105b784670de0b6b3a764000063ffffffff6115d916565b60008082116111e957fe5b60008284816111f457fe5b04905082848161120057fe5b0681840201841461120d57fe5b82848161121657fe5b04949350505050565b60125460009061123690600163ffffffff61119716565b60125560155461124c908363ffffffff61119716565b601555336000908152602b602052604090205461126f908363ffffffff61119716565b336000818152602b60209081526040808320949094556003548451600160e01b63a9059cbb02815260048101949094526024840187905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b1580156112d757600080fd5b505af11580156112eb573d6000803e3d6000fd5b505050506040513d602081101561130157600080fd5b505161130957fe5b60408051838152905133917f10c0d19d0fba78db8aad36e658a9b381538bea0eda3e3a46023e8d20d3187fdf919081900360200190a2506001919050565b60135460009061135e90600163ffffffff61119716565b601355601654611374908363ffffffff61119716565b601655336000908152602c6020526040902054611397908363ffffffff61119716565b336000818152602c60209081526040808320949094556003548451600160e01b63a9059cbb02815260048101949094526024840187905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b1580156113ff57600080fd5b505af1158015611413573d6000803e3d6000fd5b505050506040513d602081101561142957600080fd5b505161143157fe5b60408051838152905133917f1648ee5e9a6a29917de9fedd8b9ba92cab336ef9e1cd5703d873a1c94b17385d919081900360200190a2506001919050565b8060005b60225461ffff8216101561159d5760006114c360646105b760228561ffff168154811061149c57fe5b600091825260209091206010820401548891600f166002026101000a900461ffff166115d9565b9050600060238361ffff16815481106114d857fe5b6000918252602090912001546018546001600160a01b039091169150611504908363ffffffff61119716565b6018556001600160a01b0381166000908152602e6020526040902054611530908363ffffffff61119716565b6001600160a01b0382166000908152602e6020526040902055611559848363ffffffff6111aa16565b6040519094506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015611592573d6000803e3d6000fd5b505050600101611473565b5060215415611031576115d26115c360646105b7602154866115d990919063ffffffff16565b601b549063ffffffff61119716565b601b555050565b6000826115e8575060006111a4565b50818102818382816115f657fe5b04146111a457fe5b6000546001600160a01b0316331461161557600080fd5b600154600160a01b900460ff16801561162c575080155b156116795760018054600160a01b60ff02191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a16116df565b600154600160a01b900460ff161580156116905750805b156116df5760018054600160a01b60ff021916600160a01b1790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a15b50565b600454600f54600090819081908190819081908190819081908190819061ffff808216600160301b90920416111561172e57600f5461ffff8082169c506201000090910416995061174b565b600f5461ffff600160301b820481169c50600160401b9091041699505b600e549850601f5497506010549650601154955060125494506013549350601454925060155491506016549050909192939495969798999a9b565b6001600160a01b031660009081526024602052604090205460ff1690565b6000546001600160a01b031633146117bb57600080fd5b6001600160a01b038216600081815260246020908152604091829020805460ff1916851515908117909155825190815291517f7309a1bee0ae3b528b2e9f11ab2abd82b54426646b40c5bef678f09554bd7c8f9281900390910190a25050565b3360009081526024602052604090205460ff1661183757600080fd5b600481905560408051828152905133917f4c93251017d1829354b31aa6cb37ab6ec1b2af6a073553f6073a7a3420cf7393919081900360200190a250565b6000546001600160a01b0316331461188c57600080fd5b6000611896612670565b90506001600160a01b0382166118ab57600080fd5b601c546118be908263ffffffff61119716565b601c556040805182815290516001600160a01b038416917ffcd200d7cba84a55eb61ba9209300062477f6f08297653f398fa5489b65a1704919081900360200190a26040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611936573d6000803e3d6000fd5b505050565b600080600080600080600080600f60009054906101000a900461ffff1661ffff168961ffff16111561198457506000965086955085945084935083925082915081905080611a03565b61198d8961268e565b61ffff8a1660009081526026602052604090205490985094506119af896126bb565b96506119c1878663ffffffff6111aa16565b61ffff8a1660009081526025602052604090205490965091506119e3896120f1565b93506119f5848363ffffffff6111aa16565b9250611a00896126cf565b90505b919395975091939597565b6000546001600160a01b03163314611a2557600080fd5b6001600160a01b038216611a3857600080fd5b303181811015611a4757600080fd5b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015611a7d573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314611a9a57600080fd5b6001600160a01b038116611aad57600080fd5b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fd36aafedb017e43b79d3cf6aa1987d3fbb9fff33e1738c71dbf6b2abaadbded090600090a35050565b6000546001600160a01b03163314611b1657600080fd5b6000611b41601a54610565601b546105656019546105656018546017546111aa90919063ffffffff16565b90506001600160a01b038216611b5657600080fd5b601a54611b69908263ffffffff61119716565b601a556040805182815290516001600160a01b038416917fe4de4c8dc6ab2404c805abf5db58633d76fc08b6c8b2c0a34d3a47bfb73663bf919081900360200190a26040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611936573d6000803e3d6000fd5b601754601854601954601a54601b54601c546000611bfd612670565b905090919293949596565b6000546001600160a01b031690565b61ffff821660009081526032602090815260408083206001600160a01b038516845290915290205492915050565b61ffff821660009081526031602090815260408083206001600160a01b038516845290915290205492915050565b6000546001600160a01b03163314611c8a57600080fd5b600280546001600160a01b039092166001600160a01b0319928316811790915560038054909216179055565b6003546001600160a01b031681565b6000546001600160a01b03163314611cdc57600080fd5b6000611ce783612707565b90506001600160a01b038216611cfc57600080fd5b61ffff8316600090815260296020526040902054611d20908263ffffffff61119716565b61ffff841660008181526029602090815260409182902093909355805191825291810183905281516001600160a01b038516927f69ccd39c099e91512b4f9c8d1664c05f38430681d4d594a1deec4ace4e7a6e0d928290030190a26040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611a7d573d6000803e3d6000fd5b6000546001600160a01b03163314611dc857600080fd5b826001600160a01b038316611ddc57600080fd5b60408051600160e01b6370a0823102815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015611e2957600080fd5b505afa158015611e3d573d6000803e3d6000fd5b505050506040513d6020811015611e5357600080fd5b5051905082811015611e6457600080fd5b816001600160a01b031663a9059cbb85856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ec457600080fd5b505af1158015611ed8573d6000803e3d6000fd5b505050506040513d6020811015611eee57600080fd5b5051611ef657fe5b5050505050565b61ffff811660009081526027602090815260408083205460288352818420546029909352908320549092611f3085612707565b90509193509193565b6000546001600160a01b03163314611f5057600080fd5b6003805463ffffffff909216600160a01b0277ffffffff000000000000000000000000000000000000000019909216919091179055565b600354600160a01b900463ffffffff1690565b6000611fbb611fa88361268e565b6105b785620f424063ffffffff6115d916565b9392505050565b6001600160a01b03166000908152602a6020908152604080832054602b835281842054602c845282852054602d855283862054602e90955292909420549094919291565b6000546001600160a01b0316331461201d57600080fd5b6001600160a01b03811661203057600080fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61ffff81166000908152602f60209081526040918290208054835181840281018401909452808452606093928301828280156120e557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116120c7575b50505050509050919050565b60008061211f6121108461ffff16600c546115d990919063ffffffff16565b600b549063ffffffff61119716565b9050600d54811115611058575050600d5461105b565b6000612140826111bc565b9050600061214d83612735565b600f54600160401b900461ffff1660009081526031602090815260408083203384529091529020549091506121829084611197565b600f805461ffff600160401b909104811660009081526031602090815260408083203384528252808320959095559254600160301b90049091168152602590915220546121d5908463ffffffff61119716565b600f805461ffff600160301b90910481166000908152602560209081526040808320959095559254600160401b9004909116815260279091522054612220908363ffffffff61119716565b600f805461ffff600160401b91829004811660009081526027602090815260408083209690965593549290920416815260289091522054612267908263ffffffff61119716565b600f54600160401b900461ffff166000908152602860205260409020556019546122919082611197565b60195560205460ff16156119365760005b60225461ffff82161015611a7d57600f5461ffff600160401b909104811660009081526032602052604081206023805461231794899492919087169081106122e657fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020549063ffffffff61119716565b600f5461ffff600160401b90910481166000908152603260205260408120602380549193909190861690811061234957fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020556001016122a2565b600e54600090611058906105b784620f424063ffffffff6115d916565b6011546000906123aa90600163ffffffff61119716565b6011556014546123c0908463ffffffff61119716565b601455600f54600160301b900461ffff166000908152602660205260409020546123ea9084611197565b600f54600160301b900461ffff16600090815260266020908152604080832093909355338252602a905220546124209084611197565b336000818152602a60209081526040808320949094556003548451600160e01b63a9059cbb02815260048101949094526024840188905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b15801561248857600080fd5b505af115801561249c573d6000803e3d6000fd5b505050506040513d60208110156124b257600080fd5b50516124ba57fe5b600f546004546040805161ffff600160301b9094049390931683526020830186905282810191909152606082018490525133917f8b47af86936656ebc489ae00a2cf70f1b4b3102aac9f4b8d157444cf0e5c3117919081900360800190a250600192915050565b600f5460408051600160301b90920461ffff1682525160009133917feb233b5b7ba017d2651d779b7619d1a70758bcd13049019e0dd121077a1e1a2f916020908290030190a2600f5461258090600160301b900461ffff16600161275c565b600f805467ffff0000000000001916600160301b61ffff938416810291909117918290556125b09291041661268e565b600e55600f546125ca90600160301b900461ffff166126cf565b601f55600f546000906125e790600160301b900461ffff16612770565b600f5490915061ffff808316600160401b90920416101561266857600f546040805161ffff600160401b9093049290921682525133917f7d2797fdf1b9f35ccf52e7b904a608332c1db1d8c7f2ff7f28ea7f2d6f87996c919081900360200190a2600f805469ffff00000000000000001916600160401b61ffff8416021790555b600191505090565b6000612689601c54601b546111aa90919063ffffffff16565b905090565b60006110586126ac8361ffff16600a546115d990919063ffffffff16565b6009549063ffffffff61119716565b60006110586126c9836120f1565b83611f9a565b600f54601e54600091611058916126f89161ffff908116916105b791871663ffffffff6115d916565b601d549063ffffffff61119716565b61ffff811660009081526029602090815260408083205460289092528220546110589163ffffffff6111aa16565b60006110586127576305f5e1006105b7601f54866115d990919063ffffffff16565b6111bc565b81810161ffff80841690821610156111a457fe5b600061ffff8216156127f757600f546000906127a19061ffff8581169164010000000090041663ffffffff6127ff16565b600f549091506000906127c99061ffff8681169164010000000090041663ffffffff61286316565b61ffff1611156127f0576127e861ffff8216600163ffffffff61275c16565b91505061105b565b905061105b565b506001919050565b6000808261ffff161161280e57fe5b60008261ffff168461ffff168161282157fe5b0461ffff1690508261ffff168461ffff168161283957fe5b0661ffff16818461ffff1602018461ffff161461285257fe5b8261ffff168461ffff168161121657fe5b600061ffff821661287357600080fd5b8161ffff168361ffff168161288457fe5b069392505050565b50805460008255906000526020600020908101906116df91906128cb565b50805460008255600f0160109004906000526020600020908101906116df91905b610cac91905b808211156128e557600081556001016128d1565b509056fe417564697420455448207072696365206d7573742062652067726561746572207468616e207a65726f2e5447205075626c69632d53616c6520686173206e6f742073746172746564207965742ea165627a7a723058205a5e398e7e7cdea43030af6dbb8a9d359b06d081af919e1b6eb68a86dc6d5c680029

Deployed Bytecode

0x6080604052600436106101815760003560e01c8063ac5cf934116100d1578063d4eeb6ad1161008a578063eaaeafb311610064578063eaaeafb314610b5b578063f2e2934114610b8f578063f2fde38b14610bed578063f5f56b7a14610c2057610181565b8063d4eeb6ad14610aa9578063de8f246c14610afd578063e6fd48bc14610b2d57610181565b8063ac5cf93414610955578063b7352bee146109a4578063baace5f3146109e1578063bcccdfbf14610a14578063c225135d14610a29578063cea9d26f14610a6657610181565b806348d3297c1161013e5780635c975abb116101185780635c975abb1461088f57806363b26e76146108a4578063853255cc146108d75780638da5cb5b1461092457610181565b806348d3297c146107b4578063522f681514610823578063547e3f061461085c57610181565b806316c38b3c1461062c578063200d2ed21461065a578063223e8eff146106d557806322c8c2cc1461071c5780632718799114610757578063294b2ed014610781575b600754600160d81b900462ffffff165a1161019b57600080fd5b600354600160a01b900463ffffffff16158015906101c75750600354600160a01b900463ffffffff1642115b61020557604051600160e51b62461bcd0281526004018080602001828103825260238152602001806129146023913960400191505060405180910390fd5b60006004541161024957604051600160e51b62461bcd02815260040180806020018281038252602a8152602001806128ea602a913960400191505060405180910390fd5b610251610c9e565b156102a65760408051600160e51b62461bcd02815260206004820152601960248201527f5447205075626c69632d53616c65206973207061757365642e00000000000000604482015290519081900360640190fd5b600f5461ffff808216600160301b90920416111561030e5760408051600160e51b62461bcd02815260206004820152601660248201527f5447205075626c69632d53616c6520436c6f7365642e00000000000000000000604482015290519081900360640190fd5b60075468ffffffffffffffffff1634101561032857600080fd5b6007546901000000000000000000900468ffffffffffffffffff1634111561034f57600080fd5b610357610caf565b600061036234611035565b90508060008080805b60085462ffffff165a1180156103815750600085115b801561039d5750600f5461ffff808216600160301b9092041611155b156103c95760006103ad86611060565b965090506103c1858263ffffffff61119716565b94505061036b565b6103d9868663ffffffff6111aa16565b91506103e4826111bc565b600754909150600160901b900468ffffffffffffffffff1634106104245761041384600a63ffffffff6111de16565b925061041e8361121f565b61042457fe5b60205460ff1680156104365750600084115b156104625761045361044e858563ffffffff61119716565b611347565b61045957fe5b6104628161146f565b84156104b8576000610473866111bc565b9050610485348263ffffffff6111aa16565b604051909250339082156108fc029083906000818181858888f193505050501580156104b5573d6000803e3d6000fd5b50505b801561051c576010546104d290600163ffffffff61119716565b6010556017546104e8908263ffffffff61119716565b601755336000908152602d602052604090205461050b908263ffffffff61119716565b336000908152602d60205260409020555b600f5460009061ffff6201000082048116600160401b90920416111561057857610571601a54610565601b546105656019546105656018546017546111aa90919063ffffffff16565b9063ffffffff6111aa16565b90506105d2565b6105cf662386f26fc100006105c3662386f26fc100006105b7601a54610565601b546105656019546105656018546017546111aa90919063ffffffff16565b9063ffffffff6111de16565b9063ffffffff6115d916565b90505b601a546105e5908263ffffffff61119716565b601a556001546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610622573d6000803e3d6000fd5b5050505050505050005b34801561063857600080fd5b506106586004803603602081101561064f57600080fd5b503515156115fe565b005b34801561066657600080fd5b5061066f6116e2565b604080519c8d5261ffff9b8c1660208e015299909a168b8a015260608b019790975260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083019190915251908190036101800190f35b3480156106e157600080fd5b50610708600480360360208110156106f857600080fd5b50356001600160a01b0316611786565b604080519115158252519081900360200190f35b34801561072857600080fd5b506106586004803603604081101561073f57600080fd5b506001600160a01b03813516906020013515156117a4565b34801561076357600080fd5b506106586004803603602081101561077a57600080fd5b503561181b565b34801561078d57600080fd5b50610658600480360360208110156107a457600080fd5b50356001600160a01b0316611875565b3480156107c057600080fd5b506107e2600480360360208110156107d757600080fd5b503561ffff1661193b565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561082f57600080fd5b506106586004803603604081101561084657600080fd5b506001600160a01b038135169060200135611a0e565b34801561086857600080fd5b506106586004803603602081101561087f57600080fd5b50356001600160a01b0316611a83565b34801561089b57600080fd5b50610708610c9e565b3480156108b057600080fd5b50610658600480360360208110156108c757600080fd5b50356001600160a01b0316611aff565b3480156108e357600080fd5b506108ec611be1565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b34801561093057600080fd5b50610939611c08565b604080516001600160a01b039092168252519081900360200190f35b34801561096157600080fd5b506109926004803603604081101561097857600080fd5b50803561ffff1690602001356001600160a01b0316611c17565b60408051918252519081900360200190f35b3480156109b057600080fd5b50610992600480360360408110156109c757600080fd5b50803561ffff1690602001356001600160a01b0316611c45565b3480156109ed57600080fd5b5061065860048036036020811015610a0457600080fd5b50356001600160a01b0316611c73565b348015610a2057600080fd5b50610939611cb6565b348015610a3557600080fd5b5061065860048036036040811015610a4c57600080fd5b50803561ffff1690602001356001600160a01b0316611cc5565b348015610a7257600080fd5b5061065860048036036060811015610a8957600080fd5b506001600160a01b03813581169160208101359091169060400135611db1565b348015610ab557600080fd5b50610ad760048036036020811015610acc57600080fd5b503561ffff16611efd565b604080519485526020850193909352838301919091526060830152519081900360800190f35b348015610b0957600080fd5b5061065860048036036020811015610b2057600080fd5b503563ffffffff16611f39565b348015610b3957600080fd5b50610b42611f87565b6040805163ffffffff9092168252519081900360200190f35b348015610b6757600080fd5b5061099260048036036040811015610b7e57600080fd5b508035906020013561ffff16611f9a565b348015610b9b57600080fd5b50610bc260048036036020811015610bb257600080fd5b50356001600160a01b0316611fc2565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610bf957600080fd5b5061065860048036036020811015610c1057600080fd5b50356001600160a01b0316612006565b348015610c2c57600080fd5b50610c4e60048036036020811015610c4357600080fd5b503561ffff16612080565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610c8a578181015183820152602001610c72565b505050509050019250505060405180910390f35b600154600160a01b900460ff165b90565b610cbb6023600061288c565b610cc7602260006128aa565b60035460408051600160e01b63e2aafa2102815233600482015290516001600160a01b039092169163e2aafa2191602480820192602092909190829003018186803b158015610d1557600080fd5b505afa158015610d29573d6000803e3d6000fd5b505050506040513d6020811015610d3f57600080fd5b50516020805460ff191691151591909117905560055461ffff166021553360005b600f8161ffff1610156110315760035460408051600160e11b63167801e10281526001600160a01b03858116600483015291516000939290921691632cf003c291602480820192602092909190829003018186803b158015610dc157600080fd5b505afa158015610dd5573d6000803e3d6000fd5b505050506040513d6020811015610deb57600080fd5b505190506001600160a01b038381169082161415610e095750611031565b60035460408051600160e21b633b23e57f0281526001600160a01b038481166004830152915161ffff861693929092169163ec8f95fc91602480820192602092909190829003018186803b158015610e6057600080fd5b505afa158015610e74573d6000803e3d6000fd5b505050506040513d6020811015610e8a57600080fd5b5051111561102757600f54600160401b900461ffff1660009081526030602090815260408083206001600160a01b038516845290915290205460ff16610f4257600f805461ffff600160401b9182900481166000908152602f602090815260408083208054600181810183559185528385200180546001600160a01b038a166001600160a01b0319909116811790915596549590950490931682526030815282822094825293909352909120805460ff191690911790555b610f7860068361ffff16600f8110610f5657fe5b60108104919091015460215491600f166002026101000a900461ffff166111aa565b6021556022600661ffff8416600f8110610f8e57fe5b60108082049290920154835460018082018655600095865260208620948204909401805461ffff6002600f948516810261010090810a83810219909416959097160290950a9093049093169091021790556023805491820181559091527fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f42300180546001600160a01b0319166001600160a01b0383161790555b9150600101610d60565b5050565b6000611058670de0b6b3a76400006105b7600454856115d990919063ffffffff16565b90505b919050565b600080600061107e600f60069054906101000a900461ffff166120f1565b600f54600160301b900461ffff166000908152602560205260408120549192509082906110ab9087611197565b111561112f57600f54600160301b900461ffff166000908152602560205260408120546110d99084906111aa565b905060006110ed878363ffffffff6111aa16565b90506110f882612135565b61110182612376565b925061110d8383612393565b61111357fe5b61111b612521565b61112157fe5b919450909250611192915050565b61113885612135565b61114185612376565b905061114d8186612393565b61115357fe5b600f54600160301b900461ffff166000908152602560205260409020548214156111855761117f612521565b61118557fe5b9250600091506111929050565b915091565b818101828110156111a457fe5b92915050565b6000828211156111b657fe5b50900390565b600454600090611058906105b784670de0b6b3a764000063ffffffff6115d916565b60008082116111e957fe5b60008284816111f457fe5b04905082848161120057fe5b0681840201841461120d57fe5b82848161121657fe5b04949350505050565b60125460009061123690600163ffffffff61119716565b60125560155461124c908363ffffffff61119716565b601555336000908152602b602052604090205461126f908363ffffffff61119716565b336000818152602b60209081526040808320949094556003548451600160e01b63a9059cbb02815260048101949094526024840187905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b1580156112d757600080fd5b505af11580156112eb573d6000803e3d6000fd5b505050506040513d602081101561130157600080fd5b505161130957fe5b60408051838152905133917f10c0d19d0fba78db8aad36e658a9b381538bea0eda3e3a46023e8d20d3187fdf919081900360200190a2506001919050565b60135460009061135e90600163ffffffff61119716565b601355601654611374908363ffffffff61119716565b601655336000908152602c6020526040902054611397908363ffffffff61119716565b336000818152602c60209081526040808320949094556003548451600160e01b63a9059cbb02815260048101949094526024840187905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b1580156113ff57600080fd5b505af1158015611413573d6000803e3d6000fd5b505050506040513d602081101561142957600080fd5b505161143157fe5b60408051838152905133917f1648ee5e9a6a29917de9fedd8b9ba92cab336ef9e1cd5703d873a1c94b17385d919081900360200190a2506001919050565b8060005b60225461ffff8216101561159d5760006114c360646105b760228561ffff168154811061149c57fe5b600091825260209091206010820401548891600f166002026101000a900461ffff166115d9565b9050600060238361ffff16815481106114d857fe5b6000918252602090912001546018546001600160a01b039091169150611504908363ffffffff61119716565b6018556001600160a01b0381166000908152602e6020526040902054611530908363ffffffff61119716565b6001600160a01b0382166000908152602e6020526040902055611559848363ffffffff6111aa16565b6040519094506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015611592573d6000803e3d6000fd5b505050600101611473565b5060215415611031576115d26115c360646105b7602154866115d990919063ffffffff16565b601b549063ffffffff61119716565b601b555050565b6000826115e8575060006111a4565b50818102818382816115f657fe5b04146111a457fe5b6000546001600160a01b0316331461161557600080fd5b600154600160a01b900460ff16801561162c575080155b156116795760018054600160a01b60ff02191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a16116df565b600154600160a01b900460ff161580156116905750805b156116df5760018054600160a01b60ff021916600160a01b1790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a15b50565b600454600f54600090819081908190819081908190819081908190819061ffff808216600160301b90920416111561172e57600f5461ffff8082169c506201000090910416995061174b565b600f5461ffff600160301b820481169c50600160401b9091041699505b600e549850601f5497506010549650601154955060125494506013549350601454925060155491506016549050909192939495969798999a9b565b6001600160a01b031660009081526024602052604090205460ff1690565b6000546001600160a01b031633146117bb57600080fd5b6001600160a01b038216600081815260246020908152604091829020805460ff1916851515908117909155825190815291517f7309a1bee0ae3b528b2e9f11ab2abd82b54426646b40c5bef678f09554bd7c8f9281900390910190a25050565b3360009081526024602052604090205460ff1661183757600080fd5b600481905560408051828152905133917f4c93251017d1829354b31aa6cb37ab6ec1b2af6a073553f6073a7a3420cf7393919081900360200190a250565b6000546001600160a01b0316331461188c57600080fd5b6000611896612670565b90506001600160a01b0382166118ab57600080fd5b601c546118be908263ffffffff61119716565b601c556040805182815290516001600160a01b038416917ffcd200d7cba84a55eb61ba9209300062477f6f08297653f398fa5489b65a1704919081900360200190a26040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611936573d6000803e3d6000fd5b505050565b600080600080600080600080600f60009054906101000a900461ffff1661ffff168961ffff16111561198457506000965086955085945084935083925082915081905080611a03565b61198d8961268e565b61ffff8a1660009081526026602052604090205490985094506119af896126bb565b96506119c1878663ffffffff6111aa16565b61ffff8a1660009081526025602052604090205490965091506119e3896120f1565b93506119f5848363ffffffff6111aa16565b9250611a00896126cf565b90505b919395975091939597565b6000546001600160a01b03163314611a2557600080fd5b6001600160a01b038216611a3857600080fd5b303181811015611a4757600080fd5b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015611a7d573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314611a9a57600080fd5b6001600160a01b038116611aad57600080fd5b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fd36aafedb017e43b79d3cf6aa1987d3fbb9fff33e1738c71dbf6b2abaadbded090600090a35050565b6000546001600160a01b03163314611b1657600080fd5b6000611b41601a54610565601b546105656019546105656018546017546111aa90919063ffffffff16565b90506001600160a01b038216611b5657600080fd5b601a54611b69908263ffffffff61119716565b601a556040805182815290516001600160a01b038416917fe4de4c8dc6ab2404c805abf5db58633d76fc08b6c8b2c0a34d3a47bfb73663bf919081900360200190a26040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611936573d6000803e3d6000fd5b601754601854601954601a54601b54601c546000611bfd612670565b905090919293949596565b6000546001600160a01b031690565b61ffff821660009081526032602090815260408083206001600160a01b038516845290915290205492915050565b61ffff821660009081526031602090815260408083206001600160a01b038516845290915290205492915050565b6000546001600160a01b03163314611c8a57600080fd5b600280546001600160a01b039092166001600160a01b0319928316811790915560038054909216179055565b6003546001600160a01b031681565b6000546001600160a01b03163314611cdc57600080fd5b6000611ce783612707565b90506001600160a01b038216611cfc57600080fd5b61ffff8316600090815260296020526040902054611d20908263ffffffff61119716565b61ffff841660008181526029602090815260409182902093909355805191825291810183905281516001600160a01b038516927f69ccd39c099e91512b4f9c8d1664c05f38430681d4d594a1deec4ace4e7a6e0d928290030190a26040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611a7d573d6000803e3d6000fd5b6000546001600160a01b03163314611dc857600080fd5b826001600160a01b038316611ddc57600080fd5b60408051600160e01b6370a0823102815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015611e2957600080fd5b505afa158015611e3d573d6000803e3d6000fd5b505050506040513d6020811015611e5357600080fd5b5051905082811015611e6457600080fd5b816001600160a01b031663a9059cbb85856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ec457600080fd5b505af1158015611ed8573d6000803e3d6000fd5b505050506040513d6020811015611eee57600080fd5b5051611ef657fe5b5050505050565b61ffff811660009081526027602090815260408083205460288352818420546029909352908320549092611f3085612707565b90509193509193565b6000546001600160a01b03163314611f5057600080fd5b6003805463ffffffff909216600160a01b0277ffffffff000000000000000000000000000000000000000019909216919091179055565b600354600160a01b900463ffffffff1690565b6000611fbb611fa88361268e565b6105b785620f424063ffffffff6115d916565b9392505050565b6001600160a01b03166000908152602a6020908152604080832054602b835281842054602c845282852054602d855283862054602e90955292909420549094919291565b6000546001600160a01b0316331461201d57600080fd5b6001600160a01b03811661203057600080fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61ffff81166000908152602f60209081526040918290208054835181840281018401909452808452606093928301828280156120e557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116120c7575b50505050509050919050565b60008061211f6121108461ffff16600c546115d990919063ffffffff16565b600b549063ffffffff61119716565b9050600d54811115611058575050600d5461105b565b6000612140826111bc565b9050600061214d83612735565b600f54600160401b900461ffff1660009081526031602090815260408083203384529091529020549091506121829084611197565b600f805461ffff600160401b909104811660009081526031602090815260408083203384528252808320959095559254600160301b90049091168152602590915220546121d5908463ffffffff61119716565b600f805461ffff600160301b90910481166000908152602560209081526040808320959095559254600160401b9004909116815260279091522054612220908363ffffffff61119716565b600f805461ffff600160401b91829004811660009081526027602090815260408083209690965593549290920416815260289091522054612267908263ffffffff61119716565b600f54600160401b900461ffff166000908152602860205260409020556019546122919082611197565b60195560205460ff16156119365760005b60225461ffff82161015611a7d57600f5461ffff600160401b909104811660009081526032602052604081206023805461231794899492919087169081106122e657fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020549063ffffffff61119716565b600f5461ffff600160401b90910481166000908152603260205260408120602380549193909190861690811061234957fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020556001016122a2565b600e54600090611058906105b784620f424063ffffffff6115d916565b6011546000906123aa90600163ffffffff61119716565b6011556014546123c0908463ffffffff61119716565b601455600f54600160301b900461ffff166000908152602660205260409020546123ea9084611197565b600f54600160301b900461ffff16600090815260266020908152604080832093909355338252602a905220546124209084611197565b336000818152602a60209081526040808320949094556003548451600160e01b63a9059cbb02815260048101949094526024840188905293516001600160a01b039094169363a9059cbb93604480820194918390030190829087803b15801561248857600080fd5b505af115801561249c573d6000803e3d6000fd5b505050506040513d60208110156124b257600080fd5b50516124ba57fe5b600f546004546040805161ffff600160301b9094049390931683526020830186905282810191909152606082018490525133917f8b47af86936656ebc489ae00a2cf70f1b4b3102aac9f4b8d157444cf0e5c3117919081900360800190a250600192915050565b600f5460408051600160301b90920461ffff1682525160009133917feb233b5b7ba017d2651d779b7619d1a70758bcd13049019e0dd121077a1e1a2f916020908290030190a2600f5461258090600160301b900461ffff16600161275c565b600f805467ffff0000000000001916600160301b61ffff938416810291909117918290556125b09291041661268e565b600e55600f546125ca90600160301b900461ffff166126cf565b601f55600f546000906125e790600160301b900461ffff16612770565b600f5490915061ffff808316600160401b90920416101561266857600f546040805161ffff600160401b9093049290921682525133917f7d2797fdf1b9f35ccf52e7b904a608332c1db1d8c7f2ff7f28ea7f2d6f87996c919081900360200190a2600f805469ffff00000000000000001916600160401b61ffff8416021790555b600191505090565b6000612689601c54601b546111aa90919063ffffffff16565b905090565b60006110586126ac8361ffff16600a546115d990919063ffffffff16565b6009549063ffffffff61119716565b60006110586126c9836120f1565b83611f9a565b600f54601e54600091611058916126f89161ffff908116916105b791871663ffffffff6115d916565b601d549063ffffffff61119716565b61ffff811660009081526029602090815260408083205460289092528220546110589163ffffffff6111aa16565b60006110586127576305f5e1006105b7601f54866115d990919063ffffffff16565b6111bc565b81810161ffff80841690821610156111a457fe5b600061ffff8216156127f757600f546000906127a19061ffff8581169164010000000090041663ffffffff6127ff16565b600f549091506000906127c99061ffff8681169164010000000090041663ffffffff61286316565b61ffff1611156127f0576127e861ffff8216600163ffffffff61275c16565b91505061105b565b905061105b565b506001919050565b6000808261ffff161161280e57fe5b60008261ffff168461ffff168161282157fe5b0461ffff1690508261ffff168461ffff168161283957fe5b0661ffff16818461ffff1602018461ffff161461285257fe5b8261ffff168461ffff168161121657fe5b600061ffff821661287357600080fd5b8161ffff168361ffff168161288457fe5b069392505050565b50805460008255906000526020600020908101906116df91906128cb565b50805460008255600f0160109004906000526020600020908101906116df91905b610cac91905b808211156128e557600081556001016128d1565b509056fe417564697420455448207072696365206d7573742062652067726561746572207468616e207a65726f2e5447205075626c69632d53616c6520686173206e6f742073746172746564207965742ea165627a7a723058205a5e398e7e7cdea43030af6dbb8a9d359b06d081af919e1b6eb68a86dc6d5c680029

Deployed Bytecode Sourcemap

7396:25362:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18642:7;;-1:-1:-1;;;18642:7:0;;;;18630:9;:19;18622:28;;;;;;18773:15;;-1:-1:-1;;;18773:15:0;;;;:19;;;;:44;;-1:-1:-1;18802:15:0;;-1:-1:-1;;;18802:15:0;;;;18796:3;:21;18773:44;18765:92;;;;-1:-1:-1;;;;;18765:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18890:1;18876:11;;:15;18868:70;;;;-1:-1:-1;;;;;18868:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18958:8;:6;:8::i;:::-;18957:9;18949:47;;;;;-1:-1:-1;;;;;18949:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19025:9;;;;;;-1:-1:-1;;;19015:6:0;;;;:19;;19007:54;;;;;-1:-1:-1;;;;;19007:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24174:7;;;;24161:9;:20;;24153:29;;;;;;24214:7;;;;;;;24201:9;:20;;24193:29;;;;;;24272:23;:21;:23::i;:::-;24306:19;24328:18;24336:9;24328:7;:18::i;:::-;24306:40;-1:-1:-1;24306:40:0;24357:19;;;;24538:232;24557:6;;;;24545:9;:18;:37;;;;;24581:1;24567:11;:15;24545:37;:60;;;;-1:-1:-1;24596:9:0;;;;;;-1:-1:-1;;;24586:6:0;;;;:19;;24545:60;24538:232;;;24622:20;24687:15;24690:11;24687:2;:15::i;:::-;24657:45;-1:-1:-1;24657:45:0;-1:-1:-1;24730:28:0;:10;24657:45;24730:28;:14;:28;:::i;:::-;24717:41;;24538:232;;;;24811:28;:11;24827;24811:28;:15;:28;:::i;:::-;24799:40;;24862:18;24870:9;24862:7;:18::i;:::-;24932:9;;24850:30;;-1:-1:-1;;;;24932:9:0;;;;24919;:22;24915:134;;24970:18;:10;24985:2;24970:18;:14;:18;:::i;:::-;24958:30;;25010:26;25026:9;25010:15;:26::i;:::-;25003:34;;;;25131:13;;;;:31;;;;;25161:1;25148:10;:14;25131:31;25127:248;;;25224:48;25246:25;:10;25261:9;25246:25;:14;:25;:::i;:::-;25224:21;:48::i;:::-;25217:56;;;;25324:39;25353:9;25324:28;:39::i;:::-;25427:15;;25423:226;;25459:19;25481:20;25489:11;25481:7;:20::i;:::-;25459:42;-1:-1:-1;25530:26:0;:9;25459:42;25530:26;:13;:26;:::i;:::-;25605:32;;25518:38;;-1:-1:-1;25605:10:0;;:32;;;;;25625:11;;25605:32;;;;25625:11;25605:10;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25605:32:0;25423:226;;25685:13;;25681:210;;25722:4;;:11;;25731:1;25722:11;:8;:11;:::i;:::-;25715:4;:18;25759:8;;:23;;25772:9;25759:23;:12;:23;:::i;:::-;25748:8;:34;25853:10;25832:32;;;;:20;:32;;;;;;:47;;25869:9;25832:47;:36;:47;:::i;:::-;25818:10;25797:32;;;;:20;:32;;;;;:82;25681:210;25966:10;;25924:17;;25966:10;;;;;;-1:-1:-1;;;25956:7:0;;;;:20;25952:280;;;26003:78;26072:8;;26003:64;26055:11;;26003:47;26037:12;;26003:29;26016:15;;26003:8;;:12;;:29;;;;:::i;:::-;:33;:47;:33;:47;:::i;:78::-;25991:90;;25952:280;;;26122:110;26221:10;26122:94;26205:10;26122:78;26191:8;;26122:64;26174:11;;26122:47;26156:12;;26122:29;26135:15;;26122:8;;:12;;:29;;;;:::i;:78::-;:82;:94;:82;:94;:::i;:::-;:98;:110;:98;:110;:::i;:::-;26110:122;;25952:280;26256:8;;:23;;26269:9;26256:23;:12;:23;:::i;:::-;26245:8;:34;26290:9;;:29;;-1:-1:-1;;;;;26290:9:0;;;;:29;;;;;26309:9;;26290;:29;:9;:29;26309:9;26290;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;19072:1:0;;;;;;;7396:25362;6384:281;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6384:281:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6384:281:0;;;;:::i;:::-;;16454:1303;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16454:1303:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13110:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13110:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13110:125:0;-1:-1:-1;;;;;13110:125:0;;:::i;:::-;;;;;;;;;;;;;;;;;;13305:194;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13305:194:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13305:194:0;;;;;;;;;;:::i;12876:164::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12876:164:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12876:164:0;;:::i;15680:319::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15680:319:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15680:319:0;-1:-1:-1;;;;;15680:319:0;;:::i;20200:1145::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20200:1145:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20200:1145:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5351:241;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5351:241:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5351:241:0;;;;;;;;:::i;4456:272::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4456:272:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4456:272:0;-1:-1:-1;;;;;4456:272:0;;:::i;6016:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6016:78:0;;;:::i;16057:350::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16057:350:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16057:350:0;-1:-1:-1;;;;;16057:350:0;;:::i;17801:721::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17801:721:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3722:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3722:79:0;;;:::i;:::-;;;;-1:-1:-1;;;;;3722:79:0;;;;;;;;;;;;;;23687:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23687:166:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23687:166:0;;;;;;;;-1:-1:-1;;;;;23687:166:0;;:::i;:::-;;;;;;;;;;;;;;;;23424:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23424:178:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23424:178:0;;;;;;;;-1:-1:-1;;;;;23424:178:0;;:::i;32635:120::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32635:120:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32635:120:0;-1:-1:-1;;;;;32635:120:0;;:::i;7563:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7563:28:0;;;:::i;15013:423::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15013:423:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15013:423:0;;;;;;;;-1:-1:-1;;;;;15013:423:0;;:::i;4958:339::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4958:339:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4958:339:0;;;;;;;;;;;;;;;;;:::i;21696:659::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21696:659:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21696:659:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12526:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12526:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12526:110:0;;;;:::i;12370:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12370:96:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14316:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14316:172:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14316:172:0;;;;;;;;;:::i;22409:705::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22409:705:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22409:705:0;-1:-1:-1;;;;;22409:705:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4152:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4152:248:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4152:248:0;-1:-1:-1;;;;;4152:248:0;;:::i;23184:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23184:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23184: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;23184:158:0;;;;;;;;;;;;;;;;;6016:78;6079:7;;-1:-1:-1;;;6079:7:0;;;;6016:78;;:::o;26444:990::-;26496:18;26503:11;;26496:18;:::i;:::-;26525:16;26532:9;;26525:16;:::i;:::-;26570:2;;:26;;;-1:-1:-1;;;;;26570:26:0;;26585:10;26570:26;;;;;;-1:-1:-1;;;;;26570:2:0;;;;:14;;:26;;;;;;;;;;;;;;;:2;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;26570:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26570:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26570:26:0;;26554:42;;-1:-1:-1;;26554:42:0;;;;;;;;;;26619:29;;;;26607:9;:41;26680:10;-1:-1:-1;26701:726:0;26723:32;26719:1;:36;;;26701:726;;;26800:2;;:21;;;-1:-1:-1;;;;;26800:21:0;;-1:-1:-1;;;;;26800:21:0;;;;;;;;;26777:20;;26800:2;;;;;:11;;:21;;;;;;;;;;;;;;;:2;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;26800:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26800:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26800:21:0;;-1:-1:-1;;;;;;26842:24:0;;;;;;;26838:52;;;26885:5;;;26838:52;26911:2;;:25;;;-1:-1:-1;;;;;26911:25:0;;-1:-1:-1;;;;;26911:25:0;;;;;;;;;:29;;;;:2;;;;;:11;;:25;;;;;;;;;;;;;;;:2;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;26911:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26911:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26911:25:0;:29;26907:469;;;26987:7;;-1:-1:-1;;;26987:7:0;;;;26966:29;;;;:20;:29;;;;;;;;-1:-1:-1;;;;;26966:43:0;;;;;;;;;;;;26961:212;;27053:7;;;;-1:-1:-1;;;27053:7:0;;;;;;27034:27;;;;:18;:27;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;27034:46:0;;;;;;;;;-1:-1:-1;;;;;27034:46:0;;-1:-1:-1;;;;;;27034:46:0;;;;;;;;27124:7;;;;;;;;;27103:29;;:20;:29;;;;;:43;;;;;;;;;;:50;;-1:-1:-1;;27103:50:0;;;;;;26961:212;27205:43;27219:25;27245:1;27219:28;;;;;;;;;;;;;;;;;27205:9;;;27219:28;;;;;;;;;;27205:13;:43::i;:::-;27193:9;:55;27267:9;27282:25;:28;;;;;;;;;;;;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;27267:44:0;;;;;;;;;;;;;;27282:28;;;27267:44;;;;;27282:28;27267:44;;;;;;;;;;27282:28;;;;;;;;;;;;;;27267:44;;;;;;27330:11;27:10:-1;;23:18;;;45:23;;27330:30:0;;;;;;;-1:-1:-1;;;;;;27330:30:0;-1:-1:-1;;;;;27330:30:0;;;;;26907:469;27403:12;-1:-1:-1;26757:3:0;;26701:726;;;;26444:990;:::o;13785:126::-;13840:7;13867:36;13895:7;13867:23;13878:11;;13867:6;:10;;:23;;;;:::i;:36::-;13860:43;;13785:126;;;;:::o;27483:1214::-;27531:7;27540;27560:21;27584:19;27596:6;;;;;;;;;;;27584:11;:19::i;:::-;27663:6;;-1:-1:-1;;;27663:6:0;;;;27614:18;27649:21;;;:13;:21;;;;;;27560:43;;-1:-1:-1;27614:18:0;27560:43;;27649:36;;27675:9;27649:25;:36::i;:::-;:52;27645:1045;;;27800:6;;-1:-1:-1;;;27800:6:0;;;;27748:17;27786:21;;;:13;:21;;;;;;27768:40;;:13;;:17;:40::i;:::-;27748:60;-1:-1:-1;27857:19:0;27879:24;:9;27748:60;27879:24;:13;:24;:::i;:::-;27857:46;;27949:18;27957:9;27949:7;:18::i;:::-;28031:17;28038:9;28031:6;:17::i;:::-;28018:30;;28095:39;28112:10;28124:9;28095:16;:39::i;:::-;28088:47;;;;28157:12;:10;:12::i;:::-;28150:20;;;;28195:10;;-1:-1:-1;28207:11:0;;-1:-1:-1;28187:32:0;;-1:-1:-1;;28187:32:0;27645:1045;28281:18;28289:9;28281:7;:18::i;:::-;28363:17;28370:9;28363:6;:17::i;:::-;28350:30;;28427:39;28444:10;28456:9;28427:16;:39::i;:::-;28420:47;;;;28576:6;;-1:-1:-1;;;28576:6:0;;;;28562:21;;;;:13;:21;;;;;;28545:38;;28541:99;;;28611:12;:10;:12::i;:::-;28604:20;;;;28664:10;-1:-1:-1;28676:1:0;;-1:-1:-1;28656:22:0;;-1:-1:-1;28656:22:0;27483:1214;;;;:::o;274:141::-;358:5;;;381:6;;;;374:14;;;;274:141;;;;:::o;553:123::-;611:7;643:1;638;:6;;631:14;;;;-1:-1:-1;663:5:0;;;553:123::o;13961:126::-;14067:11;;14016:7;;14043:36;;:19;:6;14054:7;14043:19;:10;:19;:::i;1115:187::-;1173:7;1204:1;1200;:5;1193:13;;;;1217:9;1233:1;1229;:5;;;;;;1217:17;;1269:1;1265;:5;;;;;;1261:1;1257;:5;:13;1252:1;:18;1245:26;;;;1293:1;1289;:5;;;;;;;1115:187;-1:-1:-1;;;;1115:187:0:o;30417:366::-;30506:11;;30475:4;;30506:18;;30522:1;30506:18;:15;:18;:::i;:::-;30492:11;:32;30548:8;;:20;;30561:6;30548:20;:12;:20;:::i;:::-;30537:8;:31;30625:10;30609:27;;;;:15;:27;;;;;;:39;;30641:6;30609:39;:31;:39;:::i;:::-;30595:10;30579:27;;;;:15;:27;;;;;;;;:69;;;;30668:2;;:31;;-1:-1:-1;;;;;30668:31:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30668:2:0;;;;:11;;:31;;;;;;;;;;;;;:2;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;30668:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30668:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30668:31:0;30661:39;;;;30716:37;;;;;;;;30734:10;;30716:37;;;;;;;;;;-1:-1:-1;30771:4:0;30417:366;;;:::o;30847:404::-;30946:15;;30911:4;;30946:22;;30966:1;30946:22;:19;:22;:::i;:::-;30928:15;:40;30996:12;;:24;;31013:6;30996:24;:16;:24;:::i;:::-;30981:12;:39;31089:10;31067:33;;;;:21;:33;;;;;;:45;;31105:6;31067:45;:37;:45;:::i;:::-;31053:10;31031:33;;;;:21;:33;;;;;;;;:81;;;;31132:2;;:31;;-1:-1:-1;;;;;31132:31:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31132:2:0;;;;:11;;:31;;;;;;;;;;;;;:2;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;31132:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31132:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31132:31:0;31125:39;;;;31180:41;;;;;;;;31202:10;;31180:41;;;;;;;;;;-1:-1:-1;31239:4:0;30847:404;;;:::o;31864:717::-;31962:9;31940:19;31982:483;32005:9;:16;32001:20;;;;31982:483;;;32043:19;32065:36;32097:3;32065:27;32079:9;32089:1;32079:12;;;;;;;;;;;;;;;;;;;;;;;32065:9;;32079:12;;;;;;;;;;32065:13;:27::i;:36::-;32043:58;;32116:26;32161:11;32173:1;32161:14;;;;;;;;;;;;;;;;;;;;32212:15;;-1:-1:-1;;;;;32161:14:0;;;;-1:-1:-1;32212:32:0;;32232:11;32212:32;:19;:32;:::i;:::-;32194:15;:50;-1:-1:-1;;;;;32296:34:0;;;;;;:22;:34;;;;;;:51;;32335:11;32296:51;:38;:51;:::i;:::-;-1:-1:-1;;;;;32259:34:0;;;;;;:22;:34;;;;;:88;32376:28;:11;32392;32376:28;:15;:28;:::i;:::-;32421:32;;32362:42;;-1:-1:-1;;;;;;32421:19:0;;;:32;;;;;32441:11;;32421:32;;;;32441:11;32421:19;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;32023:3:0;;31982:483;;;-1:-1:-1;32481:9:0;;:13;32477:96;;32523:50;32539:33;32568:3;32539:24;32553:9;;32539;:13;;:24;;;;:::i;:33::-;32523:11;;;:50;:15;:50;:::i;:::-;32509:11;:64;31864:717;;:::o;770:202::-;828:9;854:6;850:47;;-1:-1:-1;884:1:0;877:8;;850:47;-1:-1:-1;911:5:0;;;915:1;911;:5;:1;934:5;;;;;:10;927:18;;;6384:281;3948:6;;-1:-1:-1;;;;;3948:6:0;3934:10;:20;3926:29;;;;;;6449:7;;-1:-1:-1;;;6449:7:0;;;;:17;;;;;6461:5;6460:6;6449:17;6445:213;;;6483:7;:15;;-1:-1:-1;;;;;;6483:15:0;;;6518:20;;;6527:10;6518:20;;;;;;;;;;;;;6445:213;;;6561:7;;-1:-1:-1;;;6561:7:0;;;;6560:8;:17;;;;;6572:5;6560:17;6556:102;;;6604:4;6594:14;;-1:-1:-1;;;;;;6594:14:0;-1:-1:-1;;;6594:14:0;;;6628:18;;;6635:10;6628:18;;;;;;;;;;;;;6556:102;6384:281;:::o;16454:1303::-;17238:11;;17275:9;;16493:23;;;;;;;;;;;;;;;;;;;;;;17275:9;;;;-1:-1:-1;;;17266:6:0;;;;:18;17262:180;;;17309:9;;;;;;;-1:-1:-1;17342:10:0;;;;;;-1:-1:-1;17262:180:0;;;17393:6;;;-1:-1:-1;;;17393:6:0;;;;;-1:-1:-1;;;;17423:7:0;;;;;-1:-1:-1;17262:180:0;17467:11;;17454:24;;17512:14;;17489:37;;17545:4;;17539:10;;17568:6;;17560:14;;17598:11;;17585:24;;17637:15;;17620:32;;17674:9;;17663:20;;17704:8;;17694:18;;17737:12;;17723:26;;16454:1303;;;;;;;;;;;;:::o;13110:125::-;-1:-1:-1;;;;;13199:28:0;13175:4;13199:28;;;:19;:28;;;;;;;;;13110:125::o;13305:194::-;3948:6;;-1:-1:-1;;;;;3948:6:0;3934:10;:20;3926:29;;;;;;-1:-1:-1;;;;;13394:28:0;;;;;;:19;:28;;;;;;;;;:36;;-1:-1:-1;;13394:36:0;;;;;;;;;;13446:45;;;;;;;;;;;;;;;;;13305:194;;:::o;12876:164::-;12782:10;12762:31;;;;:19;:31;;;;;;;;12754:40;;;;;;12956:11;:19;;;12991:41;;;;;;;;13021:10;;12991:41;;;;;;;;;;12876:164;:::o;15680:319::-;3948:6;;-1:-1:-1;;;;;3948:6:0;3934:10;:20;3926:29;;;;;;15755:19;15777:15;:13;:15::i;:::-;15755:37;-1:-1:-1;;;;;;15811:16:0;;15803:25;;;;;;15865:21;;:38;;15891:11;15865:38;:25;:38;:::i;:::-;15841:21;:62;15919:37;;;;;;;;-1:-1:-1;;;;;15919:37:0;;;;;;;;;;;;;15967:24;;-1:-1:-1;;;;;15967:11:0;;;:24;;;;;15979:11;;15967:24;;;;15979:11;15967;:24;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15967:24:0;3966:1;15680:319;:::o;20200:1145::-;20261:18;20347:13;20428:16;20512:14;20594;20676:17;20761:15;20844:24;20898:9;;;;;;;;;;;20885:22;;:10;:22;;;20881:86;;;-1:-1:-1;20932:1:0;;-1:-1:-1;20932:1:0;;-1:-1:-1;20932:1:0;;-1:-1:-1;20932:1:0;;-1:-1:-1;20932:1:0;;-1:-1:-1;20932:1:0;;-1:-1:-1;20932:1:0;;-1:-1:-1;20932:1:0;20924:31;;20881:86;20992:27;21008:10;20992:15;:27::i;:::-;21041:26;;;;;;;:14;:26;;;;;;20979:40;;-1:-1:-1;21041:26:0;-1:-1:-1;21086:22:0;21056:10;21086;:22::i;:::-;21078:30;-1:-1:-1;21130:17:0;21078:30;21140:6;21130:17;:9;:17;:::i;:::-;21170:25;;;;;;;:13;:25;;;;;;21119:28;;-1:-1:-1;21170:25:0;-1:-1:-1;21215:23:0;21184:10;21215:11;:23::i;:::-;21206:32;-1:-1:-1;21261:19:0;21206:32;21272:7;21261:19;:10;:19;:::i;:::-;21249:31;;21312:25;21326:10;21312:13;:25::i;:::-;21293:44;;20200:1145;;;;;;;;;;:::o;5351:241::-;3948:6;;-1:-1:-1;;;;;3948:6:0;3934:10;:20;3926:29;;;;;;-1:-1:-1;;;;;5448:16:0;;5440:25;;;;;;5502:4;5494:21;5534:17;;;;5526:26;;;;;;5565:19;;-1:-1:-1;;;;;5565:11:0;;;:19;;;;;5577:6;;5565:19;;;;5577:6;5565:11;:19;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5565:19:0;3966:1;5351:241;;:::o;4456:272::-;3948:6;;-1:-1:-1;;;;;3948:6:0;3934:10;:20;3926:29;;;;;;-1:-1:-1;;;;;4547:25:0;;4539:34;;;;;;4613:9;;;-1:-1:-1;;;;;4633:23:0;;;-1:-1:-1;;;;;;4633:23:0;;;;;;;4672:48;;4613:9;;;4633:23;4613:9;;4672:48;;4584:26;;4672:48;3966:1;4456:272;:::o;16057:350::-;3948:6;;-1:-1:-1;;;;;3948:6:0;3934:10;:20;3926:29;;;;;;16129:19;16151:78;16220:8;;16151:64;16203:11;;16151:47;16185:12;;16151:29;16164:15;;16151:8;;:12;;:29;;;;:::i;:78::-;16129:100;-1:-1:-1;;;;;;16248:16:0;;16240:25;;;;;;16289:8;;:25;;16302:11;16289:25;:12;:25;:::i;:::-;16278:8;:36;16330:34;;;;;;;;-1:-1:-1;;;;;16330:34:0;;;;;;;;;;;;;16375:24;;-1:-1:-1;;;;;16375:11:0;;;:24;;;;;16387:11;;16375:24;;;;16387:11;16375;:24;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;17801:721:0;18257:8;;18298:15;;18338:12;;18371:8;;18403:11;;18448:21;;17836:15;18499;:13;:15::i;:::-;18480:34;;17801:721;;;;;;;:::o;3722:79::-;3760:7;3787:6;-1:-1:-1;;;;;3787:6:0;3722:79;:::o;23687:166::-;23802:34;;;23775:7;23802:34;;;:20;:34;;;;;;;;-1:-1:-1;;;;;23802:43:0;;;;;;;;;;23687:166;;;;:::o;23424:178::-;23545:40;;;23518:7;23545:40;;;:26;:40;;;;;;;;-1:-1:-1;;;;;23545:49:0;;;;;;;;;;23424:178;;;;:::o;32635:120::-;3948:6;;-1:-1:-1;;;;;3948:6:0;3934:10;:20;3926:29;;;;;;32702:7;:17;;-1:-1:-1;;;;;32702:17:0;;;-1:-1:-1;;;;;;32702:17:0;;;;;;;;32730:2;:17;;;;;;;;32635:120::o;7563:28::-;;;-1:-1:-1;;;;;7563:28:0;;:::o;15013:423::-;3948:6;;-1:-1:-1;;;;;3948:6:0;3934:10;:20;3926:29;;;;;;15110:19;15132:34;15153:12;15132:20;:34::i;:::-;15110:56;-1:-1:-1;;;;;;15185:16:0;;15177:25;;;;;;15260:42;;;;;;;:28;:42;;;;;;:59;;15307:11;15260:59;:46;:59;:::i;:::-;15215:42;;;;;;;:28;:42;;;;;;;;;:104;;;;15335:58;;;;;;;;;;;;;-1:-1:-1;;;;;15335:58:0;;;;;;;;;;;15404:24;;-1:-1:-1;;;;;15404:11:0;;;:24;;;;;15416:11;;15404:24;;;;15416:11;15404;:24;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;4958:339:0;3948:6;;-1:-1:-1;;;;;3948:6:0;3934:10;:20;3926:29;;;;;;5086:9;-1:-1:-1;;;;;5115:22:0;;5107:31;;;;;;5167;;;-1:-1:-1;;;;;5167:31:0;;5192:4;5167:31;;;;;;5149:15;;-1:-1:-1;;;;;5167:16:0;;;;;:31;;;;;;;;;;;;;;;:16;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;5167:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5167:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5167:31:0;;-1:-1:-1;5217:17:0;;;;5209:26;;;;;;5255:6;-1:-1:-1;;;;;5255:15:0;;5271:8;5281:6;5255:33;;;;;;;;;;;;;-1:-1:-1;;;;;5255:33:0;-1:-1:-1;;;;;5255:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5255:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5255:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5255:33:0;5248:41;;;;3966:1;;4958:339;;;:::o;21696:659::-;22120:28;;;21769:15;22120:28;;;:14;:28;;;;;;;;;22173:18;:32;;;;;;22240:28;:42;;;;;;;22120:28;;22313:34;22135:12;22313:20;:34::i;:::-;22293:54;;21696:659;;;;;:::o;12526:110::-;3948:6;;-1:-1:-1;;;;;3948:6:0;3934:10;:20;3926:29;;;;;;12601:15;:27;;;;;;-1:-1:-1;;;12601:27:0;-1:-1:-1;;12601:27:0;;;;;;;;;12526:110::o;12370:96::-;12443:15;;-1:-1:-1;;;12443:15:0;;;;;12370:96::o;14316:172::-;14398:7;14425:55;14452:27;14468:10;14452:15;:27::i;:::-;14425:22;:9;14439:7;14425:22;:13;:22;:::i;:55::-;14418:62;14316:172;-1:-1:-1;;;14316:172:0:o;22409:705::-;-1:-1:-1;;;;;22860:25:0;22469:16;22860:25;;;:16;:25;;;;;;;;;22906:15;:24;;;;;;22957:21;:30;;;;;;23013:20;:29;;;;;;23075:22;:31;;;;;;;;22860:25;;22957:30;;23013:29;22409:705::o;4152:248::-;3948:6;;-1:-1:-1;;;;;3948:6:0;3934:10;:20;3926:29;;;;;;-1:-1:-1;;;;;4235:22:0;;4227:31;;;;;;4269:23;4295:6;;-1:-1:-1;;;;;4312:17:0;;;-1:-1:-1;;;;;;4312:17:0;;;;;;4345:47;;4295:6;;;;;;;4345:47;;4269:23;4345:47;3966:1;4152:248;:::o;23184:158::-;23302:32;;;;;;;:18;:32;;;;;;;;;23291:43;;;;;;;;;;;;;;;;;23253:25;;23291:43;;;23302:32;23291:43;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23291:43:0;;;;;;;;;;;;;;;;;;;;;;;23184:158;;;:::o;19620:293::-;19682:7;19702:16;19721:59;19745:34;19768:10;19745:34;;:18;;:22;;:34;;;;:::i;:::-;19721:19;;;:59;:23;:59;:::i;:::-;19702:78;;19808:17;;19797:8;:28;19793:85;;;-1:-1:-1;;19849:17:0;;19842:24;;28748:1069;28803:17;28823:18;28831:9;28823:7;:18::i;:::-;28803:38;;28852:21;28876:26;28892:9;28876:15;:26::i;:::-;28992:7;;-1:-1:-1;;;28992:7:0;;;;28965:35;;;;:26;:35;;;;;;;;29001:10;28965:47;;;;;;;;28852:50;;-1:-1:-1;28965:62:0;;29017:9;28965:51;:62::i;:::-;28942:7;;;;-1:-1:-1;;;28942:7:0;;;;;28915:35;;;;:26;:35;;;;;;;;28951:10;28915:47;;;;;;;:112;;;;29122:6;;-1:-1:-1;;;29122:6:0;;;;;29108:21;;:13;:21;;;;;:36;;29134:9;29108:36;:25;:36;:::i;:::-;29098:6;;;;-1:-1:-1;;;29098:6:0;;;;;29084:21;;;;:13;:21;;;;;;;;:60;;;;29236:7;;-1:-1:-1;;;29236:7:0;;;;;29221:23;;:14;:23;;;;;:38;;29249:9;29221:38;:27;:38;:::i;:::-;29210:7;;;;-1:-1:-1;;;29210:7:0;;;;;;29195:23;;;;:14;:23;;;;;;;;:64;;;;29356:7;;;;;;;29337:27;;:18;:27;;;;;:46;;29369:13;29337:46;:31;:46;:::i;:::-;29326:7;;-1:-1:-1;;;29326:7:0;;;;29307:27;;;;:18;:27;;;;;:76;29439:12;;:31;;29456:13;29439:16;:31::i;:::-;29424:12;:46;29580:13;;;;29576:234;;;29615:8;29610:189;29633:9;:16;29629:20;;;;29610:189;;;29744:7;;;-1:-1:-1;;;29744:7:0;;;;;29723:29;;;;:20;:29;;;;;29753:11;:14;;29723:60;;29773:9;;29723:29;29753:11;:14;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29753:14:0;29723:45;;;;;;;;;;;;;;:60;:49;:60;:::i;:::-;29696:7;;;-1:-1:-1;;;29696:7:0;;;;;29675:29;;;;:20;:29;;;;;29705:11;:14;;29675:29;;29705:11;;:14;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29705:14:0;29675:45;;;;;;;;;;;;:108;29705:14;29651:3;29610:189;;14136:131;14247:11;;14193:7;;14220:39;;:22;:9;14234:7;14220:22;:13;:22;:::i;29876:483::-;29980:6;;29954:4;;29980:13;;29991:1;29980:13;:10;:13;:::i;:::-;29971:6;:22;30018:9;;:21;;30032:6;30018:21;:13;:21;:::i;:::-;30006:9;:33;30090:6;;-1:-1:-1;;;30090:6:0;;;;30075:22;;;;:14;:22;;;;;;:34;;30102:6;30075:26;:34::i;:::-;30065:6;;-1:-1:-1;;;30065:6:0;;;;30050:22;;;;:14;:22;;;;;;;;:59;;;;30168:10;30151:28;;:16;:28;;;;:40;;30184:6;30151:32;:40::i;:::-;30137:10;30120:28;;;;:16;:28;;;;;;;;:71;;;;30211:2;;:31;;-1:-1:-1;;;;;30211:31:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30211:2:0;;;;:11;;:31;;;;;;;;;;;;;:2;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;30211:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30211:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30211:31:0;30204:39;;;;30278:6;;30306:11;;30259:70;;;30278:6;-1:-1:-1;;;30278:6:0;;;;;;;30259:70;;;;;;;;;;;;;;;;;;;;;;30286:10;;30259:70;;;;;;;;;;-1:-1:-1;30347:4:0;29876:483;;;;:::o;31306:486::-;31379:6;;31367:31;;;-1:-1:-1;;;31379:6:0;;;;;31367:31;;;31345:4;;31387:10;;31367:31;;;;;;;;;;31418:6;;:13;;-1:-1:-1;;;31418:6:0;;;;31429:1;31418:10;:13::i;:::-;31409:6;:22;;-1:-1:-1;;31409:22:0;-1:-1:-1;;;31409:22:0;;;;;;;;;;;;;;31456:23;;31472:6;;;31456:15;:23::i;:::-;31442:11;:37;31521:6;;31507:21;;-1:-1:-1;;;31521:6:0;;;;31507:13;:21::i;:::-;31490:14;:38;31609:6;;31574:21;;31598:18;;-1:-1:-1;;;31609:6:0;;;;31598:10;:18::i;:::-;31631:7;;31574:42;;-1:-1:-1;31631:24:0;;;;-1:-1:-1;;;31631:7:0;;;;:24;31627:134;;;31690:7;;31677:33;;;31690:7;-1:-1:-1;;;31690:7:0;;;;;;;31677:33;;;31699:10;;31677:33;;;;;;;;;;31725:7;:24;;-1:-1:-1;;31725:24:0;-1:-1:-1;;;31725:24:0;;;;;;;31627:134;31780:4;31773:11;;;31306:486;:::o;15499:120::-;15546:7;15573:38;15589:21;;15573:11;;:15;;:38;;;;:::i;:::-;15566:45;;15499:120;:::o;13577:158::-;13643:7;13670:57;13693:33;13715:10;13693:33;;:17;;:21;;:33;;;;:::i;:::-;13670:18;;;:57;:22;:57;:::i;19985:146::-;20046:7;20073:50;20087:23;20099:10;20087:11;:23::i;:::-;20112:10;20073:13;:50::i;19137:181::-;19299:9;;19254:24;;19201:7;;19228:82;;19254:55;;19299:9;;;;;19254:40;;;;;:28;:40;:::i;:55::-;19228:21;;;:82;:25;:82;:::i;21417:188::-;21554:42;;;21490:7;21554:42;;;:28;:42;;;;;;;;;21517:18;:32;;;;;;:80;;;:36;:80;:::i;19383:154::-;19449:7;19476:53;19484:44;19518:9;19484:29;19498:14;;19484:9;:13;;:29;;;;:::i;:44::-;19476:7;:53::i;1816:138::-;1897:5;;;1920:6;;;;;;;;;1913:14;;;14568:364;14629:6;14652:14;;;;14648:256;;14722:13;;14683:21;;14707:29;;14722:13;14707:14;;;;14722:13;;;;14707:29;:14;:29;:::i;:::-;14772:13;;14683:53;;-1:-1:-1;14789:1:0;;14757:29;;14772:13;14757:14;;;;14772:13;;;;14757:29;:14;:29;:::i;:::-;:33;;;14753:102;;;14818:21;:18;;;14837:1;14818:21;:18;:21;:::i;:::-;14811:28;;;;;14753:102;14878:14;-1:-1:-1;14871:21:0;;14648:256;-1:-1:-1;14923:1:0;14568:364;;;:::o;2648:184::-;2704:6;2734:1;2730;:5;;;2723:13;;;;2747:9;2763:1;2759:5;;:1;:5;;;;;;;;2747:17;;;;2799:1;2795:5;;:1;:5;;;;;;;;2787:13;;2791:1;2787;:5;;;:13;2782:1;:18;;;2775:26;;;;2823:1;2819:5;;:1;:5;;;;;;2993:121;3049:6;3076;;;3068:15;;;;;;3105:1;3101:5;;:1;:5;;;;;;;;;2993:121;-1:-1:-1;;;2993:121:0:o;7396:25362::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://5a5e398e7e7cdea43030af6dbb8a9d359b06d081af919e1b6eb68a86dc6d5c68

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.