Contract 0x8888882056160e5ff4a0f26607d4a05bc506ca8c

 

Contract Overview

Balance:
31.617205923246400838 Ether

EtherValue:
$3,929.70 (@ $124.29/ETH)
TxHash Block Age From To Value [TxFee]
0x38b552393743239282ea7d6244622e47381ae24cedb4b413fdeaa51018daebc3722681723 hrs ago0xd8942fa0ffd720c790d36dbc9acb52cc0b9ffb1a  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0 Ether0.000114855
0xca06652288ef654529324bebea6343e2eb075647f9fe2b40a68a1d803acc8af1722679923 hrs 4 mins ago0x9afe5c5b03a97ec9b47ac873580a789329db3028  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0 Ether0.000114855
0x6e5f78b8e340d920d45c17d047a3237c5ebe274256871bc6d1e73f31fb8b8f05722679923 hrs 4 mins ago0xf84750e8242af23b1a298cbef8a8387d12af3d35  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0 Ether0.000114855
0x6d148d8812c06f808ce9c3097ce2e51d58db79ba4d4519b83e10bbc9f6aba27d722679923 hrs 4 mins ago0x2b33599817b5bd6314f61a5e7655241192dc25d2  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0 Ether0.000114855
0x668cee544a03866d727096519c05f5226f34ccca231c1851ab1652f53df8bf77722679923 hrs 4 mins ago0x2b33599817b5bd6314f61a5e7655241192dc25d2  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0 Ether0.000114855
0x007abb7952be50c3aa8586fbcca7d15e665c5f891737dd84d693807be82d0bce722679923 hrs 4 mins ago0xbf2e5546469239df9ed2c92189b6b60680f454c2  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0 Ether0.000114855
0x0de69891f68772e41f7b24b054d3e923550799233d97cf8d7764fc6c86bdd5d9722679923 hrs 4 mins ago0xf84750e8242af23b1a298cbef8a8387d12af3d35  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0 Ether0.00289276
0xa392cb8bd7c9463bb87f29e9d9524b0359c52d6dff3a31c6351c7e65a3a7819172265501 day 35 mins ago0xf84750e8242af23b1a298cbef8a8387d12af3d35  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.10000001 Ether0.002203563
0x9ab12e279bfb90429d7b20663c3fd6e7660df372a27ad448bc8a8400e6cb96b372264811 day 1 hr ago0x0c177503b833f406c43e5a3fafe8509576cae062  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.00200001 Ether0.004284475
0xfba1a67617d73b8f7c4d262f27a72bec27abd55ff84156c2e9b16f3a3e5f965372264531 day 1 hr ago0xd8942fa0ffd720c790d36dbc9acb52cc0b9ffb1a  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.00200001 Ether0.00360209
0xbf8544a8e7f4204fd316a62b6dc467e977a986ffe0d677cb7be119b1424369e872263901 day 1 hr ago0xfac6fce12088834969e1072991c1a2c5b49ec0db  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.02000001 Ether0.00360209
0xb39fbb81cb52b37a0efc7adccfdbebf49576085f1604d4bb0700ded7cc93cba272263081 day 1 hr ago0x45e9494240e5acf4a276e05822f77b610d0d2ac8  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.00400001 Ether0.00360209
0x716f8d816adf70eccd18dae70a65f36c5025eddaa26d82f5ce7165d1710a279772262041 day 2 hrs ago0x43120eea585f93fd1a2b2afe34dced13bb00c44c  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.01000001 Ether0.001738988
0x37f4c87a6b42db8fb282bcd3053ea9d63beded3a8a2bc0c7fc646d65013aeb4872261921 day 2 hrs ago0x7b2a4f36f6679b969a4626c7b12b2f2cb9fec6da  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.02000001 Ether0.00386228
0x55848155e7537ff9b69186388dbb6f99cefc2e3185dc48896be47ad26cd2305a72261691 day 2 hrs ago0xbf2e5546469239df9ed2c92189b6b60680f454c2  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.00200001 Ether0.00226533
0x8678f52a754a74d5440ea055a05f7bc57d5cbdf83e9f982ada13675bda63659b72261241 day 2 hrs ago0x905704544f78f9b64a7efef4d233ab677495fd49  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.10000001 Ether0.00368783
0x6abfe7c71778d67b289cbc823ae583e3309019e3c5fb20819641350dd7d37d1072259851 day 3 hrs ago0xb3a062699681c96393af67d113224033c071b0b5  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.00200001 Ether0.001544516
0x7d1cc85750593ab83b1406b3964d4292dbb29690fc2c2e5d25b42319c87c821372259591 day 3 hrs ago0xf84750e8242af23b1a298cbef8a8387d12af3d35  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.00200001 Ether0.002458812
0x1f4089a378deae348c4f1c42a5cc2f29444146fb69f4d74b33fbc7187200842872259511 day 3 hrs ago0xc3d398e4ed7af0b9a24590e275f31fb09db16a2c  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.10000001 Ether0.00377456
0xc56a8a17e5a624dae2bd51bf351d187b844a955bfd2f4f050fa4d19b733dff9b72259421 day 3 hrs ago0x2b33599817b5bd6314f61a5e7655241192dc25d2  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.00200001 Ether0.002406774
0x915d96fc94d8528938825ecb49044ab8ede26c29927e5a4b6797b82b9bad542272259281 day 3 hrs ago0x42bd9fa22eb5dea32f02eeaf8d36625c6aa152f1  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.02200001 Ether0.0036761
0xec52a7a64d77bee36cfa9fa5b8c48666d7d913c6d1a4cf32248ff4eb6c31d8cd72259211 day 3 hrs ago0xd8c2acd0eae46b5760857da92519826143f8337c  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.00200001 Ether0.007148446
0x194f2e960c44ab8ac37e1343939307ca864a83b2fc227c0de5d52106f099d2b872258381 day 4 hrs ago0x4b657dab9d40c275cf60bdbcd079d71dd3759b14  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.00200001 Ether0.003893035
0xd13379d99076aff23c35d56aad7e868ee31f3a5eb670e52d90a6ce4aaaf4598d72258311 day 4 hrs ago0x0e233c69426b21f354c87b08f7f891e1acd9a77e  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.00200001 Ether0.00334866
0x08ba4cea6ba6f21a1895ddf580c65d4480a5700bd1408428232e2a8fc322878272258311 day 4 hrs ago0x0e233c69426b21f354c87b08f7f891e1acd9a77e  IN   0x8888882056160e5ff4a0f26607d4a05bc506ca8c0.002000001 Ether0.003322845
[ Download CSV Export 

Latest 25 Internal Transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x5e9eafcc78d682912ae90e7b0266c5a3b9d8f347a0116cce61d6acbd4bc3f28b72300924 hrs 14 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.00704478757251838 Ether
0x293694a3b5ea5841debd4b71439eb00230216a8fe6224b062d01a44572fe57e172297796 hrs 9 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.002201230670902031 Ether
0x9f2eda475bd23b3ca6c6244730a9ca1e38aa122d142dc9a9dbb862450c6b77dd72297756 hrs 10 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.002688717577961585 Ether
0xf9dc672ba43217afb3b6cc4c9aaced47f37a97e45a5d741451da950008e7c811722846413 hrs 32 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.000082072216156249 Ether
0x13fe7049a6bae82cda7d3137aba520e8dc51c9448b71df0e7a7743fd0c74f3d5722846413 hrs 32 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.006163201431979933 Ether
0xe3be6a55a7a838dd8f57916382d01a286c278dfc8ca509e055de1de050457e58722830814 hrs 23 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.011205350835318724 Ether
0x0cc2506ab2f91dcf25aef93c8145d3e78bff79fd68413cfdfbf5792cfe6d576f722817215 hrs 9 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.000673453591554833 Ether
0xf806ff6a229ff5a4c95fb364dbe15ee70052f3f4ea469b990fb5c96c95af9f9b722807015 hrs 45 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.009114593816160366 Ether
0xabb9153a8e83a6cb4746c07b1041cd700f8521c0c62e46014eaf60f43acaf678722793016 hrs 31 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.011020142964437027 Ether
0x4c830ce14cad0a42dac751e203dcb439a32ee887e1010c6bcaff1e5a1adb966e722757618 hrs 29 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.000213556662190978 Ether
0x4522c8bb519adb84e03648f938506b269bfbfd309e5397fce244808ded33f55e722747119 hrs 2 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.005310116435047878 Ether
0xd821ae9622d17c05a6067325505cc589e34bddd259685dd6f622ca68fc57a6b5722746519 hrs 4 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.032583241598470815 Ether
0x8d049a025968052744c6f5baef01459b704929ce71b2abbb40a253d587c30ab5722738119 hrs 28 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.010596950352195975 Ether
0x662c1411302efc93c251feb4863f999f0993aa1ae231c20e8f27db837bc5061f722714520 hrs 57 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.00116759365635882 Ether
0x2449290264114fa2c73f78f91eb9667492f269df8ec3b3af4e1a4d0f7790b104722702621 hrs 39 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.018328306204415833 Ether
0x231f8681d624f1d3be40612e221b6a5640399ff795d3eb744004c25bda6ccb34722689822 hrs 26 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.000123288021094394 Ether
0xbebffe6ae20a65df1ddad4e0c6cd4a13a45f5b1c469e99e073a60187736c8b46722681323 hrs 1 min ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.039333916516527866 Ether
0x0de69891f68772e41f7b24b054d3e923550799233d97cf8d7764fc6c86bdd5d9722679923 hrs 4 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0x81c04a2a864d6e50244a869a8f5e9b639eaff4980.008392247924333559 Ether
0x0de69891f68772e41f7b24b054d3e923550799233d97cf8d7764fc6c86bdd5d9722679923 hrs 4 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0x8888887c5ede327afbeb15019598aaa3b4fae7590.143867107274289588 Ether
0xa392cb8bd7c9463bb87f29e9d9524b0359c52d6dff3a31c6351c7e65a3a7819172265501 day 35 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0x8888887c5ede327afbeb15019598aaa3b4fae7590.0010000001 Ether
0xa392cb8bd7c9463bb87f29e9d9524b0359c52d6dff3a31c6351c7e65a3a7819172265501 day 35 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0x8888887c5ede327afbeb15019598aaa3b4fae7590.0120000012 Ether
0xa392cb8bd7c9463bb87f29e9d9524b0359c52d6dff3a31c6351c7e65a3a7819172265501 day 35 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xd7657bdf782f43ba7f5f5e8456b481616e636ae90.0150000015 Ether
0x412e45847727715b2ce39b0e6424e95c76dc4dc64db85c56d1ca0e17092c982c72264911 day 55 mins ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0xdf18880a02c7f3eb4f40fdf515fce31c1cb7ef660.000001089114356435 Ether
0x9ab12e279bfb90429d7b20663c3fd6e7660df372a27ad448bc8a8400e6cb96b372264811 day 1 hr ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0x8888887c5ede327afbeb15019598aaa3b4fae7590.0000200001 Ether
0x9ab12e279bfb90429d7b20663c3fd6e7660df372a27ad448bc8a8400e6cb96b372264811 day 1 hr ago0x8888882056160e5ff4a0f26607d4a05bc506ca8c0x8888887c5ede327afbeb15019598aaa3b4fae7590.0002400012 Ether
[ Download CSV Export 
Contract Source Code Verified (Exact Match)
Contract Name: Lottery
Compiler Version: v0.4.25+commit.59dbf8f1
Optimization Enabled: No
Runs (Optimizer):  200


Contract Source Code
pragma solidity ^0.4.24;

/*
*   gibmireinbier
*   0xA4a799086aE18D7db6C4b57f496B081b44888888
*   [email protected]
*/

interface F2mInterface {
    function joinNetwork(address[6] _contract) public;
    // one time called
    function disableRound0() public;
    function activeBuy() public;
    // Dividends from all sources (DApps, Donate ...)
    function pushDividends() public payable;
    /**
     * Converts all of caller's dividends to tokens.
     */
    //function reinvest() public;
    //function buy() public payable;
    function buyFor(address _buyer) public payable;
    function sell(uint256 _tokenAmount) public;
    function exit() public;
    function devTeamWithdraw() public returns(uint256);
    function withdrawFor(address sender) public returns(uint256);
    function transfer(address _to, uint256 _tokenAmount) public returns(bool);
    /*----------  ADMINISTRATOR ONLY FUNCTIONS  ----------*/
    function setAutoBuy() public;
    /*==========================================
    =            public FUNCTIONS            =
    ==========================================*/
    // function totalEthBalance() public view returns(uint256);
    function ethBalance(address _address) public view returns(uint256);
    function myBalance() public view returns(uint256);
    function myEthBalance() public view returns(uint256);

    function swapToken() public;
    function setNewToken(address _newTokenAddress) public;
}

interface CitizenInterface {
 
    function joinNetwork(address[6] _contract) public;
    /*----------  ADMINISTRATOR ONLY FUNCTIONS  ----------*/
    function devTeamWithdraw() public;

    /*----------  WRITE FUNCTIONS  ----------*/
    function updateUsername(string _sNewUsername) public;
    //Sources: Token contract, DApps
    function pushRefIncome(address _sender) public payable;
    function withdrawFor(address _sender) public payable returns(uint256);
    function devTeamReinvest() public returns(uint256);

    /*----------  READ FUNCTIONS  ----------*/
    function getRefWallet(address _address) public view returns(uint256);
}

interface DevTeamInterface {
    function setF2mAddress(address _address) public;
    function setLotteryAddress(address _address) public;
    function setCitizenAddress(address _address) public;
    function setBankAddress(address _address) public;
    function setRewardAddress(address _address) public;
    function setWhitelistAddress(address _address) public;

    function setupNetwork() public;
}

interface BankInterface {
    function joinNetwork(address[6] _contract) public;
    // Core functions
    function pushToBank(address _player) public payable;
}

interface RewardInterface {

    function mintReward(
        address _lucker,
        uint256 curRoundId,
        uint256 _tNumberFrom,
        uint256 _tNumberTo,
        uint256 _value,
        uint256 _rewardType)
        public;
        
    function joinNetwork(address[6] _contract) public;
    function pushBounty(uint256 _curRoundId) public payable;
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {
    int256 constant private INT256_MIN = -2**255;

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

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

        return c;
    }

    /**
    * @dev Multiplies two signed integers, reverts on overflow.
    */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        require(!(a == -1 && b == INT256_MIN)); // This is the only case of overflow not detected by the check below

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

        return c;
    }

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

        return c;
    }

    /**
    * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.
    */
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0); // Solidity only automatically asserts when dividing by 0
        require(!(b == -1 && a == INT256_MIN)); // This is the only case of overflow

        int256 c = a / b;

        return c;
    }

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

        return c;
    }

    /**
    * @dev Subtracts two signed integers, reverts on overflow.
    */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));

        return c;
    }

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

        return c;
    }

    /**
    * @dev Adds two signed integers, reverts on overflow.
    */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));

        return c;
    }

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

library Helper {
    using SafeMath for uint256;

    uint256 constant public ZOOM = 1000;
    uint256 constant public SDIVIDER = 3450000;
    uint256 constant public PDIVIDER = 3450000;
    uint256 constant public RDIVIDER = 1580000;
    // Starting LS price (SLP)
    uint256 constant public SLP = 0.002 ether;
    // Starting Added Time (SAT)
    uint256 constant public SAT = 30; // seconds
    // Price normalization (PN)
    uint256 constant public PN = 777;
    // EarlyIncome base
    uint256 constant public PBASE = 13;
    uint256 constant public PMULTI = 26;
    uint256 constant public LBase = 15;

    uint256 constant public ONE_HOUR = 3600;
    uint256 constant public ONE_DAY = 24 * ONE_HOUR;
    //uint256 constant public TIMEOUT0 = 3 * ONE_HOUR;
    uint256 constant public TIMEOUT1 = 12 * ONE_HOUR;
    
    function bytes32ToString (bytes32 data)
        public
        pure
        returns (string) 
    {
        bytes memory bytesString = new bytes(32);
        for (uint j=0; j<32; j++) {
            byte char = byte(bytes32(uint(data) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[j] = char;
            }
        }
        return string(bytesString);
    }
    
    function uintToBytes32(uint256 n)
        public
        pure
        returns (bytes32) 
    {
        return bytes32(n);
    }
    
    function bytes32ToUint(bytes32 n) 
        public
        pure
        returns (uint256) 
    {
        return uint256(n);
    }
    
    function stringToBytes32(string memory source) 
        public
        pure
        returns (bytes32 result) 
    {
        bytes memory tempEmptyStringTest = bytes(source);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }

        assembly {
            result := mload(add(source, 32))
        }
    }
    
    function stringToUint(string memory source) 
        public
        pure
        returns (uint256)
    {
        return bytes32ToUint(stringToBytes32(source));
    }
    
    function uintToString(uint256 _uint) 
        public
        pure
        returns (string)
    {
        return bytes32ToString(uintToBytes32(_uint));
    }

/*     
    function getSlice(uint256 begin, uint256 end, string text) public pure returns (string) {
        bytes memory a = new bytes(end-begin+1);
        for(uint i = 0; i <= end - begin; i++){
            a[i] = bytes(text)[i + begin - 1];
        }
        return string(a);    
    }
 */
    function validUsername(string _username)
        public
        pure
        returns(bool)
    {
        uint256 len = bytes(_username).length;
        // Im Raum [4, 18]
        if ((len < 4) || (len > 18)) return false;
        // Letzte Char != ' '
        if (bytes(_username)[len-1] == 32) return false;
        // Erste Char != '0'
        return uint256(bytes(_username)[0]) != 48;
    }

    // Lottery Helper

    // Seconds added per LT = SAT - ((Current no. of LT + 1) / SDIVIDER)^6
    function getAddedTime(uint256 _rTicketSum, uint256 _tAmount)
        public
        pure
        returns (uint256)
    {
        //Luppe = 10000 = 10^4
        uint256 base = (_rTicketSum + 1).mul(10000) / SDIVIDER;
        uint256 expo = base;
        expo = expo.mul(expo).mul(expo); // ^3
        expo = expo.mul(expo); // ^6
        // div 10000^6
        expo = expo / (10**24);

        if (expo > SAT) return 0;
        return (SAT - expo).mul(_tAmount);
    }

    function getNewEndTime(uint256 toAddTime, uint256 slideEndTime, uint256 fixedEndTime)
        public
        view
        returns(uint256)
    {
        uint256 _slideEndTime = (slideEndTime).add(toAddTime);
        uint256 timeout = _slideEndTime.sub(block.timestamp);
        // timeout capped at TIMEOUT1
        if (timeout > TIMEOUT1) timeout = TIMEOUT1;
        _slideEndTime = (block.timestamp).add(timeout);
        // Capped at fixedEndTime
        if (_slideEndTime > fixedEndTime)  return fixedEndTime;
        return _slideEndTime;
    }

    // get random in range [1, _range] with _seed
    function getRandom(uint256 _seed, uint256 _range)
        public
        pure
        returns(uint256)
    {
        if (_range == 0) return _seed;
        return (_seed % _range) + 1;
    }


    function getEarlyIncomeMul(uint256 _ticketSum)
        public
        pure
        returns(uint256)
    {
        // Early-Multiplier = 1 + PBASE / (1 + PMULTI * ((Current No. of LT)/RDIVIDER)^6)
        uint256 base = _ticketSum * ZOOM / RDIVIDER;
        uint256 expo = base.mul(base).mul(base); //^3
        expo = expo.mul(expo) / (ZOOM**6); //^6
        return (1 + PBASE / (1 + expo.mul(PMULTI)));
    }

    // get reveiced Tickets, based on current round ticketSum
    function getTAmount(uint256 _ethAmount, uint256 _ticketSum) 
        public
        pure
        returns(uint256)
    {
        uint256 _tPrice = getTPrice(_ticketSum);
        return _ethAmount.div(_tPrice);
    }

    // Lotto-Multiplier = 1 + LBase * (Current No. of Tickets / PDivider)^6
    function getTMul(uint256 _ticketSum) // Unit Wei
        public
        pure
        returns(uint256)
    {
        uint256 base = _ticketSum * ZOOM / PDIVIDER;
        uint256 expo = base.mul(base).mul(base);
        expo = expo.mul(expo); // ^6
        return 1 + expo.mul(LBase) / (10**18);
    }

    // get ticket price, based on current round ticketSum
    //unit in ETH, no need / zoom^6
    function getTPrice(uint256 _ticketSum)
        public
        pure
        returns(uint256)
    {
        uint256 base = (_ticketSum + 1).mul(ZOOM) / PDIVIDER;
        uint256 expo = base;
        expo = expo.mul(expo).mul(expo); // ^3
        expo = expo.mul(expo); // ^6
        uint256 tPrice = SLP + expo / PN;
        return tPrice;
    }

    // get weight of slot, chance to win grandPot
    function getSlotWeight(uint256 _ethAmount, uint256 _ticketSum)
        public
        pure
        returns(uint256)
    {
        uint256 _tAmount = getTAmount(_ethAmount, _ticketSum);
        uint256 _tMul = getTMul(_ticketSum);
        return (_tAmount).mul(_tMul);
    }

    // used to draw grandpot results
    // weightRange = roundWeight * grandpot / (grandpot - initGrandPot)
    // grandPot = initGrandPot + round investedSum(for grandPot)
    function getWeightRange(uint256 grandPot, uint256 initGrandPot, uint256 curRWeight)
        public
        pure
        returns(uint256)
    {
        //calculate round grandPot-investedSum
        uint256 grandPotInvest = grandPot - initGrandPot;
        if (grandPotInvest == 0) return 8;
        uint256 zoomMul = grandPot * ZOOM / grandPotInvest;
        uint256 weightRange = zoomMul * curRWeight / ZOOM;
        if (weightRange < curRWeight) weightRange = curRWeight;
        return weightRange;
    }
}

contract Lottery {
    using SafeMath for uint256;

    modifier withdrawRight(){
        require(msg.sender == address(bankContract), "Bank only");
        _;
    }

    modifier onlyDevTeam() {
        require(msg.sender == devTeam, "only for development team");
        _;
    }

    modifier buyable() {
        require(block.timestamp > round[curRoundId].startTime, "not ready to sell Ticket");
        require(block.timestamp < round[curRoundId].slideEndTime, "round over");
        _;
    }

    enum RewardType {
        Minor,
        Major,
        Grand,
        Bounty
    }

    // 1 buy = 1 slot = _ethAmount => (tAmount, tMul) 
    struct Slot {
        address buyer;
        uint256 rId;
        // ticket numbers in range and unique in all rounds
        uint256 tNumberFrom;
        uint256 tNumberTo;
        // weight to, used for grandPot finalize
        uint256 wTo;
        uint256 ethAmount;
        uint256 salt;
    }

    struct Round {
        // earlyIncome weight sum
        uint256 rEarlyIncomeWeight;
        // blockNumber to get hash as random seed
        uint256 keyBlockNr;
        
        mapping(address => uint256) pTicketSum;
        mapping(address => uint256) pInvestedSum;

        // early income weight by address
        mapping(address => uint256) pEarlyIncomeWeight;
        mapping(address => uint256) pEarlyIncomeCredit;
        mapping(address => uint256) pEarlyIncomeClaimed;
        // early income per weight
        uint256 ppw;
        // endTime increased every slot sold
        // endTime limited by fixedEndTime
        uint256 startTime;
        uint256 slideEndTime;
        uint256 fixedEndTime;

        // ticketSum from round 1 to this round
        uint256 ticketSum;
        // investedSum from round 1 to this round
        uint256 investedSum;
        // number of slots from round 1 to this round
        uint256 slotSum;
    }

    // round started with this grandPot amount,
    // used to calculate the rate for grandPot results
    // init in roundInit function
    uint256 initGrandPot;

    Slot[] slot;
    // slotId logs by address
    mapping( address => uint256[]) pSlot;
    mapping( address => uint256) public pSlotSum;

    // logs by address
    mapping( address => uint256) public pTicketSum;
    mapping( address => uint256) public pInvestedSum;

    CitizenInterface public citizenContract;
    F2mInterface public f2mContract;
    BankInterface public bankContract;
    RewardInterface public rewardContract;

    address public devTeam;

    uint256 constant public ZOOM = 1000;
    uint256 constant public ONE_HOUR = 60 * 60;
    uint256 constant public ONE_DAY = 24 * ONE_HOUR;
    uint256 constant public TIMEOUT0 = 3 * ONE_HOUR;
    uint256 constant public TIMEOUT1 = 12 * ONE_HOUR;
    uint256 constant public TIMEOUT2 = 7 * ONE_DAY;
    uint256 constant public FINALIZE_WAIT_DURATION = 60; // 60 Seconds
    uint256 constant public NEWROUND_WAIT_DURATION = ONE_DAY; // 24 Hours

    // 15 seconds on Ethereum, 12 seconds used instead to make sure blockHash unavaiable
    // when slideEndTime reached
    // keyBlockNumber will be estimated again after every slot buy
    uint256 constant public BLOCK_TIME = 12;
    uint256 constant public MAX_BLOCK_DISTANCE = 254;

    uint256 constant public MAJOR_RATE = 1000;
    uint256 constant public MINOR_RATE = 1000;
    uint256 constant public MAJOR_MIN = 0.1 ether ;
    uint256 constant public MINOR_MIN = 0.1 ether ;

    //uint256 public toNextPotPercent = 27;
    uint256 public grandRewardPercent = 20;
    uint256 public jRewardPercent = 60;

    uint256 public toTokenPercent = 12; // 10% dividends 2% fund
    uint256 public toBuyTokenPercent = 1;
    uint256 public earlyIncomePercent = 22;
    uint256 public toRefPercent = 15;

    // sum == 100% = toPotPercent/100 * investedSum
    // uint256 public grandPercent = 68;
    uint256 public majorPercent = 24;
    uint256 public minorPercent = 8;

    uint256 public grandPot;
    uint256 public majorPot;
    uint256 public minorPot;

    uint256 public curRoundId;
    uint256 public lastRoundId = 88888888;

    uint256 constant public startPrice = 0.002 ether;

    mapping (address => uint256) public rewardBalance;
    // used to save gas on earlyIncome calculating, curRoundId never included
    // only earlyIncome from round 1st to curRoundId-1 are fixed
    mapping (address => uint256) public lastWithdrawnRound;
    mapping (address => uint256) public earlyIncomeScannedSum;

    mapping (uint256 => Round) public round;

    // Current Round

    // first SlotId in last Block to fire jackpot
    uint256 public jSlot;
    // jackpot results of all slots in same block will be drawed at the same time,
    // by player, who buys the first slot in next block
    uint256 public lastBlockNr;
    // used to calculate grandPot results
    uint256 public curRWeight;
    // added by slot salt after every slot buy
    // does not matter with overflow
    uint256 public curRSalt;
    // ticket sum of current round
    uint256 public curRTicketSum;

    constructor (address _devTeam)
        public
    {
        // register address in network
        DevTeamInterface(_devTeam).setLotteryAddress(address(this));
        devTeam = _devTeam;
    }

    // _contract = [f2mAddress, bankAddress, citizenAddress, lotteryAddress, rewardAddress, whitelistAddress];
    function joinNetwork(address[6] _contract)
        public
    {
        require(address(citizenContract) == 0x0,"already setup");
        f2mContract = F2mInterface(_contract[0]);
        bankContract = BankInterface(_contract[1]);
        citizenContract = CitizenInterface(_contract[2]);
        //lotteryContract = LotteryInterface(lotteryAddress);
        rewardContract = RewardInterface(_contract[4]);
    }

    function activeFirstRound()
        public
        onlyDevTeam()
    {
        require(curRoundId == 0, "already activated");
        initRound();
    }

    // Core Functions

    function pushToPot() 
        public 
        payable
    {
        addPot(msg.value);
    }

    function checkpoint() 
        private
    {
        // dummy slot between every 2 rounds
        // dummy slot never win jackpot cause of min 0.1 ETH
        Slot memory _slot;
        _slot.tNumberTo = round[curRoundId].ticketSum;
        slot.push(_slot);

        Round memory _round;
        _round.startTime = NEWROUND_WAIT_DURATION.add(block.timestamp);
        // started with 3 hours timeout
        _round.slideEndTime = TIMEOUT0 + _round.startTime;
        _round.fixedEndTime = TIMEOUT2 + _round.startTime;
        _round.keyBlockNr = genEstKeyBlockNr(_round.slideEndTime);
        _round.ticketSum = round[curRoundId].ticketSum;
        _round.investedSum = round[curRoundId].investedSum;
        _round.slotSum = slot.length;

        curRoundId = curRoundId + 1;
        round[curRoundId] = _round;

        initGrandPot = grandPot;
        curRWeight = 0;
        curRTicketSum = 0;
    }

    // from round 18+ function
    function isLastRound()
        public
        view
        returns(bool)
    {
        return (curRoundId == lastRoundId);
    }

    function goNext()
        private
    {
        uint256 _totalPot = getTotalPot();
        grandPot = 0;
        majorPot = 0;
        minorPot = 0;
        f2mContract.pushDividends.value(_totalPot)();
        // never start
        round[curRoundId].startTime = block.timestamp * 10;
        round[curRoundId].slideEndTime = block.timestamp * 10 + 1;
    }

    function initRound()
        private
    {
        // update all Round Log
        checkpoint();
        if (isLastRound()) goNext();
    }

    function finalizeable() 
        public
        view
        returns(bool)
    {
        uint256 finalizeTime = FINALIZE_WAIT_DURATION.add(round[curRoundId].slideEndTime);
        if (finalizeTime > block.timestamp) return false; // too soon to finalize
        if (getEstKeyBlockNr(curRoundId) >= block.number) return false; //block hash not exist
        return curRoundId > 0;
    }

    // bounty
    function finalize()
        public
    {
        require(finalizeable(), "Not ready to draw results");
        // avoid txs blocked => curRTicket ==0 => die
        require((round[curRoundId].pTicketSum[msg.sender] > 0) || (curRTicketSum == 0), "must buy at least 1 ticket");
        endRound(msg.sender);
        initRound();
    }

    function mintReward(
        address _lucker,
        uint256 _slotId,
        uint256 _value,
        RewardType _rewardType)
        private
    {
        // add reward balance
        rewardBalance[_lucker] = rewardBalance[_lucker].add(_value);
        // reward log
        rewardContract.mintReward(
            _lucker,
            curRoundId,
            slot[_slotId].tNumberFrom,
            slot[_slotId].tNumberTo,
            _value,
            uint256(_rewardType)
        );
    }

    function jackpot()
        private
    {
        // get blocknumber to get blockhash
        uint256 keyBlockNr = getKeyBlockNr(lastBlockNr);//block.number;
        // salt not effected by jackpot, too risk
        uint256 seed = getSeed(keyBlockNr);
        // slot numberic from 1 ... totalSlot(round)
        // jackpot for all slot in last block, jSlot <= i <= lastSlotId (=slotSum - 1)
        // _to = first Slot in new block
        //uint256 _to = round[curRoundId].slotSum;

        uint256 jReward;
        uint256 toF2mAmount;
        address winner;
        // jackpot check for slots in last block
        while (jSlot + 1 < round[curRoundId].slotSum) {
            // majorPot
            if ((seed % MAJOR_RATE == 6) &&
                (slot[jSlot].ethAmount >= MAJOR_MIN)) {

                winner = slot[jSlot].buyer;
                jReward = majorPot / 100 * jRewardPercent;
                mintReward(winner, jSlot, jReward, RewardType.Major);
                toF2mAmount = majorPot / 100 * toTokenPercent;
                f2mContract.pushDividends.value(toF2mAmount)();
                majorPot = majorPot - jReward - toF2mAmount;
            }

            // minorPot
            if (((seed + jSlot) % MINOR_RATE == 8) && 
                (slot[jSlot].ethAmount >= MINOR_MIN)) {

                winner = slot[jSlot].buyer;
                jReward = minorPot / 100 * jRewardPercent;
                mintReward(winner, jSlot, jReward, RewardType.Minor);
                toF2mAmount = minorPot / 100 * toTokenPercent;
                f2mContract.pushDividends.value(toF2mAmount)();
                minorPot = minorPot - jReward - toF2mAmount;
            }
            seed = seed + 1;
            jSlot = jSlot + 1;
        }
    }

    function endRound(address _bountyHunter)
        private
    {
        uint256 _rId = curRoundId;
        uint256 keyBlockNr = getKeyBlockNr(round[_rId].keyBlockNr);
        uint256 _seed = getSeed(keyBlockNr) + curRSalt;
        uint256 onePercent = grandPot / 100;
        uint256 rGrandReward = onePercent * grandRewardPercent;

        //PUSH DIVIDENDS
        uint256 toF2mAmount = onePercent * toTokenPercent;
        //uint256 _bountyAmount = onePercent * bountyPercent;
        
        grandPot = grandPot - toF2mAmount - onePercent;
        f2mContract.pushDividends.value(toF2mAmount)();

        // base on grand-intestedSum current grandPot
        uint256 weightRange = getWeightRange();

        // roll 3 turns
        for (uint256 i = 0; i < 3; i++){
            uint256 winNr = Helper.getRandom(_seed, weightRange);
            // if winNr > curRoundWeight => no winner this turn
            // win Slot : fromWeight <= winNr <= toWeight
            // got winner this rolling turn
            if (winNr <= curRWeight) {
                grandPot -= rGrandReward;
                uint256 _winSlot = getWinSlot(winNr);
                address _winner = slot[_winSlot].buyer;
                mintReward(_winner, _winSlot, rGrandReward, RewardType.Grand);
                _seed = _seed + (_seed / 10);
            }
        }
        mintReward(_bountyHunter, 0, onePercent * 3 / 10, RewardType.Bounty);
        rewardContract.pushBounty.value(onePercent * 7 / 10)(curRoundId);
    }

    function buy(string _sSalt)
        public
        payable
    {
        buyFor(_sSalt, msg.sender);
    }

    function updateInvested(address _buyer, uint256 _ethAmount)
        private
    {
        round[curRoundId].investedSum += _ethAmount;
        round[curRoundId].pInvestedSum[_buyer] += _ethAmount;
        pInvestedSum[_buyer] += _ethAmount;
    }

    function updateTicketSum(address _buyer, uint256 _tAmount)
        private
    {
        round[curRoundId].ticketSum = round[curRoundId].ticketSum + _tAmount;
        round[curRoundId].pTicketSum[_buyer] = round[curRoundId].pTicketSum[_buyer] + _tAmount;
        curRTicketSum = curRTicketSum + _tAmount;
        pTicketSum[_buyer] = pTicketSum[_buyer] + _tAmount;
    }

    function updateEarlyIncome(address _buyer, uint256 _pWeight)
        private
    {
        round[curRoundId].rEarlyIncomeWeight = _pWeight.add(round[curRoundId].rEarlyIncomeWeight);
        round[curRoundId].pEarlyIncomeWeight[_buyer] = _pWeight.add(round[curRoundId].pEarlyIncomeWeight[_buyer]);
        round[curRoundId].pEarlyIncomeCredit[_buyer] = round[curRoundId].pEarlyIncomeCredit[_buyer].add(_pWeight.mul(round[curRoundId].ppw));
    }

    function buyFor(string _sSalt, address _sender) 
        public
        payable
        buyable()
    {
        uint256 _salt = Helper.stringToUint(_sSalt);
        uint256 _ethAmount = msg.value;
        uint256 _ticketSum = curRTicketSum;
        require(_ethAmount >= Helper.getTPrice(_ticketSum), "not enough to buy 1 ticket");

        // investedSum logs
        updateInvested(_sender, _ethAmount);
        // update salt
        curRSalt = curRSalt + _salt;
        // init new Slot, Slot Id = 1..curRSlotSum
        Slot memory _slot;
        _slot.rId = curRoundId;
        _slot.buyer = _sender;
        _slot.ethAmount = _ethAmount;
        _slot.salt = _salt;
        uint256 _tAmount = Helper.getTAmount(_ethAmount, _ticketSum);
        uint256 _tMul = Helper.getTMul(_ticketSum);
        uint256 _pMul = Helper.getEarlyIncomeMul(_ticketSum);
        uint256 _pWeight = _pMul.mul(_tAmount);
        uint256 _toAddTime = Helper.getAddedTime(_ticketSum, _tAmount);
        addTime(curRoundId, _toAddTime);

        // update weight
        uint256 _slotWeight = (_tAmount).mul(_tMul);
        curRWeight = curRWeight.add(_slotWeight);
        _slot.wTo = curRWeight;
        uint256 lastSlot = slot.length - 1;
        // update ticket params
        _slot.tNumberFrom = slot[lastSlot].tNumberTo + 1;
        _slot.tNumberTo = slot[lastSlot].tNumberTo + _tAmount;
        updateTicketSum(_sender, _tAmount);

        // EarlyIncome Weight
        // ppw and credit zoomed x1000
        // earlyIncome mul of each ticket in this slot
        updateEarlyIncome(_sender, _pWeight);
     
        // add Slot and update round data
        slot.push(_slot);
        round[curRoundId].slotSum = slot.length;
        // add slot to player logs
        pSlot[_sender].push(slot.length - 1);

        // first slot in this block draw jacpot results for 
        // all slot in last block
        if (lastBlockNr != block.number) {
            jackpot();
            lastBlockNr = block.number;
        }

        distributeSlotBuy(_sender, curRoundId, _ethAmount);

        round[curRoundId].keyBlockNr = genEstKeyBlockNr(round[curRoundId].slideEndTime);
    }

    function distributeSlotBuy(address _sender, uint256 _rId, uint256 _ethAmount)
        private
    {
        uint256 onePercent = _ethAmount / 100;
        uint256 toF2mAmount = onePercent * toTokenPercent; // 12
        uint256 toRefAmount = onePercent * toRefPercent; // 10
        uint256 toBuyTokenAmount = onePercent * toBuyTokenPercent; //1
        uint256 earlyIncomeAmount = onePercent * earlyIncomePercent; //27
        uint256 taxAmount = toF2mAmount + toRefAmount + toBuyTokenAmount + earlyIncomeAmount; // 50
        uint256 taxedEthAmount = _ethAmount.sub(taxAmount); // 50
        addPot(taxedEthAmount);
        
        // 10% Ref
        citizenContract.pushRefIncome.value(toRefAmount)(_sender);
        // 2% Fund + 10% Dividends 
        f2mContract.pushDividends.value(toF2mAmount)();
        // 1% buy Token
        f2mContract.buyFor.value(toBuyTokenAmount)(_sender);
        // 27% Early
        uint256 deltaPpw = (earlyIncomeAmount * ZOOM).div(round[_rId].rEarlyIncomeWeight);
        round[_rId].ppw = deltaPpw.add(round[_rId].ppw);
    }

    function claimEarlyIncomebyAddress(address _buyer)
        private
    {
        if (curRoundId == 0) return;
        claimEarlyIncomebyAddressRound(_buyer, curRoundId);
        uint256 _rId = curRoundId - 1;
        while ((_rId > lastWithdrawnRound[_buyer]) && (_rId + 20 > curRoundId)) {
            earlyIncomeScannedSum[_buyer] += claimEarlyIncomebyAddressRound(_buyer, _rId);
            _rId = _rId - 1;
        }
    }

    function claimEarlyIncomebyAddressRound(address _buyer, uint256 _rId)
        private
        returns(uint256)
    {
        uint256 _amount = getCurEarlyIncomeByAddressRound(_buyer, _rId);
        if (_amount == 0) return 0;
        round[_rId].pEarlyIncomeClaimed[_buyer] = _amount.add(round[_rId].pEarlyIncomeClaimed[_buyer]);
        rewardBalance[_buyer] = _amount.add(rewardBalance[_buyer]);
        return _amount;
    }

    function withdrawFor(address _sender)
        public
        withdrawRight()
        returns(uint256)
    {
        if (curRoundId == 0) return;
        claimEarlyIncomebyAddress(_sender);
        lastWithdrawnRound[_sender] = curRoundId - 1;
        uint256 _amount = rewardBalance[_sender];
        rewardBalance[_sender] = 0;
        bankContract.pushToBank.value(_amount)(_sender);
        return _amount;
    }
    
    function addTime(uint256 _rId, uint256 _toAddTime)
        private
    {
        round[_rId].slideEndTime = Helper.getNewEndTime(_toAddTime, round[_rId].slideEndTime, round[_rId].fixedEndTime);
    }

    // distribute to 3 pots Grand, Majorm Minor
    function addPot(uint256 _amount)
        private
    {
        uint256 onePercent = _amount / 100;
        uint256 toMinor = onePercent * minorPercent;
        uint256 toMajor = onePercent * majorPercent;
        uint256 toGrand = _amount - toMinor - toMajor;

        minorPot = minorPot + toMinor;
        majorPot = majorPot + toMajor;
        grandPot = grandPot + toGrand;
    }


    //////////////////////////////////////////////////////////////////
    // READ FUNCTIONS
    //////////////////////////////////////////////////////////////////

    function isWinSlot(uint256 _slotId, uint256 _keyNumber)
        public
        view
        returns(bool)
    {
        return (slot[_slotId - 1].wTo < _keyNumber) && (slot[_slotId].wTo >= _keyNumber);
    }

    function getWeightRange()
        public
        view
        returns(uint256)
    {
        return Helper.getWeightRange(grandPot, initGrandPot, curRWeight);
    }

    function getWinSlot(uint256 _keyNumber)
        public
        view
        returns(uint256)
    {
        // return 0 if not found
        uint256 _to = slot.length - 1;
        uint256 _from = round[curRoundId-1].slotSum + 1; // dummy slot ignore
        uint256 _pivot;
        //Slot memory _slot;
        uint256 _pivotWTo;
        // Binary search
        while (_from <= _to) {
            _pivot = (_from + _to) / 2;
            //_slot = round[_rId].slot[_pivot];
            _pivotWTo = slot[_pivot].wTo;
            if (isWinSlot(_pivot, _keyNumber)) return _pivot;
            if (_pivotWTo < _keyNumber) { // in right side
                _from = _pivot + 1;
            } else { // in left side
                _to = _pivot - 1;
            }
        }
        return _pivot; // never happens or smt gone wrong
    }

    // Key Block in future
    function genEstKeyBlockNr(uint256 _endTime) 
        public
        view
        returns(uint256)
    {
        if (block.timestamp >= _endTime) return block.number + 8; 
        uint256 timeDist = _endTime - block.timestamp;
        uint256 estBlockDist = timeDist / BLOCK_TIME;
        return block.number + estBlockDist + 8;
    }

    // get block hash of first block with blocktime > _endTime
    function getSeed(uint256 _keyBlockNr)
        public
        view
        returns (uint256)
    {
        // Key Block not mined atm
        if (block.number <= _keyBlockNr) return block.number;
        return uint256(blockhash(_keyBlockNr));
    }

    // current reward balance
    function getRewardBalance(address _buyer)
        public
        view
        returns(uint256)
    {
        return rewardBalance[_buyer];
    } 

    // GET endTime
    function getSlideEndTime(uint256 _rId)
        public
        view
        returns(uint256)
    {
        return(round[_rId].slideEndTime);
    }

    function getFixedEndTime(uint256 _rId)
        public
        view
        returns(uint256)
    {
        return(round[_rId].fixedEndTime);
    }

    function getTotalPot()
        public
        view
        returns(uint256)
    {
        return grandPot + majorPot + minorPot;
    }

    // EarlyIncome
    function getEarlyIncomeByAddress(address _buyer)
        public
        view
        returns(uint256)
    {
        uint256 _sum = earlyIncomeScannedSum[_buyer];
        uint256 _fromRound = lastWithdrawnRound[_buyer] + 1; // >=1
        if (_fromRound + 100 < curRoundId) _fromRound = curRoundId - 100;
        uint256 _rId = _fromRound;
        while (_rId <= curRoundId) {
            _sum = _sum + getEarlyIncomeByAddressRound(_buyer, _rId);
            _rId++;
        }
        return _sum;
    }

    // included claimed amount
    function getEarlyIncomeByAddressRound(address _buyer, uint256 _rId)
        public
        view
        returns(uint256)
    {
        uint256 _pWeight = round[_rId].pEarlyIncomeWeight[_buyer];
        uint256 _ppw = round[_rId].ppw;
        uint256 _rCredit = round[_rId].pEarlyIncomeCredit[_buyer];
        uint256 _rEarlyIncome = ((_ppw.mul(_pWeight)).sub(_rCredit)).div(ZOOM);
        return _rEarlyIncome;
    }

    function getCurEarlyIncomeByAddress(address _buyer)
        public
        view
        returns(uint256)
    {
        uint256 _sum = 0;
        uint256 _fromRound = lastWithdrawnRound[_buyer] + 1; // >=1
        if (_fromRound + 100 < curRoundId) _fromRound = curRoundId - 100;
        uint256 _rId = _fromRound;
        while (_rId <= curRoundId) {
            _sum = _sum.add(getCurEarlyIncomeByAddressRound(_buyer, _rId));
            _rId++;
        }
        return _sum;
    }

    function getCurEarlyIncomeByAddressRound(address _buyer, uint256 _rId)
        public
        view
        returns(uint256)
    {
        uint256 _rEarlyIncome = getEarlyIncomeByAddressRound(_buyer, _rId);
        return _rEarlyIncome.sub(round[_rId].pEarlyIncomeClaimed[_buyer]);
    }

    ////////////////////////////////////////////////////////////////////

    function getEstKeyBlockNr(uint256 _rId)
        public
        view
        returns(uint256)
    {
        return round[_rId].keyBlockNr;
    }

    function getKeyBlockNr(uint256 _estKeyBlockNr)
        public
        view
        returns(uint256)
    {
        require(block.number > _estKeyBlockNr, "blockHash not avaiable");
        uint256 jump = (block.number - _estKeyBlockNr) / MAX_BLOCK_DISTANCE * MAX_BLOCK_DISTANCE;
        return _estKeyBlockNr + jump;
    }

    // Logs
    function getCurRoundId()
        public
        view
        returns(uint256)
    {
        return curRoundId;
    }

    function getTPrice()
        public
        view
        returns(uint256)
    {
        return Helper.getTPrice(curRTicketSum);
    }

    function getTMul()
        public
        view
        returns(uint256)
    {
        return Helper.getTMul(curRTicketSum);
    }

    function getPMul()
        public
        view
        returns(uint256)
    {
        return Helper.getEarlyIncomeMul(curRTicketSum);
    }

    function getPTicketSumByRound(uint256 _rId, address _buyer)
        public
        view
        returns(uint256)
    {
        return round[_rId].pTicketSum[_buyer];
    }

    function getTicketSumToRound(uint256 _rId)
        public
        view
        returns(uint256)
    {
        return round[_rId].ticketSum;
    }

    function getPInvestedSumByRound(uint256 _rId, address _buyer)
        public
        view
        returns(uint256)
    {
        return round[_rId].pInvestedSum[_buyer];
    }

    function getInvestedSumToRound(uint256 _rId)
        public
        view
        returns(uint256)
    {
        return round[_rId].investedSum;
    }

    function getPSlotLength(address _sender)
        public
        view
        returns(uint256)
    {
        return pSlot[_sender].length;
    }

    function getSlotLength()
        public
        view
        returns(uint256)
    {
        return slot.length;
    }

    function getSlotId(address _sender, uint256 i)
        public
        view
        returns(uint256)
    {
        return pSlot[_sender][i];
    }

    function getSlotInfo(uint256 _slotId)
        public
        view
        returns(address, uint256[4], string)
    {
        Slot memory _slot = slot[_slotId];
        return (_slot.buyer,[_slot.rId, _slot.tNumberFrom, _slot.tNumberTo, _slot.ethAmount], Helper.uintToString(_slot.salt));
    }

    function cashoutable(address _address) 
        public
        view
        returns(bool)
    {
        // need 1 ticket or in waiting time to start new round
        return (round[curRoundId].pTicketSum[_address] > 0) || (round[curRoundId].startTime > block.timestamp);
    }

    // set endRound, prepare to upgrade new version
    function setLastRound(uint256 _lastRoundId) 
        public
        onlyDevTeam()
    {
        require(_lastRoundId >= 18 && _lastRoundId > curRoundId, "too early to end");
        require(lastRoundId == 88888888, "already set");
        lastRoundId = _lastRoundId;
    }
}

Contract ABI
[{"constant":true,"inputs":[],"name":"toBuyTokenPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_buyer","type":"address"},{"name":"_rId","type":"uint256"}],"name":"getCurEarlyIncomeByAddressRound","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minorPot","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"grandPot","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAJOR_RATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bankContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"curRoundId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"jRewardPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"curRWeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rId","type":"uint256"}],"name":"getEstKeyBlockNr","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_estKeyBlockNr","type":"uint256"}],"name":"getKeyBlockNr","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ONE_HOUR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTMul","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rId","type":"uint256"},{"name":"_buyer","type":"address"}],"name":"getPTicketSumByRound","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"lastWithdrawnRound","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isLastRound","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"f2mContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSlotLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"majorPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"earlyIncomeScannedSum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINOR_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"jSlot","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"round","outputs":[{"name":"rEarlyIncomeWeight","type":"uint256"},{"name":"keyBlockNr","type":"uint256"},{"name":"ppw","type":"uint256"},{"name":"startTime","type":"uint256"},{"name":"slideEndTime","type":"uint256"},{"name":"fixedEndTime","type":"uint256"},{"name":"ticketSum","type":"uint256"},{"name":"investedSum","type":"uint256"},{"name":"slotSum","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FINALIZE_WAIT_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_contract","type":"address[6]"}],"name":"joinNetwork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastRoundId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"finalizeable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"toTokenPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_sender","type":"address"},{"name":"i","type":"uint256"}],"name":"getSlotId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"curRSalt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalPot","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"curRTicketSum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sSalt","type":"string"}],"name":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BLOCK_DISTANCE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rId","type":"uint256"}],"name":"getSlideEndTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"cashoutable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ZOOM","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_slotId","type":"uint256"},{"name":"_keyNumber","type":"uint256"}],"name":"isWinSlot","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPMul","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minorPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rId","type":"uint256"}],"name":"getInvestedSumToRound","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIMEOUT1","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"rewardBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_sender","type":"address"}],"name":"getPSlotLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rId","type":"uint256"}],"name":"getTicketSumToRound","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastBlockNr","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_lastRoundId","type":"uint256"}],"name":"setLastRound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_sSalt","type":"string"},{"name":"_sender","type":"address"}],"name":"buyFor","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"NEWROUND_WAIT_DURATION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ONE_DAY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"majorPot","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rId","type":"uint256"}],"name":"getFixedEndTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sender","type":"address"}],"name":"withdrawFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_buyer","type":"address"}],"name":"getEarlyIncomeByAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pTicketSum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_buyer","type":"address"}],"name":"getCurEarlyIncomeByAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAJOR_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"toRefPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rId","type":"uint256"},{"name":"_buyer","type":"address"}],"name":"getPInvestedSumByRound","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIMEOUT2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINOR_RATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_slotId","type":"uint256"}],"name":"getSlotInfo","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256[4]"},{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"earlyIncomePercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pSlotSum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"citizenContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_buyer","type":"address"},{"name":"_rId","type":"uint256"}],"name":"getEarlyIncomeByAddressRound","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"devTeam","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIMEOUT0","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_buyer","type":"address"}],"name":"getRewardBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pushToPot","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_keyBlockNr","type":"uint256"}],"name":"getSeed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"grandRewardPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurRoundId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getWeightRange","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_endTime","type":"uint256"}],"name":"genEstKeyBlockNr","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_keyNumber","type":"uint256"}],"name":"getWinSlot","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pInvestedSum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"activeFirstRound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BLOCK_TIME","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_devTeam","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]

Contract Creation Code
60806040526014600b55603c600c55600c600d556001600e556016600f55600f6010556018601155600860125563054c56386017553480156200004157600080fd5b5060405160208062005495833981018060405281019080805190602001909291905050508073ffffffffffffffffffffffffffffffffffffffff16632a332b2a306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156200010157600080fd5b505af115801562000116573d6000803e3d6000fd5b5050505080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050615329806200016c6000396000f3006080604052600436106103c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806244c659146103ca5780628a5c23146103f5578063026db21d14610456578063034dc84c14610481578063060ccbc5146104ac57806307c2e449146104d757806308b254a71461052e578063095db925146105595780630a890a53146105845780630cafabd8146105af5780630e4b8389146105da578063131de5171461061b578063165035e21461065c578063182ef78e146106875780631b112541146106b25780631b681a281461071357806323ba467a1461076a5780632a6f7c39146107995780632c3f1304146107f05780632e10923f1461081b5780632fa23c711461084657806330b4d7521461089d5780633406eb9a146108c857806334d5f37b146108f35780633715a4f61461096c5780633865bf3a14610997578063388ca80f146109e957806338948c5314610a145780633d4cdb2214610a4357806343c0d38c14610a6e57806345f6e10d14610acf578063480bc31f14610afa57806348cd5a6014610b25578063492cc76914610b505780634bb278f314610bac57806350b0952b14610bc357806350f49db114610bee57806352620c7914610c2f57806358e5bc8814610c8a5780635a35eb7c14610cb55780635af8909414610d045780635c03cbe414610d2f5780636067be7914610d5a5780636713e2fe14610d9b57806367b40cf714610dc6578063683e292914610e1d578063690eb3f814610e745780636c85e31914610eb55780636ea69d6214610ee05780637289f28e14610f375780637495a1e414610f645780637bb8590d14610fe0578063863e76db1461100b57806398fc1d1e146110365780639c323436146110615780639eca672c146110a2578063a099d079146110f9578063a45d796514611150578063a5603f02146111a7578063a90c4ff2146111fe578063b70e286c14611229578063ba63abd614611254578063baf4e136146112b5578063bd11ab08146112e0578063be20f9ac1461130b578063be9ebd7114611413578063c90954a11461143e578063cac4977214611495578063d24bcf54146114ec578063d3dcc1751461154d578063d44a3d12146115a4578063d5a849e9146115cf578063dbe2e29614611626578063e0d4ea3714611630578063e5a758a414611671578063eb95f0bf1461169c578063f1671b56146116c7578063f1a9af89146116f2578063f215bc3e1461171d578063f2e1b1cc1461175e578063f5f6a5381461179f578063f6c6b731146117f6578063f93019101461180d575b600080fd5b3480156103d657600080fd5b506103df611838565b6040518082815260200191505060405180910390f35b34801561040157600080fd5b50610440600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061183e565b6040518082815260200191505060405180910390f35b34801561046257600080fd5b5061046b6118bc565b6040518082815260200191505060405180910390f35b34801561048d57600080fd5b506104966118c2565b6040518082815260200191505060405180910390f35b3480156104b857600080fd5b506104c16118c8565b6040518082815260200191505060405180910390f35b3480156104e357600080fd5b506104ec6118ce565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053a57600080fd5b506105436118f4565b6040518082815260200191505060405180910390f35b34801561056557600080fd5b5061056e6118fa565b6040518082815260200191505060405180910390f35b34801561059057600080fd5b50610599611900565b6040518082815260200191505060405180910390f35b3480156105bb57600080fd5b506105c4611906565b6040518082815260200191505060405180910390f35b3480156105e657600080fd5b50610605600480360381019080803590602001909291905050506119b5565b6040518082815260200191505060405180910390f35b34801561062757600080fd5b50610646600480360381019080803590602001909291905050506119d5565b6040518082815260200191505060405180910390f35b34801561066857600080fd5b50610671611a6d565b6040518082815260200191505060405180910390f35b34801561069357600080fd5b5061069c611a73565b6040518082815260200191505060405180910390f35b3480156106be57600080fd5b506106fd60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b22565b6040518082815260200191505060405180910390f35b34801561071f57600080fd5b50610754600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b80565b6040518082815260200191505060405180910390f35b34801561077657600080fd5b5061077f611b98565b604051808215151515815260200191505060405180910390f35b3480156107a557600080fd5b506107ae611ba6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107fc57600080fd5b50610805611bcc565b6040518082815260200191505060405180910390f35b34801561082757600080fd5b50610830611bd9565b6040518082815260200191505060405180910390f35b34801561085257600080fd5b50610887600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bdf565b6040518082815260200191505060405180910390f35b3480156108a957600080fd5b506108b2611bf7565b6040518082815260200191505060405180910390f35b3480156108d457600080fd5b506108dd611c03565b6040518082815260200191505060405180910390f35b3480156108ff57600080fd5b5061091e60048036038101908080359060200190929190505050611c09565b604051808a8152602001898152602001888152602001878152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390f35b34801561097857600080fd5b50610981611c57565b6040518082815260200191505060405180910390f35b3480156109a357600080fd5b506109e76004803603810190808060c00190600680602002604051908101604052809291908260066020028082843782019150505050509192919290505050611c5c565b005b3480156109f557600080fd5b506109fe611e5f565b6040518082815260200191505060405180910390f35b348015610a2057600080fd5b50610a29611e65565b604051808215151515815260200191505060405180910390f35b348015610a4f57600080fd5b50610a58611ed0565b6040518082815260200191505060405180910390f35b348015610a7a57600080fd5b50610ab9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ed6565b6040518082815260200191505060405180910390f35b348015610adb57600080fd5b50610ae4611f37565b6040518082815260200191505060405180910390f35b348015610b0657600080fd5b50610b0f611f3d565b6040518082815260200191505060405180910390f35b348015610b3157600080fd5b50610b3a611f4f565b6040518082815260200191505060405180910390f35b610baa600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611f55565b005b348015610bb857600080fd5b50610bc1611f62565b005b348015610bcf57600080fd5b50610bd86120cb565b6040518082815260200191505060405180910390f35b348015610bfa57600080fd5b50610c19600480360381019080803590602001909291905050506120d0565b6040518082815260200191505060405180910390f35b348015610c3b57600080fd5b50610c70600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120f0565b604051808215151515815260200191505060405180910390f35b348015610c9657600080fd5b50610c9f612173565b6040518082815260200191505060405180910390f35b348015610cc157600080fd5b50610cea6004803603810190808035906020019092919080359060200190929190505050612179565b604051808215151515815260200191505060405180910390f35b348015610d1057600080fd5b50610d196121d4565b6040518082815260200191505060405180910390f35b348015610d3b57600080fd5b50610d44612283565b6040518082815260200191505060405180910390f35b348015610d6657600080fd5b50610d8560048036038101908080359060200190929190505050612289565b6040518082815260200191505060405180910390f35b348015610da757600080fd5b50610db06122a9565b6040518082815260200191505060405180910390f35b348015610dd257600080fd5b50610e07600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122b2565b6040518082815260200191505060405180910390f35b348015610e2957600080fd5b50610e5e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506122ca565b6040518082815260200191505060405180910390f35b348015610e8057600080fd5b50610e9f60048036038101908080359060200190929190505050612316565b6040518082815260200191505060405180910390f35b348015610ec157600080fd5b50610eca612336565b6040518082815260200191505060405180910390f35b348015610eec57600080fd5b50610ef561233c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610f4357600080fd5b50610f6260048036038101908080359060200190929190505050612362565b005b610fde600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612534565b005b348015610fec57600080fd5b50610ff5612e46565b6040518082815260200191505060405180910390f35b34801561101757600080fd5b50611020612e4f565b6040518082815260200191505060405180910390f35b34801561104257600080fd5b5061104b612e58565b6040518082815260200191505060405180910390f35b34801561106d57600080fd5b5061108c60048036038101908080359060200190929190505050612e5e565b6040518082815260200191505060405180910390f35b3480156110ae57600080fd5b506110e3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e7e565b6040518082815260200191505060405180910390f35b34801561110557600080fd5b5061113a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061310f565b6040518082815260200191505060405180910390f35b34801561115c57600080fd5b50611191600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131e7565b6040518082815260200191505060405180910390f35b3480156111b357600080fd5b506111e8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131ff565b6040518082815260200191505060405180910390f35b34801561120a57600080fd5b506112136132a9565b6040518082815260200191505060405180910390f35b34801561123557600080fd5b5061123e6132b5565b6040518082815260200191505060405180910390f35b34801561126057600080fd5b5061129f60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132bb565b6040518082815260200191505060405180910390f35b3480156112c157600080fd5b506112ca613319565b6040518082815260200191505060405180910390f35b3480156112ec57600080fd5b506112f5613325565b6040518082815260200191505060405180910390f35b34801561131757600080fd5b506113366004803603810190808035906020019092919050505061332b565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600460200280838360005b83811015611393578082015181840152602081019050611378565b5050505090500180602001828103825283818151815260200191508051906020019080838360005b838110156113d65780820151818401526020810190506113bb565b50505050905090810190601f1680156114035780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b34801561141f57600080fd5b50611428613541565b6040518082815260200191505060405180910390f35b34801561144a57600080fd5b5061147f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613547565b6040518082815260200191505060405180910390f35b3480156114a157600080fd5b506114aa61355f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156114f857600080fd5b50611537600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613585565b6040518082815260200191505060405180910390f35b34801561155957600080fd5b5061156261369a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156115b057600080fd5b506115b96136c0565b6040518082815260200191505060405180910390f35b3480156115db57600080fd5b50611610600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506136c9565b6040518082815260200191505060405180910390f35b61162e613712565b005b34801561163c57600080fd5b5061165b6004803603810190808035906020019092919050505061371d565b6040518082815260200191505060405180910390f35b34801561167d57600080fd5b5061168661373e565b6040518082815260200191505060405180910390f35b3480156116a857600080fd5b506116b1613744565b6040518082815260200191505060405180910390f35b3480156116d357600080fd5b506116dc61374e565b6040518082815260200191505060405180910390f35b3480156116fe57600080fd5b50611707613811565b6040518082815260200191505060405180910390f35b34801561172957600080fd5b506117486004803603810190808035906020019092919050505061381c565b6040518082815260200191505060405180910390f35b34801561176a57600080fd5b5061178960048036038101908080359060200190929190505050613859565b6040518082815260200191505060405180910390f35b3480156117ab57600080fd5b506117e0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061390d565b6040518082815260200191505060405180910390f35b34801561180257600080fd5b5061180b613925565b005b34801561181957600080fd5b50611822613a6e565b6040518082815260200191505060405180910390f35b600e5481565b60008061184b8484613585565b90506118b3601b600085815260200190815260200160002060060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482613a7390919063ffffffff16565b91505092915050565b60155481565b60135481565b6103e881565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b600c5481565b601e5481565b600073fe00bdcee68a70bbb7559f83fcdb24da2a357ffe63dacc8e116020546040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561197557600080fd5b505af4158015611989573d6000803e3d6000fd5b505050506040513d602081101561199f57600080fd5b8101908080519060200190929190505050905090565b6000601b6000838152602001908152602001600020600101549050919050565b6000808243111515611a4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f626c6f636b48617368206e6f74206176616961626c650000000000000000000081525060200191505060405180910390fd5b60fe80844303811515611a5e57fe5b04029050808301915050919050565b610e1081565b600073fe00bdcee68a70bbb7559f83fcdb24da2a357ffe6312d6c7046020546040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b158015611ae257600080fd5b505af4158015611af6573d6000803e3d6000fd5b505050506040513d6020811015611b0c57600080fd5b8101908080519060200190929190505050905090565b6000601b600084815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60196020528060005260406000206000915090505481565b600060175460165414905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600180549050905090565b60115481565b601a6020528060005260406000206000915090505481565b67016345785d8a000081565b601c5481565b601b60205280600052604060002060009150905080600001549080600101549080600701549080600801549080600901549080600a01549080600b01549080600c01549080600d0154905089565b603c81565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611d0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f616c72656164792073657475700000000000000000000000000000000000000081525060200191505060405180910390fd5b806000600681101515611d1b57fe5b6020020151600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806001600681101515611d6f57fe5b6020020151600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806002600681101515611dc357fe5b6020020151600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806004600681101515611e1757fe5b6020020151600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60175481565b600080611e94601b6000601654815260200190815260200160002060090154603c613a9490919063ffffffff16565b905042811115611ea75760009150611ecc565b43611eb36016546119b5565b101515611ec35760009150611ecc565b60006016541191505b5090565b600d5481565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611f2457fe5b9060005260206000200154905092915050565b601f5481565b60006015546014546013540101905090565b60205481565b611f5f8133612534565b50565b611f6a611e65565b1515611fde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4e6f7420726561647920746f206472617720726573756c74730000000000000081525060200191505060405180910390fd5b6000601b6000601654815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061204457506000602054145b15156120b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6d75737420627579206174206c656173742031207469636b657400000000000081525060200191505060405180910390fd5b6120c133613ab5565b6120c9613e09565b565b60fe81565b6000601b6000838152602001908152602001600020600901549050919050565b600080601b6000601654815260200190815260200160002060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061216c575042601b6000601654815260200190815260200160002060080154115b9050919050565b6103e881565b600081600180850381548110151561218d57fe5b9060005260206000209060070201600401541080156121cc5750816001848154811015156121b757fe5b90600052602060002090600702016004015410155b905092915050565b600073fe00bdcee68a70bbb7559f83fcdb24da2a357ffe6361129a806020546040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561224357600080fd5b505af4158015612257573d6000803e3d6000fd5b505050506040513d602081101561226d57600080fd5b8101908080519060200190929190505050905090565b60125481565b6000601b6000838152602001908152602001600020600c01549050919050565b610e10600c0281565b60186020528060005260406000206000915090505481565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b6000601b6000838152602001908152602001600020600b01549050919050565b601d5481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612427576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6f6e6c7920666f7220646576656c6f706d656e74207465616d0000000000000081525060200191505060405180910390fd5b60128110158015612439575060165481115b15156124ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f746f6f206561726c7920746f20656e640000000000000000000000000000000081525060200191505060405180910390fd5b63054c563860175414151561252a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f616c72656164792073657400000000000000000000000000000000000000000081525060200191505060405180910390fd5b8060178190555050565b6000806000612541615239565b6000806000806000806000601b6000601654815260200190815260200160002060080154421115156125db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f6e6f7420726561647920746f2073656c6c205469636b6574000000000000000081525060200191505060405180910390fd5b601b60006016548152602001908152602001600020600901544210151561266a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f726f756e64206f7665720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b73fe00bdcee68a70bbb7559f83fcdb24da2a357ffe631bd951558e6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126f05780820151818401526020810190506126d5565b50505050905090810190601f16801561271d5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561273a57600080fd5b505af415801561274e573d6000803e3d6000fd5b505050506040513d602081101561276457600080fd5b81019080805190602001909291905050509a50349950602054985073fe00bdcee68a70bbb7559f83fcdb24da2a357ffe63dacc8e118a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b1580156127ea57600080fd5b505af41580156127fe573d6000803e3d6000fd5b505050506040513d602081101561281457600080fd5b81019080805190602001909291905050508a1015151561289c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6e6f7420656e6f75676820746f206275792031207469636b657400000000000081525060200191505060405180910390fd5b6128a68c8b613e29565b8a601f5401601f819055506016548860200181815250508b886000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050898860a00181815250508a8860c001818152505073fe00bdcee68a70bbb7559f83fcdb24da2a357ffe6361101bed8b8b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018281526020019250505060206040518083038186803b15801561297c57600080fd5b505af4158015612990573d6000803e3d6000fd5b505050506040513d60208110156129a657600080fd5b8101908080519060200190929190505050965073fe00bdcee68a70bbb7559f83fcdb24da2a357ffe6312d6c7048a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b158015612a2457600080fd5b505af4158015612a38573d6000803e3d6000fd5b505050506040513d6020811015612a4e57600080fd5b8101908080519060200190929190505050955073fe00bdcee68a70bbb7559f83fcdb24da2a357ffe6361129a808a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b158015612acc57600080fd5b505af4158015612ae0573d6000803e3d6000fd5b505050506040513d6020811015612af657600080fd5b81019080805190602001909291905050509450612b1c8786613f0390919063ffffffff16565b935073fe00bdcee68a70bbb7559f83fcdb24da2a357ffe636acd8e4a8a896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018281526020019250505060206040518083038186803b158015612b9157600080fd5b505af4158015612ba5573d6000803e3d6000fd5b505050506040513d6020811015612bbb57600080fd5b81019080805190602001909291905050509250612bda60165484613f41565b612bed8688613f0390919063ffffffff16565b9150612c0482601e54613a9490919063ffffffff16565b601e81905550601e548860800181815250506001808054905003905060018082815481101515612c3057fe5b9060005260206000209060070201600301540188604001818152505086600182815481101515612c5c57fe5b90600052602060002090600702016003015401886060018181525050612c828c88614041565b612c8c8c856141bd565b6001889080600181540180825580915050906001820390600052602060002090600702016000909192909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505050600180549050601b60006016548152602001908152602001600020600d0181905550600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001808054905003908060018154018082558091505090600182039060005260206000200160009091929091909150555043601d54141515612ded57612de56143b4565b43601d819055505b612dfa8c6016548c61470a565b612e1b601b600060165481526020019081526020016000206009015461381c565b601b600060165481526020019081526020016000206001018190555050505050505050505050505050565b610e1060180281565b610e1060180281565b60145481565b6000601b6000838152602001908152602001600020600a01549050919050565b600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612f46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f42616e6b206f6e6c79000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006016541415612f5657613109565b612f5f83614a32565b600160165403601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e9288d7282856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019150506000604051808303818588803b1580156130ec57600080fd5b505af1158015613100573d6000803e3d6000fd5b50505050508091505b50919050565b600080600080601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506001601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540191506016546064830110156131b25760646016540391505b8190505b601654811115156131dc576131cb8582613585565b8301925080806001019150506131b6565b829350505050919050565b60046020528060005260406000206000915090505481565b600080600080600092506001601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540191506016546064830110156132645760646016540391505b8190505b6016548111151561329e5761328f613280868361183e565b84613a9490919063ffffffff16565b92508080600101915050613268565b829350505050919050565b67016345785d8a000081565b60105481565b6000601b600084815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e1060180260070281565b6103e881565b600061333561528d565b606061333f615239565b60018581548110151561334e57fe5b906000526020600020906007020160e060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481525050905080600001516080604051908101604052808360200151815260200183604001518152602001836060015181526020018360a0015181525073fe00bdcee68a70bbb7559f83fcdb24da2a357ffe63e93956798460c001516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060006040518083038186803b1580156134a257600080fd5b505af41580156134b6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156134e057600080fd5b8101908080516401000000008111156134f857600080fd5b8281019050602081018481111561350e57600080fd5b815185600182028301116401000000008211171561352b57600080fd5b5050929190505050935093509350509193909250565b600f5481565b60036020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000601b600087815260200190815260200160002060040160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549350601b6000878152602001908152602001600020600701549250601b600087815260200190815260200160002060050160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915061368b6103e861367d8461366f8888613f0390919063ffffffff16565b613a7390919063ffffffff16565b614b1690919063ffffffff16565b90508094505050505092915050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e1060030281565b6000601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61371b34614b40565b565b6000814311151561373057439050613739565b81406001900490505b919050565b600b5481565b6000601654905090565b600073fe00bdcee68a70bbb7559f83fcdb24da2a357ffe63d114751e601354600054601e546040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156137d157600080fd5b505af41580156137e5573d6000803e3d6000fd5b505050506040513d60208110156137fb57600080fd5b8101908080519060200190929190505050905090565b66071afd498d000081565b6000806000834210151561383557600843019250613852565b4284039150600c8281151561384657fe5b04905060088143010192505b5050919050565b6000806000806000600180805490500393506001601b60006001601654038152602001908152602001600020600d01540192505b83831115156139005760028484018115156138a457fe5b0491506001828154811015156138b657fe5b90600052602060002090600702016004015490506138d48287612179565b156138e157819450613904565b858110156138f4576001820192506138fb565b6001820393505b61388d565b8194505b50505050919050565b60056020528060005260406000206000915090505481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156139ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6f6e6c7920666f7220646576656c6f706d656e74207465616d0000000000000081525060200191505060405180910390fd5b6000601654141515613a64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f616c72656164792061637469766174656400000000000000000000000000000081525060200191505060405180910390fd5b613a6c613e09565b565b600c81565b600080838311151515613a8557600080fd5b82840390508091505092915050565b6000808284019050838110151515613aab57600080fd5b8091505092915050565b60008060008060008060008060008060006016549a50613aea601b60008d8152602001908152602001600020600101546119d5565b9950601f54613af88b61371d565b0198506064601354811515613b0957fe5b049750600b5488029650600d548802955087866013540303601381905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bdb66236876040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b158015613bad57600080fd5b505af1158015613bc1573d6000803e3d6000fd5b5050505050613bce61374e565b9450600093505b6003841015613d235773fe00bdcee68a70bbb7559f83fcdb24da2a357ffe63655b08eb8a876040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018281526020019250505060206040518083038186803b158015613c5157600080fd5b505af4158015613c65573d6000803e3d6000fd5b505050506040513d6020811015613c7b57600080fd5b81019080805190602001909291905050509250601e5483111515613d165786601360008282540392505081905550613cb283613859565b9150600182815481101515613cc357fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050613d048183896002614b92565b600a89811515613d1057fe5b04890198505b8380600101945050613bd5565b613d408c6000600a60038c02811515613d3857fe5b046003614b92565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6d9169600a60078b02811515613d8d57fe5b046016546040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b158015613de257600080fd5b505af1158015613df6573d6000803e3d6000fd5b5050505050505050505050505050505050565b613e11614d77565b613e19611b98565b15613e2757613e26614fb2565b5b565b80601b60006016548152602001908152602001600020600c016000828254019250508190555080601b6000601654815260200190815260200160002060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050565b6000806000841415613f185760009150613f3a565b8284029050828482811515613f2957fe5b04141515613f3657600080fd5b8091505b5092915050565b73fe00bdcee68a70bbb7559f83fcdb24da2a357ffe63abcd0d9d82601b600086815260200190815260200160002060090154601b6000878152602001908152602001600020600a01546040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015613fe857600080fd5b505af4158015613ffc573d6000803e3d6000fd5b505050506040513d602081101561401257600080fd5b8101908080519060200190929190505050601b6000848152602001908152602001600020600901819055505050565b80601b60006016548152602001908152602001600020600b015401601b60006016548152602001908152602001600020600b018190555080601b6000601654815260200190815260200160002060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401601b6000601654815260200190815260200160002060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806020540160208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6141e8601b600060165481526020019081526020016000206000015482613a9490919063ffffffff16565b601b600060165481526020019081526020016000206000018190555061426c601b6000601654815260200190815260200160002060040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482613a9490919063ffffffff16565b601b6000601654815260200190815260200160002060040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506143576142f3601b600060165481526020019081526020016000206007015483613f0390919063ffffffff16565b601b6000601654815260200190815260200160002060050160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a9490919063ffffffff16565b601b6000601654815260200190815260200160002060050160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008060008060006143c7601d546119d5565b94506143d28561371d565b93505b601b60006016548152602001908152602001600020600d01546001601c540110156147035760066103e88581151561440957fe5b06148015614441575067016345785d8a00006001601c5481548110151561442c57fe5b90600052602060002090600702016005015410155b15614571576001601c5481548110151561445757fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c54606460145481151561449c57fe5b040292506144af81601c54856001614b92565b600d5460646014548115156144c057fe5b04029150600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bdb66236836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561454a57600080fd5b505af115801561455e573d6000803e3d6000fd5b5050505050818360145403036014819055505b60086103e8601c54860181151561458457fe5b061480156145bc575067016345785d8a00006001601c548154811015156145a757fe5b90600052602060002090600702016005015410155b156146ec576001601c548154811015156145d257fe5b906000526020600020906007020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c54606460155481151561461757fe5b0402925061462a81601c54856000614b92565b600d54606460155481151561463b57fe5b04029150600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bdb66236836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b1580156146c557600080fd5b505af11580156146d9573d6000803e3d6000fd5b5050505050818360155403036015819055505b6001840193506001601c5401601c819055506143d5565b5050505050565b60008060008060008060008060648981151561472257fe5b049750600d548802965060105488029550600e5488029450600f548802935083858789010101925061475d838a613a7390919063ffffffff16565b915061476882614b40565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e947962b878d6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019150506000604051808303818588803b15801561482557600080fd5b505af1158015614839573d6000803e3d6000fd5b5050505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bdb66236886040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b1580156148c457600080fd5b505af11580156148d8573d6000803e3d6000fd5b5050505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636f0b5180868d6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019150506000604051808303818588803b15801561499a57600080fd5b505af11580156149ae573d6000803e3d6000fd5b50505050506149e0601b60008c8152602001908152602001600020600001546103e88602614b1690919063ffffffff16565b9050614a0b601b60008c81526020019081526020016000206007015482613a9490919063ffffffff16565b601b60008c8152602001908152602001600020600701819055505050505050505050505050565b6000806016541415614a4357614b12565b614a4f826016546150bb565b5060016016540390505b601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481118015614aab575060165460148201115b15614b1157614aba82826150bb565b601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600181039050614a59565b5b5050565b600080600083111515614b2857600080fd5b8284811515614b3357fe5b0490508091505092915050565b600080600080606485811515614b5257fe5b0493506012548402925060115484029150818386030390508260155401601581905550816014540160148190555080601354016013819055505050505050565b614be482601860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a9490919063ffffffff16565b601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f9a01e9485601654600187815481101515614c7857fe5b906000526020600020906007020160020154600188815481101515614c9957fe5b90600052602060002090600702016003015487876003811115614cb857fe5b6040518763ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018381526020018281526020019650505050505050600060405180830381600087803b158015614d5957600080fd5b505af1158015614d6d573d6000803e3d6000fd5b5050505050505050565b614d7f615239565b614d876152b0565b601b60006016548152602001908152602001600020600b01548260600181815250506001829080600181540180825580915050906001820390600052602060002090600702016000909192909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060155505050614e7542610e10601802613a9490919063ffffffff16565b8160600181815250508060600151610e10600302018160800181815250508060600151610e10601802600702018160a0018181525050614eb8816080015161381c565b816020018181525050601b60006016548152602001908152602001600020600b01548160c0018181525050601b60006016548152602001908152602001600020600c01548160e00181815250506001805490508161010001818152505060016016540160168190555080601b60006016548152602001908152602001600020600082015181600001556020820151816001015560408201518160070155606082015181600801556080820151816009015560a082015181600a015560c082015181600b015560e082015181600c015561010082015181600d01559050506013546000819055506000601e8190555060006020819055505050565b6000614fbc611f3d565b9050600060138190555060006014819055506000601581905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bdb66236826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561505c57600080fd5b505af1158015615070573d6000803e3d6000fd5b5050505050600a4202601b60006016548152602001908152602001600020600801819055506001600a420201601b600060165481526020019081526020016000206009018190555050565b6000806150c8848461183e565b905060008114156150dc5760009150615232565b615142601b600085815260200190815260200160002060060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482613a9490919063ffffffff16565b601b600085815260200190815260200160002060060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506151eb601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482613a9490919063ffffffff16565b601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508091505b5092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b608060405190810160405280600490602082028038833980820191505090505090565b6101206040519081016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815250905600a165627a7a72305820e9fa52ef32ab54cf2b82a296f1d52806d2e994fbc0ce7174296c2fea9f393f59002900000000000000000000000096504e1f83e380984b1d4eccc0e8b9f0559b2ad2


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

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000096504e1f83e380984b1d4eccc0e8b9f0559b2ad2


   Library Used
Helper : 0xfe00bdcee68a70bbb7559f83fcdb24da2a357ffe

   Swarm Source:
bzzr://e9fa52ef32ab54cf2b82a296f1d52806d2e994fbc0ce7174296c2fea9f393f59
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.