Sponsored:   Ubex.com - Crypto Valley IAB member. Traded on Bitforex, Bitmart, Btc-Alpha, IDEX, Bilaxy, soon on Lbank.
Contract Overview
Balance: 5.239434097202662478 Ether
Ether Value: $1,224.46 (@ $233.70/ETH)
Transactions: 679 txns
 Latest 25 txns From a total of 679 Transactions

TxHash Age From To Value [TxFee]
0x94c2a9f080be4eaf6a5740fb1cd12caaf20078e171f45118ba9ecdd19624ac8f4 days 5 hrs ago0x4111b1d7a7e6f29810a7e5402862ef0f85855e16  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0 Ether0.00115914
0x450afb2ff0779b73ab125b619fbc096bb91012776ee6a7629cda81e826ca10786 days 40 mins ago0x0a531cef9ac6ad84bc6f914060db02b9de2854ef  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0 Ether0.00085914
0x9a6dba75cd3529787addd43aafa7dd1fd8aab4b1bf0a4c6ba717839d981405748 days 11 hrs ago0xb327d112a560f832765a12c72451de40af3c2be2  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0 Ether0.00075566
0xd500768e42d6583957e22f4a19c1b56a9f12e617465f0ab65863a179355f93508 days 19 hrs ago0x6026f6a663561e18c669511091b3a7c9ef34c0e3  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.052971685708673 Ether0.000850616
0x91f2f5e047a917ecc1ee5fc5ac46da228c7d8686d70c05118198e0bab0eed53a8 days 19 hrs ago0xb327d112a560f832765a12c72451de40af3c2be2  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0 Ether0.00028697
0xd7816b8c3c801cef715d38d19ff03fd7d0b119889f032fd462100d2267d86c2f9 days 53 mins ago0x6026f6a663561e18c669511091b3a7c9ef34c0e3  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.045348086821157 Ether0.000857204146
0xa675cb2c4613989f6c31cc21e3d5af984b6bbc6370419be441b78830cff097099 days 2 hrs ago0xf1f1bac59d4e4965259e5083f9104d9c463c7689  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.0009 Ether0.001327056292
0xba6e86637ddaf26070b567adad93763a3b18ba032b2b22c47211c17a9a19b6259 days 2 hrs ago0xf1f1bac59d4e4965259e5083f9104d9c463c7689  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0 Ether0.000205934764
0x5d21de6a35695720343909089eb0f830a46fcf0144d9eaf9bc90732c28a6d10f9 days 5 hrs ago0x6026f6a663561e18c669511091b3a7c9ef34c0e3  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.060362709847885 Ether0.000996635
0xe58bb400212d3d70dd41068edad021b65952d8efc0b9ad0712c199fcd731d7b39 days 12 hrs ago0x716beda3baf905d776944cbddb5c95380429fcd5  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.045215817272697 Ether0.000785184
0x3ca5b157a9dab01b7c8bcf7750ff98ba3d92e1ce54eeb3fad31d04bbe9052e659 days 16 hrs ago0x716beda3baf905d776944cbddb5c95380429fcd5  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.037640805434711 Ether0.0007590112
0xc68e85e6af05e29b7ba5cbfc43a822dca3f8a4fd2fc57530911598e4c60c3ac29 days 20 hrs ago0x716beda3baf905d776944cbddb5c95380429fcd5  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.022570425124329 Ether0.001195962
0x6c5c90cf4faf230605a1c8ffff040ad3ac4c74dfc1f547b5b741c67abaa1f8629 days 20 hrs ago0xb327d112a560f832765a12c72451de40af3c2be2  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.000080762312 Ether0.000960785
0xc0c321bdf733c773b5f0a78966da7691cfed89de6af9292b4dd750e7fb2b8a4310 days 39 mins ago0xb327d112a560f832765a12c72451de40af3c2be2  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0 Ether0.000344364
0x30d7ad994a888e34811e9101aff9de63ca49154b9a809ca8eb62f6ebc3a5d5a510 days 40 mins ago0xf61c16093ae0a4c30553a89072132220bcd0ae3c  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.0001 Ether0.001881752562
0x6b2d2282e838f88097fa7751f9e576a537ec7f897832f9da06c8e56a23ae8e1210 days 41 mins ago0xb327d112a560f832765a12c72451de40af3c2be2  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.1126756640625 Ether0.00576147
0xe6b685e35d3600ba17caf72c0e6009bfb0aebb3de8f846c6624a82623f8510f710 days 43 mins ago0x3dd1384c8616eb5368382e07b1463563937de102  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.0003 Ether0.00112936
0x1124651c74251fde382b69ab565631f70f0a344d2d6edc619e6cb0283c0af43a10 days 45 mins ago0xb327d112a560f832765a12c72451de40af3c2be2  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.0000775221352 Ether0.00166242
0x13d779fd1f08319066ac8fd8df0e516909aa33020cee410e6e6b10b14db4895c10 days 48 mins ago0xf61c16093ae0a4c30553a89072132220bcd0ae3c  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.0001 Ether0.001219202906
0xc1307a33b9c112e88531a06ca714f44a31b103cc3f9e341ec54572b6e3371ab610 days 52 mins ago0xb327d112a560f832765a12c72451de40af3c2be2  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.0000775221352 Ether0.001074745
0xb2de496ed12059987094f1edecc9fa6b152c03ac51ab232eb4a88da02b9ea0bc10 days 2 hrs ago0x716beda3baf905d776944cbddb5c95380429fcd5  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.046445011353181 Ether0.0001638
0x8dbece0c42d3ee8792eda8037861067e41a2db021270c833e09d67cc08f6f0fb10 days 7 hrs ago0x716beda3baf905d776944cbddb5c95380429fcd5  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.038665133300313 Ether0.000916048
0xd30df418cdae1dc028adbe14b15f4989676989fd9b228647f25e29b88a31f83a10 days 11 hrs ago0x716beda3baf905d776944cbddb5c95380429fcd5  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.030907116717773 Ether0.000785184
0x8fb6572e9c5ae1ebafd399154119139a4421c7727ab1ca599e6534ddc707f5ad10 days 16 hrs ago0x716beda3baf905d776944cbddb5c95380429fcd5  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.04630445914423 Ether0.000785568
0xe2f722dd6c82be87f5838dec9e523ccfd39c77f25a7a81cd8cb61dc4cb4d36d110 days 18 hrs ago0x716beda3baf905d776944cbddb5c95380429fcd5  IN   0x1e0c81f0fa468941844337fc6704a1f631046e6f0.053945360678229 Ether0.00079957904
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click Here To View More View All
ParentTxHash Block Age From To Value
0x94c2a9f080be4eaf6a5740fb1cd12caaf20078e171f45118ba9ecdd19624ac8f63655694 days 5 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0x4111b1d7a7e6f29810a7e5402862ef0f85855e160.262272673190708894 Ether
0x450afb2ff0779b73ab125b619fbc096bb91012776ee6a7629cda81e826ca107863545716 days 40 mins ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0x0a531cef9ac6ad84bc6f914060db02b9de2854ef0.296732225803600868 Ether
0x9a6dba75cd3529787addd43aafa7dd1fd8aab4b1bf0a4c6ba717839d9814057463397498 days 11 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb327d112a560f832765a12c72451de40af3c2be20.00793232133073705 Ether
0x9a6dba75cd3529787addd43aafa7dd1fd8aab4b1bf0a4c6ba717839d9814057463397498 days 11 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.075573191316798456 Ether
0x9a6dba75cd3529787addd43aafa7dd1fd8aab4b1bf0a4c6ba717839d9814057463397498 days 11 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.015114638263359691 Ether
0x9a6dba75cd3529787addd43aafa7dd1fd8aab4b1bf0a4c6ba717839d9814057463397498 days 11 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.060458553053438764 Ether
0xd500768e42d6583957e22f4a19c1b56a9f12e617465f0ab65863a179355f935063378048 days 19 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.00529716857086732 Ether
0x91f2f5e047a917ecc1ee5fc5ac46da228c7d8686d70c05118198e0bab0eed53a63377118 days 19 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb327d112a560f832765a12c72451de40af3c2be20.053721887821742081 Ether
0xd7816b8c3c801cef715d38d19ff03fd7d0b119889f032fd462100d2267d86c2f63363409 days 53 mins ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.00453480868211574 Ether
0xa675cb2c4613989f6c31cc21e3d5af984b6bbc6370419be441b78830cff0970963359249 days 2 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.00009 Ether
0x5d21de6a35695720343909089eb0f830a46fcf0144d9eaf9bc90732c28a6d10f63350679 days 5 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.00603627098478856 Ether
0xe58bb400212d3d70dd41068edad021b65952d8efc0b9ad0712c199fcd731d7b363334029 days 12 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.0045215817272697 Ether
0x3ca5b157a9dab01b7c8bcf7750ff98ba3d92e1ce54eeb3fad31d04bbe9052e6563322959 days 16 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.00376408054347115 Ether
0xc68e85e6af05e29b7ba5cbfc43a822dca3f8a4fd2fc57530911598e4c60c3ac263314249 days 20 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.00225704251243296 Ether
0x6c5c90cf4faf230605a1c8ffff040ad3ac4c74dfc1f547b5b741c67abaa1f86263312629 days 20 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.0000080762312 Ether
0xc0c321bdf733c773b5f0a78966da7691cfed89de6af9292b4dd750e7fb2b8a43633032610 days 39 mins ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb327d112a560f832765a12c72451de40af3c2be20.566331620289340408 Ether
0x30d7ad994a888e34811e9101aff9de63ca49154b9a809ca8eb62f6ebc3a5d5a5633032110 days 40 mins ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.00001 Ether
0x6b2d2282e838f88097fa7751f9e576a537ec7f897832f9da06c8e56a23ae8e12633032010 days 41 mins ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.01126756640625001 Ether
0xe6b685e35d3600ba17caf72c0e6009bfb0aebb3de8f846c6624a82623f8510f7633031610 days 43 mins ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.234964687302790008 Ether
0xe6b685e35d3600ba17caf72c0e6009bfb0aebb3de8f846c6624a82623f8510f7633031610 days 43 mins ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.046992937460558001 Ether
0xe6b685e35d3600ba17caf72c0e6009bfb0aebb3de8f846c6624a82623f8510f7633031610 days 43 mins ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.187971749842232005 Ether
0x1124651c74251fde382b69ab565631f70f0a344d2d6edc619e6cb0283c0af43a633030710 days 45 mins ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.00000775221352 Ether
0x13d779fd1f08319066ac8fd8df0e516909aa33020cee410e6e6b10b14db4895c633029310 days 48 mins ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.00001 Ether
0xc1307a33b9c112e88531a06ca714f44a31b103cc3f9e341ec54572b6e3371ab6633027910 days 52 mins ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.00000775221352 Ether
0x8dbece0c42d3ee8792eda8037861067e41a2db021270c833e09d67cc08f6f0fb632863710 days 7 hrs ago0x1e0c81f0fa468941844337fc6704a1f631046e6f0xb14d7b0ec631daf0cf02d69860974df04987a9f80.0038665133300313 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: F3Dx
Compiler Text: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.24;

/**
 * @title -FoMo-3Dx beta
 * 
 * WARNING:  THIS PRODUCT IS HIGHLY ADDICTIVE.  IF YOU HAVE AN ADDICTIVE NATURE.  DO NOT PLAY.
 */

//==============================================================================
//     _    _  _ _|_ _  .
//    (/_\/(/_| | | _\  .
//==============================================================================
contract F3Devents {
    // fired whenever a player registers a name
    event onNewName
    (
        uint256 indexed playerID,
        address indexed playerAddress,
        bytes32 indexed playerName,
        bool isNewPlayer,
        uint256 amountPaid,
        uint256 timeStamp
    );
    
    // fired at end of buy or reload
    event onEndTx
    (
        uint256 compressedData,     
        uint256 compressedIDs,      
        bytes32 playerName,
        address playerAddress,
        uint256 ethIn,
        uint256 keysBought,
        address winnerAddr,
        bytes32 winnerName,
        uint256 amountWon,
        uint256 devAmount,
        uint256 genAmount,
        uint256 potAmount
    );
    
	// fired whenever theres a withdraw
    event onWithdraw
    (
        uint256 indexed playerID,
        address playerAddress,
        bytes32 playerName,
        uint256 ethOut,
        uint256 timeStamp
    );
    
    // fired whenever a withdraw forces end round to be ran
    event onWithdrawAndDistribute
    (
        address playerAddress,
        bytes32 playerName,
        uint256 ethOut,
        uint256 compressedData,
        uint256 compressedIDs,
        address winnerAddr,
        bytes32 winnerName,
        uint256 amountWon,
        uint256 devAmount,
        uint256 genAmount
    );
    
    // (fomo3dx only) fired whenever a player tries a buy after round timer 
    // hit zero, and causes end round to be ran.
    event onBuyAndDistribute
    (
        address playerAddress,
        bytes32 playerName,
        uint256 ethIn,
        uint256 compressedData,
        uint256 compressedIDs,
        address winnerAddr,
        bytes32 winnerName,
        uint256 amountWon,
        uint256 devAmount,
        uint256 genAmount
    );
    
    // (fomo3dx only) fired whenever a player tries a reload after round timer 
    // hit zero, and causes end round to be ran.
    event onReLoadAndDistribute
    (
        address playerAddress,
        bytes32 playerName,
        uint256 compressedData,
        uint256 compressedIDs,
        address winnerAddr,
        bytes32 winnerName,
        uint256 amountWon,
        uint256 devAmount,
        uint256 genAmount
    );
}

//==============================================================================
//   _ _  _ _|_ _ _  __|_   _ _ _|_    _   .
//  (_(_)| | | | (_|(_ |   _\(/_ | |_||_)  .
//====================================|=========================================

contract modularLong is F3Devents {}

contract F3Dx is modularLong {
    using SafeMath for *;
    using NameFilter for string;
    using F3DKeysCalcLong for uint256;

    address constant private AwardPool = 0xb14D7b0ec631Daf0cF02d69860974df04987a9f8;
    address constant private DeveloperRewards = 0xb14D7b0ec631Daf0cF02d69860974df04987a9f8;
    PlayerBookInterface constant private PlayerBook = PlayerBookInterface(0xdAc532cA5598Ee19a2dfC1244c7608C766c6C415);
//==============================================================================
//     _ _  _  |`. _     _ _ |_ | _  _  .
//    (_(_)| |~|~|(_||_|| (_||_)|(/__\  .  (game settings)
//=================_|===========================================================
    string constant public name = "FoMo3D X";
    string constant public symbol = "F3Dx";
    uint256 constant private rndInit_ = 1 hours;                // round timer starts at this
    uint256 constant private rndInc_ = 30 seconds;              // every full key purchased adds this much to the timer
    uint256 constant private rndMax_ = 8 hours;                // max length a round timer can be
//==============================================================================
//     _| _ _|_ _    _ _ _|_    _   .
//    (_|(_| | (_|  _\(/_ | |_||_)  .  (data used to store game info that changes)
//=============================|================================================
    uint256 public rID_;    // round id number / total rounds that have happened
//****************
// PLAYER DATA 
//****************
    mapping (address => uint256) public pIDxAddr_;          // (addr => pID) returns player id by address
    mapping (bytes32 => uint256) public pIDxName_;          // (name => pID) returns player id by name
    mapping (uint256 => F3Ddatasets.Player) public plyr_;   // (pID => data) player data
    mapping (uint256 => mapping (uint256 => F3Ddatasets.PlayerRounds)) public plyrRnds_;    // (pID => rID => data) player round data by player id & round id
    mapping (uint256 => mapping (bytes32 => bool)) public plyrNames_; // (pID => name => bool) list of names a player owns.  (used so you can change your display name amongst any name you own)
//****************
// ROUND DATA 
//****************
    mapping (uint256 => F3Ddatasets.Round) public round_;   // (rID => data) round data
//****************
// FEE DATA 
//****************
    F3Ddatasets.KeyFee public fees_;          // fee distribution by holder
    F3Ddatasets.PotSplit public potSplit_;     // fees pot split distribution
//==============================================================================
//     _ _  _  __|_ _    __|_ _  _  .
//    (_(_)| |_\ | | |_|(_ | (_)|   .  (initial data setup upon contract deploy)
//==============================================================================
    constructor()
        public
    {

		// Key allocation percentages
        // F3Dx + (Pot, Share, Developer)
        fees_ = F3Ddatasets.KeyFee(50,10);   //40% to pot, 50% to key holder, 10% to dev reward
        
        // Pot allocation percentages
        // (WIN, DEV)
        potSplit_ = F3Ddatasets.PotSplit(40,10);  //40% to offcial then transfer to winner, 10% to dev reward, 50% to official
    }
//==============================================================================
//     _ _  _  _|. |`. _  _ _  .
//    | | |(_)(_||~|~|(/_| _\  .  (these are safety checks)
//==============================================================================
    /**
     * @dev used to make sure no one can interact with contract until it has 
     * been activated. 
     */
    modifier isActivated() {
        require(activated_ == true, "its not ready yet."); 
        _;
    }
    
    /**
     * @dev prevents contracts from interacting with fomo3dx 
     */
    modifier isHuman() {
        address _addr = msg.sender;
        uint256 _codeLength;
        
        assembly {_codeLength := extcodesize(_addr)}
        require(_codeLength == 0, "sorry humans only");
        _;
    }

    /**
     * @dev sets boundaries for incoming tx 
     */
    modifier isWithinLimits(uint256 _eth) {
        require(_eth >= 1000000000, "pocket lint: not a valid currency");
        require(_eth <= 100000000000000000000000, "no vitalik, no");
        _;    
    }
    
//==============================================================================
//     _    |_ |. _   |`    _  __|_. _  _  _  .
//    |_)|_||_)||(_  ~|~|_|| |(_ | |(_)| |_\  .  (use these to interact with contract)
//====|=========================================================================
    /**
     * @dev emergency buy
     */
    function()
        isActivated()
        isHuman()
        isWithinLimits(msg.value)
        public
        payable
    {
        // set up our tx event data and determine if player is new or not
        F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_);
            
        // fetch player id
        uint256 _pID = pIDxAddr_[msg.sender];
        
        // buy core 
        buyCore(_pID, _eventData_);
    }
    
    /**
     * @dev converts all incoming ethereum to keys.
     */
    function buyXid()
        isActivated()
        isHuman()
        isWithinLimits(msg.value)
        public
        payable
    {
        // set up our tx event data and determine if player is new or not
        F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_);
        
        // fetch player id
        uint256 _pID = pIDxAddr_[msg.sender];
        
        // buy core 
        buyCore(_pID, _eventData_);
    }
    
    function buyXaddr()
        isActivated()
        isHuman()
        isWithinLimits(msg.value)
        public
        payable
    {
        // set up our tx event data and determine if player is new or not
        F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_);
        
        // fetch player id
        uint256 _pID = pIDxAddr_[msg.sender];
        
        // buy core 
        buyCore(_pID, _eventData_);
    }
    
    function buyXname()
        isActivated()
        isHuman()
        isWithinLimits(msg.value)
        public
        payable
    {
        // set up our tx event data and determine if player is new or not
        F3Ddatasets.EventReturns memory _eventData_ = determinePID(_eventData_);
        
        // fetch player id
        uint256 _pID = pIDxAddr_[msg.sender];
        
        // buy core 
        buyCore(_pID, _eventData_);
    }
    
    /**
     * @dev essentially the same as buy, but instead of you sending ether 
     * from your wallet, it uses your unwithdrawn earnings.
     * @param _eth amount of earnings to use (remainder returned to gen vault)
     */
    function reLoadXid(uint256 _eth)
        isActivated()
        isHuman()
        isWithinLimits(_eth)
        public
    {
        // set up our tx event data
        F3Ddatasets.EventReturns memory _eventData_;
        
        // fetch player ID
        uint256 _pID = pIDxAddr_[msg.sender];

        // reload core
        reLoadCore(_pID, _eth, _eventData_);
    }
    
    function reLoadXaddr(uint256 _eth)
        isActivated()
        isHuman()
        isWithinLimits(_eth)
        public
    {
        // set up our tx event data
        F3Ddatasets.EventReturns memory _eventData_;
        
        // fetch player ID
        uint256 _pID = pIDxAddr_[msg.sender];
        
        // reload core
        reLoadCore(_pID, _eth, _eventData_);
    }
    
    function reLoadXname(uint256 _eth)
        isActivated()
        isHuman()
        isWithinLimits(_eth)
        public
    {
        // set up our tx event data
        F3Ddatasets.EventReturns memory _eventData_;
        
        // fetch player ID
        uint256 _pID = pIDxAddr_[msg.sender];
    
        // reload core
        reLoadCore(_pID, _eth, _eventData_);
    }

    /**
     * @dev withdraws all of your earnings.
     * -functionhash- 0x3ccfd60b
     */
    function withdraw()
        isActivated()
        isHuman()
        public
    {
        // setup local rID 
        uint256 _rID = rID_;
        
        // grab time
        uint256 _now = now;
        
        // fetch player ID
        uint256 _pID = pIDxAddr_[msg.sender];
        
        // setup temp var for player eth
        uint256 _eth;
        
        // check to see if round has ended and no one has run round end yet
        if (_now > round_[_rID].end && round_[_rID].ended == false && round_[_rID].plyr != 0)
        {
            // set up our tx event data
            F3Ddatasets.EventReturns memory _eventData_;
            
            // end the round (distributes pot)
	        round_[_rID].ended = true;
            _eventData_ = endRound(_eventData_);
            
			// get their earnings
            _eth = withdrawEarnings(_pID);
            
            // gib moni
            if (_eth > 0)
                plyr_[_pID].addr.transfer(_eth);    
            
            // build event data
            _eventData_.compressedData = _eventData_.compressedData + (_now * 1000000000000000000);
            _eventData_.compressedIDs = _eventData_.compressedIDs + _pID;
            
            // fire withdraw and distribute event
            emit F3Devents.onWithdrawAndDistribute
            (
                msg.sender, 
                plyr_[_pID].name, 
                _eth, 
                _eventData_.compressedData, 
                _eventData_.compressedIDs, 
                _eventData_.winnerAddr, 
                _eventData_.winnerName, 
                _eventData_.amountWon, 
                _eventData_.devAmount, 
                _eventData_.genAmount
            );
            
        // in any other situation
        } else {
            // get their earnings
            _eth = withdrawEarnings(_pID);
            
            // gib moni
            if (_eth > 0)
                plyr_[_pID].addr.transfer(_eth);
            
            // fire withdraw event
            emit F3Devents.onWithdraw(_pID, msg.sender, plyr_[_pID].name, _eth, _now);
        }
    }
    
    /**
     * @dev use these to register names.  they are just wrappers that will send the
     * registration requests to the PlayerBook contract.  So registering here is the 
     * same as registering there.  UI will always display the last name you registered.
     * - must pay a registration fee.
     * - name must be unique
     * - names will be converted to lowercase
     * - name cannot start or end with a space 
     * - cannot have more than 1 space in a row
     * - cannot be only numbers
     * - cannot start with 0x 
     * - name must be at least 1 char
     * - max length of 32 characters long
     * - allowed characters: a-z, 0-9, and space
     * @param _nameString players desired name
     * @param _all set to true if you want this to push your info to all games 
     * (this might cost a lot of gas)
     */
    function registerNameXID(string _nameString, bool _all)
        isHuman()
        public
        payable
    {
        bytes32 _name = _nameString.nameFilter();
        address _addr = msg.sender;
        uint256 _paid = msg.value;
        bool _isNewPlayer = PlayerBook.registerNameXIDFromDapp.value(_paid)(_addr, _name, _all);
        
        uint256 _pID = pIDxAddr_[_addr];
        
        // fire event
        emit F3Devents.onNewName(_pID, _addr, _name, _isNewPlayer, _paid, now);
    }
    
    function registerNameXaddr(string _nameString, bool _all)
        isHuman()
        public
        payable
    {
        bytes32 _name = _nameString.nameFilter();
        address _addr = msg.sender;
        uint256 _paid = msg.value;
        bool _isNewPlayer = PlayerBook.registerNameXaddrFromDapp.value(msg.value)(msg.sender, _name, _all);
        
        uint256 _pID = pIDxAddr_[_addr];
        
        // fire event
        emit F3Devents.onNewName(_pID, _addr, _name, _isNewPlayer, _paid, now);
    }
    
    function registerNameXname(string _nameString, bool _all)
        isHuman()
        public
        payable
    {
        bytes32 _name = _nameString.nameFilter();
        address _addr = msg.sender;
        uint256 _paid = msg.value;
        bool _isNewPlayer = PlayerBook.registerNameXnameFromDapp.value(msg.value)(msg.sender, _name, _all);
        
        uint256 _pID = pIDxAddr_[_addr];
        
        // fire event
        emit F3Devents.onNewName(_pID, _addr, _name, _isNewPlayer, _paid, now);
    }
//==============================================================================
//     _  _ _|__|_ _  _ _  .
//    (_|(/_ |  | (/_| _\  . (for UI & viewing things on etherscan)
//=====_|=======================================================================
    /**
     * @dev return the price buyer will pay for next 1 individual key.
     * -functionhash- 0x018a25e8
     * @return price for next key bought (in wei format)
     */
    function getBuyPrice()
        public 
        view 
        returns(uint256)
    {  
        // setup local rID
        uint256 _rID = rID_;
        
        // grab time
        uint256 _now = now;
        
        // are we in a round?
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
            return ( (round_[_rID].keys.add(1000000000000000000)).ethRec(1000000000000000000) );
        else // rounds over.  need price for new round
            return ( 75000000000000 ); // init
    }
    
    /**
     * @dev returns time left.  dont spam this, you'll ddos yourself from your node 
     * provider
     * -functionhash- 0xc7e284b8
     * @return time left in seconds
     */
    function getTimeLeft()
        public
        view
        returns(uint256)
    {
        // setup local rID
        uint256 _rID = rID_;
        
        // grab time
        uint256 _now = now;
        
        if (_now < round_[_rID].end)
            if (_now > round_[_rID].strt)
                return( (round_[_rID].end).sub(_now) );
            else
                return( (round_[_rID].strt).sub(_now) );
        else
            return(0);
    }
    
    /**
     * @dev returns player earnings per vaults 
     * -functionhash- 0x63066434
     * @return winnings vault
     * @return general vault
     */
    function getPlayerVaults(uint256 _pID)
        public
        view
        returns(uint256 ,uint256)
    {
        // setup local rID
        uint256 _rID = rID_;
        
        // if round has ended.  but round end has not been run (so contract has not distributed winnings)
        if (now > round_[_rID].end && round_[_rID].ended == false && round_[_rID].plyr != 0)
        {
            return
            (
                plyr_[_pID].win,
                (plyr_[_pID].gen).add(  getPlayerVaultsHelper(_pID, _rID).sub(plyrRnds_[_pID][_rID].mask)  )
            );
        // if round is still going on, or round has ended and round end has been ran
        } else {
            return
            (
                plyr_[_pID].win,
                (plyr_[_pID].gen).add(calcUnMaskedEarnings(_pID, plyr_[_pID].lrnd))
            );
        }
    }
    
    /**
     * solidity hates stack limits.  this lets us avoid that hate 
     */
    function getPlayerVaultsHelper(uint256 _pID, uint256 _rID)
        private
        view
        returns(uint256)
    {
        return(  ((((round_[_rID].mask).add(((((round_[_rID].pot).mul(50)).div(100)).mul(1000000000000000000)) / (round_[_rID].keys))).mul(plyrRnds_[_pID][_rID].keys)) / 1000000000000000000)  );
    }
    
    /**
     * @dev returns all current round info needed for front end
     * -functionhash- 0x747dff42
     * @return eth invested during ICO phase
     * @return round id 
     * @return total keys for round 
     * @return time round ends
     * @return time round started
     * @return current pot 
     * @return player ID in lead 
     * @return current player in leads address 
     * @return current player in leads name
     */
    function getCurrentRoundInfo()
        public
        view
        returns(uint256, uint256, uint256, uint256, uint256, uint256, uint256, address, bytes32)
    {
        // setup local rID
        uint256 _rID = rID_;
        
        return
        (
            round_[_rID].ico,               //0
            _rID,                           //1
            round_[_rID].keys,              //2
            round_[_rID].end,               //3
            round_[_rID].strt,              //4
            round_[_rID].pot,               //5
            (round_[_rID].plyr * 10),     //6
            plyr_[round_[_rID].plyr].addr,  //7
            plyr_[round_[_rID].plyr].name  //8
        );
    }

    /**
     * @dev returns player info based on address.  if no address is given, it will 
     * use msg.sender 
     * -functionhash- 0xee0b5d8b
     * @param _addr address of the player you want to lookup 
     * @return player ID 
     * @return player name
     * @return keys owned (current round)
     * @return winnings vault
     * @return general vault 
	 * @return player round eth
     */
    function getPlayerInfoByAddress(address _addr)
        public 
        view 
        returns(uint256, bytes32, uint256, uint256, uint256, uint256)
    {
        // setup local rID
        uint256 _rID = rID_;
        
        if (_addr == address(0))
        {
            _addr == msg.sender;
        }
        uint256 _pID = pIDxAddr_[_addr];
        
        return
        (
            _pID,                               //0
            plyr_[_pID].name,                   //1
            plyrRnds_[_pID][_rID].keys,         //2
            plyr_[_pID].win,                    //3
            (plyr_[_pID].gen).add(calcUnMaskedEarnings(_pID, plyr_[_pID].lrnd)),       //4
            plyrRnds_[_pID][_rID].eth           //5
        );
    }

//==============================================================================
//     _ _  _ _   | _  _ . _  .
//    (_(_)| (/_  |(_)(_||(_  . (this + tools + calcs + modules = our softwares engine)
//=====================_|=======================================================
    /**
     * @dev logic runs whenever a buy order is executed.  determines how to handle 
     * incoming eth depending on if we are in an active round or not
     */
    function buyCore(uint256 _pID, F3Ddatasets.EventReturns memory _eventData_)
        private
    {
        // setup local rID
        uint256 _rID = rID_;
        
        // grab time
        uint256 _now = now;
        
        // if round is active
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0))) 
        {
            // call core 
            core(_rID, _pID, msg.value, _eventData_);
        
        // if round is not active     
        } else {
            // check to see if end round needs to be ran
            if (_now > round_[_rID].end && round_[_rID].ended == false) 
            {
                // end the round (distributes pot) & start new round
			    round_[_rID].ended = true;
                _eventData_ = endRound(_eventData_);
                
                // build event data
                _eventData_.compressedData = _eventData_.compressedData + (_now * 1000000000000000000);
                _eventData_.compressedIDs = _eventData_.compressedIDs + _pID;
                
                // fire buy and distribute event 
                emit F3Devents.onBuyAndDistribute
                (
                    msg.sender, 
                    plyr_[_pID].name, 
                    msg.value, 
                    _eventData_.compressedData, 
                    _eventData_.compressedIDs, 
                    _eventData_.winnerAddr, 
                    _eventData_.winnerName, 
                    _eventData_.amountWon, 
                    _eventData_.devAmount, 
                    _eventData_.genAmount
                );
            }
            
            // put eth in players vault 
            plyr_[_pID].gen = plyr_[_pID].gen.add(msg.value);
        }
    }
    
    /**
     * @dev logic runs whenever a reload order is executed.  determines how to handle 
     * incoming eth depending on if we are in an active round or not 
     */
    function reLoadCore(uint256 _pID, uint256 _eth, F3Ddatasets.EventReturns memory _eventData_)
        private
    {
        // setup local rID
        uint256 _rID = rID_;
        
        // grab time
        uint256 _now = now;
        
        // if round is active
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0))) 
        {
            // get earnings from all vaults and return unused to gen vault
            // because we use a custom safemath library.  this will throw if player 
            // tried to spend more eth than they have.
            plyr_[_pID].gen = withdrawEarnings(_pID).sub(_eth);
            
            // call core 
            core(_rID, _pID, _eth, _eventData_);
        
        // if round is not active and end round needs to be ran   
        } else if (_now > round_[_rID].end && round_[_rID].ended == false) {
            // end the round (distributes pot) & start new round
            round_[_rID].ended = true;
            _eventData_ = endRound(_eventData_);
                
            // build event data
            _eventData_.compressedData = _eventData_.compressedData + (_now * 1000000000000000000);
            _eventData_.compressedIDs = _eventData_.compressedIDs + _pID;
                
            // fire buy and distribute event 
            emit F3Devents.onReLoadAndDistribute
            (
                msg.sender, 
                plyr_[_pID].name, 
                _eventData_.compressedData, 
                _eventData_.compressedIDs, 
                _eventData_.winnerAddr, 
                _eventData_.winnerName, 
                _eventData_.amountWon, 
                _eventData_.devAmount, 
                _eventData_.genAmount
            );
        }
    }
    
    /**
     * @dev this is the core logic for any buy/reload that happens while a round 
     * is live.
     */
    function core(uint256 _rID, uint256 _pID, uint256 _eth, F3Ddatasets.EventReturns memory _eventData_)
        private
    {
        // if player is new to round
        if (plyrRnds_[_pID][_rID].keys == 0)
            _eventData_ = managePlayer(_pID, _eventData_);
        
        // early round eth limiter 
        if (round_[_rID].eth < 100000000000000000000 && plyrRnds_[_pID][_rID].eth.add(_eth) > 1000000000000000000)
        {
            uint256 _availableLimit = (1000000000000000000).sub(plyrRnds_[_pID][_rID].eth);
            uint256 _refund = _eth.sub(_availableLimit);
            plyr_[_pID].gen = plyr_[_pID].gen.add(_refund);
            _eth = _availableLimit;
        }
        
        // if eth left is greater than min eth allowed (sorry no pocket lint)
        if (_eth > 1000000000) 
        {
            
            // mint the new keys
            uint256 _keys = (round_[_rID].eth).keysRec(_eth);
            
            // if they bought at least 1 whole key
            if (_keys >= 1000000000000000000)
            {
            updateTimer(_keys, _rID);

            // set new leaders
            if (round_[_rID].plyr != _pID)
                round_[_rID].plyr = _pID;
            
            // set the new leader bool to true
            _eventData_.compressedData = _eventData_.compressedData + 100;
        }
            
            // update player 
            plyrRnds_[_pID][_rID].keys = _keys.add(plyrRnds_[_pID][_rID].keys);
            plyrRnds_[_pID][_rID].eth = _eth.add(plyrRnds_[_pID][_rID].eth);
            
            // update round
            round_[_rID].keys = _keys.add(round_[_rID].keys);
            round_[_rID].eth = _eth.add(round_[_rID].eth);
    
            // distribute eth
            _eventData_ = distributeExternal(_eth, _eventData_);
            _eventData_ = distributeInternal(_rID, _pID, _eth, _keys, _eventData_);
            
            // call end tx function to fire end tx event.
		    endTx(_pID, _eth, _keys, _eventData_);
        }
    }
//==============================================================================
//     _ _ | _   | _ _|_ _  _ _  .
//    (_(_||(_|_||(_| | (_)| _\  .
//==============================================================================
    /**
     * @dev calculates unmasked earnings (just calculates, does not update mask)
     * @return earnings in wei format
     */
    function calcUnMaskedEarnings(uint256 _pID, uint256 _rIDlast)
        private
        view
        returns(uint256)
    {   
        return(  (((round_[_rIDlast].mask).mul(plyrRnds_[_pID][_rIDlast].keys)) / (1000000000000000000)).sub(plyrRnds_[_pID][_rIDlast].mask)  );
    }
    
    /** 
     * @dev returns the amount of keys you would get given an amount of eth. 
     * -functionhash- 0xce89c80c
     * @param _rID round ID you want price for
     * @param _eth amount of eth sent in 
     * @return keys received 
     */
    function calcKeysReceived(uint256 _rID, uint256 _eth)
        public
        view
        returns(uint256)
    {
        // grab time
        uint256 _now = now;
        
        // are we in a round?
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
            return ( (round_[_rID].eth).keysRec(_eth) );
        else // rounds over.  need keys for new round
            return ( (_eth).keys() );
    }
    
    /** 
     * @dev returns current eth price for X keys.  
     * -functionhash- 0xcf808000
     * @param _keys number of keys desired (in 18 decimal format)
     * @return amount of eth needed to send
     */
    function iWantXKeys(uint256 _keys)
        public
        view
        returns(uint256)
    {
        // setup local rID
        uint256 _rID = rID_;
        
        // grab time
        uint256 _now = now;
        
        // are we in a round?
        if (_now > round_[_rID].strt && (_now <= round_[_rID].end || (_now > round_[_rID].end && round_[_rID].plyr == 0)))
            return ( (round_[_rID].keys.add(_keys)).ethRec(_keys) );
        else // rounds over.  need price for new round
            return ( (_keys).eth() );
    }
//==============================================================================
//    _|_ _  _ | _  .
//     | (_)(_)|_\  .
//==============================================================================
    /**
	 * @dev receives name/player info from names contract 
     */
    function receivePlayerInfo(uint256 _pID, address _addr, bytes32 _name)
        external
    {
        require (msg.sender == address(PlayerBook), "your not playerNames contract... hmmm..");
        if (pIDxAddr_[_addr] != _pID)
            pIDxAddr_[_addr] = _pID;
        if (pIDxName_[_name] != _pID)
            pIDxName_[_name] = _pID;
        if (plyr_[_pID].addr != _addr)
            plyr_[_pID].addr = _addr;
        if (plyr_[_pID].name != _name)
            plyr_[_pID].name = _name;
        if (plyrNames_[_pID][_name] == false)
            plyrNames_[_pID][_name] = true;
    }
    
    /**
     * @dev receives entire player name list 
     */
    function receivePlayerNameList(uint256 _pID, bytes32 _name)
        external
    {
        require (msg.sender == address(PlayerBook), "your not playerNames contract... hmmm..");
        if(plyrNames_[_pID][_name] == false)
            plyrNames_[_pID][_name] = true;
    }   
        
    /**
     * @dev gets existing or registers new pID.  use this when a player may be new
     * @return pID 
     */
    function determinePID(F3Ddatasets.EventReturns memory _eventData_)
        private
        returns (F3Ddatasets.EventReturns)
    {
        uint256 _pID = pIDxAddr_[msg.sender];
        // if player is new to this version of fomo3dx
        if (_pID == 0)
        {
            // grab their player ID, name, from player names contract 
            _pID = PlayerBook.getPlayerID(msg.sender);
            bytes32 _name = PlayerBook.getPlayerName(_pID);
            
            // set up player account 
            pIDxAddr_[msg.sender] = _pID;
            plyr_[_pID].addr = msg.sender;
            
            if (_name != "")
            {
                pIDxName_[_name] = _pID;
                plyr_[_pID].name = _name;
                plyrNames_[_pID][_name] = true;
            }
            
            // set the new player bool to true
            _eventData_.compressedData = _eventData_.compressedData + 1;
        } 
        return (_eventData_);
    }
    
    /**
     * @dev decides if round end needs to be run & new round started.  and if 
     * player unmasked earnings from previously played rounds need to be moved.
     */
    function managePlayer(uint256 _pID, F3Ddatasets.EventReturns memory _eventData_)
        private
        returns (F3Ddatasets.EventReturns)
    {
        // if player has played a previous round, move their unmasked earnings
        // from that round to gen vault.
        if (plyr_[_pID].lrnd != 0)
            updateGenVault(_pID, plyr_[_pID].lrnd);
            
        // update player's last round played
        plyr_[_pID].lrnd = rID_;
            
        // set the joined round bool to true
        _eventData_.compressedData = _eventData_.compressedData + 10;
        
        return(_eventData_);
    }
    
    /**
     * @dev ends the round. manages paying out winner/splitting up pot
     */
    function endRound(F3Ddatasets.EventReturns memory _eventData_)
        private
        returns (F3Ddatasets.EventReturns)
    {
        // setup local rID
        uint256 _rID = rID_;
        
        // grab our winning player
        uint256 _winPID = round_[_rID].plyr;
        
        // grab our pot amount
        uint256 _pot = round_[_rID].pot;
        
        // calculate our winner share and developer rewards
        uint256 _win = (_pot.mul(potSplit_.win)).div(100); // 40% to winner
        uint256 _dev = (_pot.mul(potSplit_.dev)).div(100); // 10% to dev rewards
        _pot = (_pot.sub(_win)).sub(_dev); // calc remaining amount to pot

        // pay out to official then transfer to winner
        AwardPool.transfer(_win);

        // pay our developer
        DeveloperRewards.transfer(_dev);

        // ended this pot
        AwardPool.transfer(_pot);

        // prepare event data
        _eventData_.compressedData = _eventData_.compressedData + (round_[_rID].end * 1000000);
        _eventData_.compressedIDs = _eventData_.compressedIDs + (_winPID * 100000000000000000000000000);
        _eventData_.winnerAddr = plyr_[_winPID].addr;
        _eventData_.winnerName = plyr_[_winPID].name;
        _eventData_.amountWon = _win;
        _eventData_.potAmount = _pot;
        _eventData_.devAmount = _dev;
        
        // start next round
        rID_++;
        _rID++;
        round_[_rID].strt = now;
        round_[_rID].end = now.add(rndInit_);
        
        return(_eventData_);
    }
    
    /**
     * @dev moves any unmasked earnings to gen vault.  updates earnings mask
     */
    function updateGenVault(uint256 _pID, uint256 _rIDlast)
        private 
    {
        uint256 _earnings = calcUnMaskedEarnings(_pID, _rIDlast);
        if (_earnings > 0)
        {
            // put in gen vault
            plyr_[_pID].gen = _earnings.add(plyr_[_pID].gen);
            // zero out their earnings by updating mask
            plyrRnds_[_pID][_rIDlast].mask = _earnings.add(plyrRnds_[_pID][_rIDlast].mask);
        }
    }
    
    /**
     * @dev updates round timer based on number of whole keys bought.
     */
    function updateTimer(uint256 _keys, uint256 _rID)
        private
    {
        // grab time
        uint256 _now = now;
        
        // calculate time based on number of keys bought
        uint256 _newTime;
        if (_now > round_[_rID].end && round_[_rID].plyr == 0)
            _newTime = (((_keys) / (1000000000000000000)).mul(rndInc_)).add(_now);
        else
            _newTime = (((_keys) / (1000000000000000000)).mul(rndInc_)).add(round_[_rID].end);
        
        // compare to max and set new end time
        if (_newTime < (rndMax_).add(_now))
            round_[_rID].end = _newTime;
        else
            round_[_rID].end = rndMax_.add(_now);
    }

    /**
     * @dev distributes eth based on fees to dev
     */
    function distributeExternal(uint256 _eth, F3Ddatasets.EventReturns memory _eventData_)
        private
        returns(F3Ddatasets.EventReturns)
    {
        // pay 10% out to developer rewards
        uint256 _dev = (_eth.mul(fees_.dev)).div(100);
        
        // transfer to developer rewards contract
        DeveloperRewards.transfer(_dev);

        // set up event data
        _eventData_.devAmount = _dev.add(_eventData_.devAmount);
        
        return(_eventData_);
    }
    
    /**
     * @dev distributes eth based on fees to gen and pot
     */
    function distributeInternal(uint256 _rID, uint256 _pID, uint256 _eth, uint256 _keys, F3Ddatasets.EventReturns memory _eventData_)
        private
        returns(F3Ddatasets.EventReturns)
    {
        // calculate gen share
        uint256 _gen = (_eth.mul(fees_.gen)).div(100);
        
        // update eth balance (eth = eth - dev share)
        _eth = _eth.sub((_eth.mul(fees_.dev)).div(100));
        
        // calculate pot 
        uint256 _pot = _eth.sub(_gen);
        
        // distribute gen share (thats what updateMasks() does) and adjust
        // balances for dust.
        uint256 _dust = updateMasks(_rID, _pID, _gen, _keys);
        if (_dust > 0)
            _gen = _gen.sub(_dust);
        
        // add eth to pot
        round_[_rID].pot = _pot.add(_dust).add(round_[_rID].pot);
        
        // set up event data
        _eventData_.genAmount = _gen.add(_eventData_.genAmount);
        _eventData_.potAmount = _pot;
        
        return(_eventData_);
    }

    /**
     * @dev updates masks for round and player when keys are bought
     * @return dust left over 
     */
    function updateMasks(uint256 _rID, uint256 _pID, uint256 _gen, uint256 _keys)
        private
        returns(uint256)
    {
        /* MASKING NOTES
            earnings masks are a tricky thing for people to wrap their minds around.
            the basic thing to understand here.  is were going to have a global
            tracker based on profit per share for each round, that increases in
            relevant proportion to the increase in share supply.
            
            the player will have an additional mask that basically says "based
            on the rounds mask, my shares, and how much i've already withdrawn,
            how much is still owed to me?"
        */

        // calc profit per key & round mask based on this buy:  (dust goes to pot)
        uint256 _ppt = (_gen.mul(1000000000000000000)) / (round_[_rID].keys);
        round_[_rID].mask = _ppt.add(round_[_rID].mask);
            
        // calculate player earning from their own buy (only based on the keys
        // they just bought).  & update player earnings mask
        uint256 _pearn = (_ppt.mul(_keys)) / (1000000000000000000);
        plyrRnds_[_pID][_rID].mask = (((round_[_rID].mask.mul(_keys)) / (1000000000000000000)).sub(_pearn)).add(plyrRnds_[_pID][_rID].mask);
        
        // calculate & return dust
        return(_gen.sub((_ppt.mul(round_[_rID].keys)) / (1000000000000000000)));
    }
    
    /**
     * @dev adds up unmasked earnings, & vault earnings, sets them all to 0
     * @return earnings in wei format
     */
    function withdrawEarnings(uint256 _pID)
        private
        returns(uint256)
    {
        // update gen vault
        updateGenVault(_pID, plyr_[_pID].lrnd);
        
        // from vaults 
        uint256 _earnings = (plyr_[_pID].win).add(plyr_[_pID].gen);
        if (_earnings > 0)
        {
            plyr_[_pID].win = 0;
            plyr_[_pID].gen = 0;
        }

        return(_earnings);
    }
    
    /**
     * @dev prepares compression data and fires event for buy or reload tx's
     */
    function endTx(uint256 _pID, uint256 _eth, uint256 _keys, F3Ddatasets.EventReturns memory _eventData_)
        private
    {
        _eventData_.compressedData = _eventData_.compressedData + (now * 1000000000000000000);
        _eventData_.compressedIDs = _eventData_.compressedIDs + _pID + (rID_ * 10000000000000000000000000000000000000000000000000000);
        
        emit F3Devents.onEndTx
        (
            _eventData_.compressedData,
            _eventData_.compressedIDs,
            plyr_[_pID].name,
            msg.sender,
            _eth,
            _keys,
            _eventData_.winnerAddr,
            _eventData_.winnerName,
            _eventData_.amountWon,
            _eventData_.devAmount,
            _eventData_.genAmount,
            _eventData_.potAmount
        );
    }
//==============================================================================
//    (~ _  _    _._|_    .
//    _)(/_(_|_|| | | \/  .
//====================/=========================================================
    /** upon contract deploy, it will be deactivated.  this is a one time
     * use function that will activate the contract.  we do this so devs 
     * have time to set things up on the web end                            **/
    bool public activated_ = false;
    function activate()
        public
    {
        // only team can activate 
        require(msg.sender == 0x4a1061afb0af7d9f6c2d545ada068da68052c060, "only team can activate");
        
        // can only be ran once
        require(activated_ == false, "fomo3dx already activated");
        
        // activate the contract 
        activated_ = true;
        
        // lets start first round
		rID_ = 1;
        round_[1].strt = now;
        round_[1].end = now + rndInit_;
    }
}

//==============================================================================
//   __|_ _    __|_ _  .
//  _\ | | |_|(_ | _\  .
//==============================================================================
library F3Ddatasets {
    //compressedData key
    // [76-33][32][31][30][29][28-18][17][16-6][5-3][2][1][0]
        // 0 - new player (bool)
        // 1 - joined round (bool)
        // 2 - new  leader (bool)
        // 6-16 - round end time
        // 17 - winnerTeam
        // 18 - 28 timestamp 
        // 30 - 0 = reinvest (round), 1 = buy (round), 2 = buy (ico), 3 = reinvest (ico)
    //compressedIDs key
    // [77-52][51-26][25-0]
        // 0-25 - pID 
        // 26-51 - winPID
        // 52-77 - rID
    struct EventReturns {
        uint256 compressedData;
        uint256 compressedIDs;
        address winnerAddr;         // winner address
        bytes32 winnerName;         // winner name
        uint256 amountWon;          // amount won
        uint256 devAmount;          // amount distributed to dev
        uint256 genAmount;          // amount distributed to gen
        uint256 potAmount;          // amount added to pot
    }
    struct Player {
        address addr;   // player address
        bytes32 name;   // player name
        uint256 win;    // winnings vault
        uint256 gen;    // general vault
        uint256 lrnd;   // last round played
    }
    struct PlayerRounds {
        uint256 eth;    // eth player has added to round (used for eth limiter)
        uint256 keys;   // keys
        uint256 mask;   // player mask 
        uint256 ico;    // ICO phase investment
    }
    struct Round {
        uint256 plyr;   // pID of player in lead
        uint256 end;    // time ends/ended
        bool ended;     // has round end function been ran
        uint256 strt;   // time round started
        uint256 keys;   // keys
        uint256 eth;    // total eth in
        uint256 pot;    // eth to pot (during round) / final amount paid to winner (after round ends)
        uint256 mask;   // global mask
        uint256 ico;    // total eth sent in during ICO phase
        uint256 icoGen; // total eth for gen during ICO phase
        uint256 icoAvg; // average key price for ICO phase
    }
    struct KeyFee {
        uint256 gen;    // % of buy in thats paid to key holders of current round
        uint256 dev;    // % of buy in thats paid to develper
    }
    struct PotSplit {
        uint256 win;    // % of pot thats paid to winner of current round
        uint256 dev;    // % of pot thats paid to developer
    }
}

//==============================================================================
//  |  _      _ _ | _  .
//  |<(/_\/  (_(_||(_  .
//=======/======================================================================
library F3DKeysCalcLong {
    using SafeMath for *;
    /**
     * @dev calculates number of keys received given X eth 
     * @param _curEth current amount of eth in contract 
     * @param _newEth eth being spent
     * @return amount of ticket purchased
     */
    function keysRec(uint256 _curEth, uint256 _newEth)
        internal
        pure
        returns (uint256)
    {
        return(keys((_curEth).add(_newEth)).sub(keys(_curEth)));
    }
    
    /**
     * @dev calculates amount of eth received if you sold X keys 
     * @param _curKeys current amount of keys that exist 
     * @param _sellKeys amount of keys you wish to sell
     * @return amount of eth received
     */
    function ethRec(uint256 _curKeys, uint256 _sellKeys)
        internal
        pure
        returns (uint256)
    {
        return((eth(_curKeys)).sub(eth(_curKeys.sub(_sellKeys))));
    }

    /**
     * @dev calculates how many keys would exist with given an amount of eth
     * @param _eth eth "in contract"
     * @return number of keys that would exist
     */
    function keys(uint256 _eth) 
        internal
        pure
        returns(uint256)
    {
        return ((((((_eth).mul(1000000000000000000)).mul(312500000000000000000000000)).add(5624988281256103515625000000000000000000000000000000000000000000)).sqrt()).sub(74999921875000000000000000000000)) / (156250000);
    }
    
    /**
     * @dev calculates how much eth would be in contract given a number of keys
     * @param _keys number of keys "in contract" 
     * @return eth that would exists
     */
    function eth(uint256 _keys) 
        internal
        pure
        returns(uint256)  
    {
        return ((78125000).mul(_keys.sq()).add(((149999843750000).mul(_keys.mul(1000000000000000000))) / (2))) / ((1000000000000000000).sq());
    }
}

//==============================================================================
//  . _ _|_ _  _ |` _  _ _  _  .
//  || | | (/_| ~|~(_|(_(/__\  .
//==============================================================================
interface PlayerBookInterface {
    function getPlayerID(address _addr) external returns (uint256);
    function getPlayerName(uint256 _pID) external view returns (bytes32);
    function getPlayerAddr(uint256 _pID) external view returns (address);
    function getNameFee() external view returns (uint256);
    function registerNameXIDFromDapp(address _addr, bytes32 _name, bool _all) external payable returns(bool);
    function registerNameXaddrFromDapp(address _addr, bytes32 _name, bool _all) external payable returns(bool);
    function registerNameXnameFromDapp(address _addr, bytes32 _name, bool _all) external payable returns(bool);
}

/**
* @title -Name Filter- beta
*/
library NameFilter {
    /**
     * @dev filters name strings
     * -converts uppercase to lower case.  
     * -makes sure it does not start/end with a space
     * -makes sure it does not contain multiple spaces in a row
     * -cannot be only numbers
     * -cannot start with 0x 
     * -restricts characters to A-Z, a-z, 0-9, and space.
     * @return reprocessed string in bytes32 format
     */
    function nameFilter(string _input)
        internal
        pure
        returns(bytes32)
    {
        bytes memory _temp = bytes(_input);
        uint256 _length = _temp.length;
        
        //sorry limited to 32 characters
        require (_length <= 32 && _length > 0, "string must be between 1 and 32 characters");
        // make sure it doesnt start with or end with space
        require(_temp[0] != 0x20 && _temp[_length-1] != 0x20, "string cannot start or end with space");
        // make sure first two characters are not 0x
        if (_temp[0] == 0x30)
        {
            require(_temp[1] != 0x78, "string cannot start with 0x");
            require(_temp[1] != 0x58, "string cannot start with 0X");
        }
        
        // create a bool to track if we have a non number character
        bool _hasNonNumber;
        
        // convert & check
        for (uint256 i = 0; i < _length; i++)
        {
            // if its uppercase A-Z
            if (_temp[i] > 0x40 && _temp[i] < 0x5b)
            {
                // convert to lower case a-z
                _temp[i] = byte(uint(_temp[i]) + 32);
                
                // we have a non number
                if (_hasNonNumber == false)
                    _hasNonNumber = true;
            } else {
                require
                (
                    // require character is a space
                    _temp[i] == 0x20 || 
                    // OR lowercase a-z
                    (_temp[i] > 0x60 && _temp[i] < 0x7b) ||
                    // or 0-9
                    (_temp[i] > 0x2f && _temp[i] < 0x3a),
                    "string contains invalid characters"
                );
                // make sure theres not 2x spaces in a row
                if (_temp[i] == 0x20)
                    require( _temp[i+1] != 0x20, "string cannot contain consecutive spaces");
                
                // see if we have a character other than a number
                if (_hasNonNumber == false && (_temp[i] < 0x30 || _temp[i] > 0x39))
                    _hasNonNumber = true;    
            }
        }
        
        require(_hasNonNumber == true, "string cannot be only numbers");
        
        bytes32 _ret;
        assembly {
            _ret := mload(add(_temp, 32))
        }
        return (_ret);
    }
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 * change notes:  original SafeMath library from OpenZeppelin modified by Inventor
 * - added sqrt
 * - added sq
 * - added pwr 
 * - changed asserts to requires with error log outputs
 */
library SafeMath {
    
    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) 
        internal 
        pure 
        returns (uint256 c) 
    {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        require(c / a == b, "SafeMath mul failed");
        return c;
    }

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0); // Solidity only automatically asserts when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }
    
    /**
    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b)
        internal
        pure
        returns (uint256) 
    {
        require(b <= a, "SafeMath sub failed");
        return a - b;
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b)
        internal
        pure
        returns (uint256 c) 
    {
        c = a + b;
        require(c >= a, "SafeMath add failed");
        return c;
    }
    
    /**
     * @dev gives square root of given x.
     */
    function sqrt(uint256 x)
        internal
        pure
        returns (uint256 y) 
    {
        uint256 z = ((add(x,1)) / 2);
        y = x;
        while (z < y) 
        {
            y = z;
            z = ((add((x / z),z)) / 2);
        }
    }
    
    /**
     * @dev gives square. multiplies x by x
     */
    function sq(uint256 x)
        internal
        pure
        returns (uint256)
    {
        return (mul(x,x));
    }
    
    /**
     * @dev x to the power of y 
     */
    function pwr(uint256 x, uint256 y)
        internal 
        pure 
        returns (uint256)
    {
        if (x==0)
            return (0);
        else if (y==0)
            return (1);
        else 
        {
            uint256 z = x;
            for (uint256 i=1; i < y; i++)
                z = mul(z,x);
            return (z);
        }
    }

    /**
    * @dev Divides two numbers 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;
    }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"getBuyPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"activate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pIDxAddr_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_all","type":"bool"}],"name":"registerNameXaddr","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_eth","type":"uint256"}],"name":"reLoadXid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_pID","type":"uint256"},{"name":"_addr","type":"address"},{"name":"_name","type":"bytes32"}],"name":"receivePlayerInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"fees_","outputs":[{"name":"gen","type":"uint256"},{"name":"dev","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"round_","outputs":[{"name":"plyr","type":"uint256"},{"name":"end","type":"uint256"},{"name":"ended","type":"bool"},{"name":"strt","type":"uint256"},{"name":"keys","type":"uint256"},{"name":"eth","type":"uint256"},{"name":"pot","type":"uint256"},{"name":"mask","type":"uint256"},{"name":"ico","type":"uint256"},{"name":"icoGen","type":"uint256"},{"name":"icoAvg","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"bytes32"}],"name":"plyrNames_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"pIDxName_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_eth","type":"uint256"}],"name":"reLoadXaddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"potSplit_","outputs":[{"name":"win","type":"uint256"},{"name":"dev","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rID_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_pID","type":"uint256"}],"name":"getPlayerVaults","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"buyXid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentRoundInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_all","type":"bool"}],"name":"registerNameXname","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_pID","type":"uint256"},{"name":"_name","type":"bytes32"}],"name":"receivePlayerNameList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"plyrRnds_","outputs":[{"name":"eth","type":"uint256"},{"name":"keys","type":"uint256"},{"name":"mask","type":"uint256"},{"name":"ico","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"buyXname","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"buyXaddr","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getTimeLeft","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rID","type":"uint256"},{"name":"_eth","type":"uint256"}],"name":"calcKeysReceived","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_keys","type":"uint256"}],"name":"iWantXKeys","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"activated_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"plyr_","outputs":[{"name":"addr","type":"address"},{"name":"name","type":"bytes32"},{"name":"win","type":"uint256"},{"name":"gen","type":"uint256"},{"name":"lrnd","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"getPlayerInfoByAddress","outputs":[{"name":"","type":"uint256"},{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_eth","type":"uint256"}],"name":"reLoadXname","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_all","type":"bool"}],"name":"registerNameXID","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerID","type":"uint256"},{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":true,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"isNewPlayer","type":"bool"},{"indexed":false,"name":"amountPaid","type":"uint256"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onNewName","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"ethIn","type":"uint256"},{"indexed":false,"name":"keysBought","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"devAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"},{"indexed":false,"name":"potAmount","type":"uint256"}],"name":"onEndTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerID","type":"uint256"},{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethOut","type":"uint256"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethOut","type":"uint256"},{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"devAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"}],"name":"onWithdrawAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethIn","type":"uint256"},{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"devAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"}],"name":"onBuyAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"devAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"}],"name":"onReLoadAndDistribute","type":"event"}]

  Contract Creation Code Switch To Opcodes View
6080604052600b805460ff1916905534801561001a57600080fd5b506040805180820182526032808252600a60209283018190526007919091556008819055825180840190935260288084529290910181905260099190915580556139aa806100696000396000f3006080604052600436106101955763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663018a25e8811461034857806306fdde031461036f5780630f15f4c0146103f957806310f01eba146104105780631684844b1461043157806319d7943a146104815780631fda5b4514610499578063200373c9146104c057806324c33d33146104ee5780632660316e1461055c5780632e19ebdc1461058b5780633ccfd60b146105a35780634c38c3661461048157806358d162da146105b8578063624ae5c0146105cd57806363066434146105e2578063658577e9146105fa578063747dff42146106025780637b3ca1c6146106675780638f7140ea146106b757806395d89b41146106d2578063a2bccae9146106e7578063bdaacabd146105fa578063be78e656146105fa578063c7e284b814610728578063ce89c80c1461073d578063cf80800014610758578063d53b267914610770578063de7874f314610785578063ee0b5d8b146107d2578063faed08a914610481578063fd3d8cdc14610826575b61019d6138ec565b600b5460009060ff1615156001146101ed576040805160e560020a62461bcd028152602060048201526012602482015260008051602061393f833981519152604482015290519081900360640190fd5b33803b8015610234576040805160e560020a62461bcd028152602060048201526011602482015260008051602061395f833981519152604482015290519081900360640190fd5b34633b9aca008110156102b7576040805160e560020a62461bcd02815260206004820152602160248201527f706f636b6574206c696e743a206e6f7420612076616c69642063757272656e6360448201527f7900000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b69152d02c7e14af6800000811115610319576040805160e560020a62461bcd02815260206004820152600e60248201527f6e6f20766974616c696b2c206e6f000000000000000000000000000000000000604482015290519081900360640190fd5b61032285610876565b3360009081526001602052604090205490955093506103418486610a65565b5050505050005b34801561035457600080fd5b5061035d610c45565b60408051918252519081900360200190f35b34801561037b57600080fd5b50610384610d02565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103be5781810151838201526020016103a6565b50505050905090810190601f1680156103eb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561040557600080fd5b5061040e610d39565b005b34801561041c57600080fd5b5061035d600160a060020a0360043516610e67565b6040805160206004803580820135601f810184900484028501840190955284845261040e943694929360249392840191908190840183828082843750949750505050913515159250610e79915050565b34801561048d57600080fd5b5061040e600435610ff4565b3480156104a557600080fd5b5061040e600435600160a060020a036024351660443561119d565b3480156104cc57600080fd5b506104d5611360565b6040805192835260208301919091528051918290030190f35b3480156104fa57600080fd5b50610506600435611369565b604080519b8c5260208c019a909a529715158a8a015260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015261014083015251908190036101600190f35b34801561056857600080fd5b506105776004356024356113c8565b604080519115158252519081900360200190f35b34801561059757600080fd5b5061035d6004356113e8565b3480156105af57600080fd5b5061040e6113fa565b3480156105c457600080fd5b506104d5611758565b3480156105d957600080fd5b5061035d611761565b3480156105ee57600080fd5b506104d5600435611767565b61040e61185a565b34801561060e57600080fd5b50610617611a0d565b60408051998a5260208a0198909852888801969096526060880194909452608087019290925260a086015260c0850152600160a060020a031660e084015261010083015251908190036101200190f35b6040805160206004803580820135601f810184900484028501840190955284845261040e943694929360249392840191908190840183828082843750949750505050913515159250611a6a915050565b3480156106c357600080fd5b5061040e600435602435611b47565b3480156106de57600080fd5b50610384611c24565b3480156106f357600080fd5b50610702600435602435611c5b565b604080519485526020850193909352838301919091526060830152519081900360800190f35b34801561073457600080fd5b5061035d611c8d565b34801561074957600080fd5b5061035d600435602435611d10565b34801561076457600080fd5b5061035d600435611db2565b34801561077c57600080fd5b50610577611e55565b34801561079157600080fd5b5061079d600435611e5e565b60408051600160a060020a03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b3480156107de57600080fd5b506107f3600160a060020a0360043516611e98565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6040805160206004803580820135601f810184900484028501840190955284845261040e943694929360249392840191908190840183828082843750949750505050913515159250611f3a915050565b61087e6138ec565b3360009081526001602052604081205490811515610a5a57604080517fe56556a9000000000000000000000000000000000000000000000000000000008152336004820152905173dac532ca5598ee19a2dfc1244c7608c766c6c4159163e56556a99160248083019260209291908290030181600087803b15801561090257600080fd5b505af1158015610916573d6000803e3d6000fd5b505050506040513d602081101561092c57600080fd5b5051604080517f82e37b2c00000000000000000000000000000000000000000000000000000000815260048101839052905191935073dac532ca5598ee19a2dfc1244c7608c766c6c415916382e37b2c916024808201926020929091908290030181600087803b15801561099f57600080fd5b505af11580156109b3573d6000803e3d6000fd5b505050506040513d60208110156109c957600080fd5b505133600081815260016020908152604080832087905586835260039091529020805473ffffffffffffffffffffffffffffffffffffffff1916909117905590508015610a5257600081815260026020908152604080832085905584835260038252808320600190810185905560058352818420858552909252909120805460ff191690911790555b835160010184525b8392505b5050919050565b600080548082526006602052604090912060030154429081118015610acc575060008281526006602052604090206001015481111580610acc575060008281526006602052604090206001015481118015610acc5750600082815260066020526040902054155b15610ae257610add82853486612017565b610c3f565b60008281526006602052604090206001015481118015610b14575060008281526006602052604090206002015460ff16155b15610c08576000828152600660205260409020600201805460ff19166001179055610b3e8361229c565b8051670de0b6b3a7640000830201815260208082018051870181526000878152600383526040908190206001015484519251828601516060808801516080808a015160a0808c015160c0808e01518b513381529d8e019a909a52348d8c0152958c019a909a52918a0195909552600160a060020a039093169288019290925286015260e0850152610100840192909252610120830191909152519194507f5905265be09e3f6f7813c1dce4febfad76d4b3a46288aa344d2531532c3519c991908190036101400190a15b60008481526003602081905260409091200154610c2b903463ffffffff6124a316565b600085815260036020819052604090912001555b50505050565b6000805480825260066020526040822060030154429081118015610cab575060008281526006602052604090206001015481111580610cab575060008281526006602052604090206001015481118015610cab5750600082815260066020526040902054155b15610cf357600082815260066020526040902060040154610cec90670de0b6b3a764000090610ce0908263ffffffff6124a316565b9063ffffffff61250416565b9250610cfd565b6544364c5bb00092505b505090565b60408051808201909152600881527f466f4d6f33442058000000000000000000000000000000000000000000000000602082015281565b734a1061afb0af7d9f6c2d545ada068da68052c0603314610da4576040805160e560020a62461bcd02815260206004820152601660248201527f6f6e6c79207465616d2063616e20616374697661746500000000000000000000604482015290519081900360640190fd5b600b5460ff1615610dff576040805160e560020a62461bcd02815260206004820152601960248201527f666f6d6f33647820616c72656164792061637469766174656400000000000000604482015290519081900360640190fd5b600b805460ff191660019081179091556000818155526006602052427f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a34819055610e10017f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a3255565b60016020526000908152604090205481565b60008080808033803b8015610ec6576040805160e560020a62461bcd028152602060048201526011602482015260008051602061395f833981519152604482015290519081900360640190fd5b610ecf89612531565b604080517f285137c90000000000000000000000000000000000000000000000000000000081523360048201819052602482018490528b15156044830152915192995090975034965073dac532ca5598ee19a2dfc1244c7608c766c6c4159163285137c9918891606480830192602092919082900301818588803b158015610f5657600080fd5b505af1158015610f6a573d6000803e3d6000fd5b50505050506040513d6020811015610f8157600080fd5b5051600160a060020a03871660008181526001602090815260409182902054825185151581529182018a905242828401529151939750909550899286917f9513976e3c07d9fef6952de4c2b3157458f24b4043d491729c9209d8d9c64541919081900360600190a4505050505050505050565b610ffc6138ec565b600b5460009060ff16151560011461104c576040805160e560020a62461bcd028152602060048201526012602482015260008051602061393f833981519152604482015290519081900360640190fd5b33803b8015611093576040805160e560020a62461bcd028152602060048201526011602482015260008051602061395f833981519152604482015290519081900360640190fd5b84633b9aca00811015611116576040805160e560020a62461bcd02815260206004820152602160248201527f706f636b6574206c696e743a206e6f7420612076616c69642063757272656e6360448201527f7900000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b69152d02c7e14af6800000811115611178576040805160e560020a62461bcd02815260206004820152600e60248201527f6e6f20766974616c696b2c206e6f000000000000000000000000000000000000604482015290519081900360640190fd5b336000908152600160205260409020549350611195848787612d44565b505050505050565b3373dac532ca5598ee19a2dfc1244c7608c766c6c4151461122e576040805160e560020a62461bcd02815260206004820152602760248201527f796f7572206e6f7420706c617965724e616d657320636f6e74726163742e2e2e60448201527f20686d6d6d2e2e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038216600090815260016020526040902054831461126957600160a060020a03821660009081526001602052604090208390555b60008181526002602052604090205483146112905760008181526002602052604090208390555b600083815260036020526040902054600160a060020a038381169116146112e6576000838152600360205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384161790555b60008381526003602052604090206001015481146113135760008381526003602052604090206001018190555b600083815260056020908152604080832084845290915290205460ff16151561135b5760008381526005602090815260408083208484529091529020805460ff191660011790555b505050565b60075460085482565b600660208190526000918252604090912080546001820154600283015460038401546004850154600586015496860154600787015460088801546009890154600a909901549799969860ff90961697949693959394929391929091908b565b600560209081526000928352604080842090915290825290205460ff1681565b60026020526000908152604090205481565b6000806000806114086138ec565b600b5460ff161515600114611455576040805160e560020a62461bcd028152602060048201526012602482015260008051602061393f833981519152604482015290519081900360640190fd5b33803b801561149c576040805160e560020a62461bcd028152602060048201526011602482015260008051602061395f833981519152604482015290519081900360640190fd5b600080543382526001602081815260408085205484865260069092529093200154909850429750909550861180156114e6575060008781526006602052604090206002015460ff16155b80156114ff575060008781526006602052604090205415155b15611699576000878152600660205260409020600201805460ff191660011790556115298361229c565b925061153485612f0a565b9350600084111561158557600085815260036020526040808220549051600160a060020a039091169186156108fc02918791818181858888f19350505050158015611583573d6000803e3d6000fd5b505b85670de0b6b3a764000002836000015101836000018181525050848360200151018360200181815250507f9e9c9331834267c84342f2dce38f9ba35eb0bfbcc207c64872e1e74f9706f2a33360036000888152602001908152602001600020600101548686600001518760200151886040015189606001518a608001518b60a001518c60c00151604051808b600160a060020a0316600160a060020a031681526020018a6000191660001916815260200189815260200188815260200187815260200186600160a060020a0316600160a060020a0316815260200185600019166000191681526020018481526020018381526020018281526020019a505050505050505050505060405180910390a161174f565b6116a285612f0a565b935060008411156116f357600085815260036020526040808220549051600160a060020a039091169186156108fc02918791818181858888f193505050501580156116f1573d6000803e3d6000fd5b505b6000858152600360209081526040918290206001015482513381529182015280820186905260608101889052905186917f8f36579a548bc439baa172a6521207464154da77f411e2da3db2f53affe6cc3a919081900360800190a25b50505050505050565b600954600a5482565b60005481565b60008054808252600660205260408220600101548291904211801561179e575060008181526006602052604090206002015460ff16155b80156117b7575060008181526006602052604090205415155b1561182c5760008481526003602090815260408083206002908101546004845282852086865290935292209091015461182390611804906117f88886612f82565b9063ffffffff61302716565b600087815260036020819052604090912001549063ffffffff6124a316565b92509250611854565b6000848152600360205260409020600281015460049091015461182390611804908790613087565b50915091565b6118626138ec565b600b5460009060ff1615156001146118b2576040805160e560020a62461bcd028152602060048201526012602482015260008051602061393f833981519152604482015290519081900360640190fd5b33803b80156118f9576040805160e560020a62461bcd028152602060048201526011602482015260008051602061395f833981519152604482015290519081900360640190fd5b34633b9aca0081101561197c576040805160e560020a62461bcd02815260206004820152602160248201527f706f636b6574206c696e743a206e6f7420612076616c69642063757272656e6360448201527f7900000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b69152d02c7e14af68000008111156119de576040805160e560020a62461bcd02815260206004820152600e60248201527f6e6f20766974616c696b2c206e6f000000000000000000000000000000000000604482015290519081900360640190fd5b6119e785610876565b336000908152600160205260409020549095509350611a068486610a65565b5050505050565b6000805480825260066020818152604080852060088101546004820154600180840154600380860154988601549554808c5297529490982080549801549198969790969395949293600a90930292600160a060020a039091169190565b60008080808033803b8015611ab7576040805160e560020a62461bcd028152602060048201526011602482015260008051602061395f833981519152604482015290519081900360640190fd5b611ac089612531565b604080517fd87a253b0000000000000000000000000000000000000000000000000000000081523360048201819052602482018490528b15156044830152915192995090975034965073dac532ca5598ee19a2dfc1244c7608c766c6c4159163d87a253b918891606480830192602092919082900301818588803b158015610f5657600080fd5b3373dac532ca5598ee19a2dfc1244c7608c766c6c41514611bd8576040805160e560020a62461bcd02815260206004820152602760248201527f796f7572206e6f7420706c617965724e616d657320636f6e74726163742e2e2e60448201527f20686d6d6d2e2e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600082815260056020908152604080832084845290915290205460ff161515611c205760008281526005602090815260408083208484529091529020805460ff191660011790555b5050565b60408051808201909152600481527f4633447800000000000000000000000000000000000000000000000000000000602082015281565b600460209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b60008054808252600660205260408220600101544290811015611d0757600082815260066020526040902060030154811115611ce557600082815260066020526040902060010154610cec908263ffffffff61302716565b600082815260066020526040902060030154610cec908263ffffffff61302716565b60009250610cfd565b600082815260066020526040812060030154429081118015611d74575060008481526006602052604090206001015481111580611d74575060008481526006602052604090206001015481118015611d745750600084815260066020526040902054155b15611da257600084815260066020526040902060050154611d9b908463ffffffff6130e416565b9150611dab565b611d9b83613105565b5092915050565b6000805480825260066020526040822060030154429081118015611e18575060008281526006602052604090206001015481111580611e18575060008281526006602052604090206001015481118015611e185750600082815260066020526040902054155b15611e4c57600082815260066020526040902060040154611e45908590610ce0908263ffffffff6124a316565b9250610a5e565b611e4584613189565b600b5460ff1681565b600360208190526000918252604090912080546001820154600283015493830154600490930154600160a060020a03909216939092909185565b60008054600160a060020a0383168252600160208181526040808520548086526003808452828720808601546004808752858a20898b5287529489209096015483895291909452600284015492909301548695869586958695869593948493929190611f0990611804908690613087565b60009586526004602090815260408088209888529790529590942054929c919b509950919750919550909350915050565b60008080808033803b8015611f87576040805160e560020a62461bcd028152602060048201526011602482015260008051602061395f833981519152604482015290519081900360640190fd5b611f9089612531565b604080517f8886a6670000000000000000000000000000000000000000000000000000000081523360048201819052602482018490528b15156044830152915192995090975034965073dac532ca5598ee19a2dfc1244c7608c766c6c41591638886a667918891606480830192602092919082900301818588803b158015610f5657600080fd5b600083815260046020908152604080832087845290915281206001015481908190151561204b5761204886856131f6565b93505b60008781526006602052604090206005015468056bc75e2d631000001180156120a5575060008681526004602090815260408083208a8452909152902054670de0b6b3a7640000906120a3908763ffffffff6124a316565b115b1561212e5760008681526004602090815260408083208a84529091529020546120dd90670de0b6b3a76400009063ffffffff61302716565b92506120ef858463ffffffff61302716565b60008781526003602081905260409091200154909250612115908363ffffffff6124a316565b6000878152600360208190526040909120015591935083915b633b9aca0085111561174f5760008781526006602052604090206005015461215c908663ffffffff6130e416565b9050670de0b6b3a764000081106121a6576121778188613254565b600087815260066020526040902054861461219e5760008781526006602052604090208690555b835160640184525b60008681526004602090815260408083208a84529091529020600101546121d490829063ffffffff6124a316565b60008781526004602090815260408083208b845290915290206001810191909155546122019086906124a3565b60008781526004602081815260408084208c855282528084209490945560069052919020015461223890829063ffffffff6124a316565b600088815260066020526040902060048101919091556005015461226390869063ffffffff6124a316565b60008881526006602052604090206005015561227f8585613339565b935061228e87878784886133c8565b935061174f868683876134c5565b6122a46138ec565b60008054808252600660208190526040832080549101546009549293919290919081906122eb906064906122df90869063ffffffff61360a16565b9063ffffffff61368116565b915061230a60646122df6009600101548661360a90919063ffffffff16565b9050612320816117f8858563ffffffff61302716565b60405190935073b14d7b0ec631daf0cf02d69860974df04987a9f89083156108fc029084906000818181858888f19350505050158015612364573d6000803e3d6000fd5b5060405173b14d7b0ec631daf0cf02d69860974df04987a9f89082156108fc029083906000818181858888f193505050501580156123a6573d6000803e3d6000fd5b5060405173b14d7b0ec631daf0cf02d69860974df04987a9f89084156108fc029085906000818181858888f193505050501580156123e8573d6000803e3d6000fd5b5060008581526006602081815260408084206001908101548c51620f4240909102018c528b830180516a52b7d2dcc80cd2e40000008b0201905288855260038084528286208054600160a060020a03168e85015282015460608e015260808d0188905260e08d0189905260a08d018790528554820186559901808552929091529091204296018690559461248490610e1063ffffffff6124a316565b6000868152600660205260409020600101558695505050505050919050565b818101828110156124fe576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d61746820616464206661696c656400000000000000000000000000604482015290519081900360640190fd5b92915050565b600061252a61252161251c858563ffffffff61302716565b613189565b6117f885613189565b9392505050565b805160009082908280806020841180159061254c5750600084115b15156125c8576040805160e560020a62461bcd02815260206004820152602a60248201527f737472696e67206d757374206265206265747765656e203120616e642033322060448201527f6368617261637465727300000000000000000000000000000000000000000000606482015290519081900360840190fd5b8460008151811015156125d757fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021415801561263e5750846001850381518110151561261657fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214155b15156126ba576040805160e560020a62461bcd02815260206004820152602560248201527f737472696e672063616e6e6f74207374617274206f7220656e6420776974682060448201527f7370616365000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8460008151811015156126c957fe5b90602001015160f860020a900460f860020a02600160f860020a031916603060f860020a02141561280c5784600181518110151561270357fe5b90602001015160f860020a900460f860020a02600160f860020a031916607860f860020a0214151515612780576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030780000000000604482015290519081900360640190fd5b84600181518110151561278f57fe5b90602001015160f860020a900460f860020a02600160f860020a031916605860f860020a021415151561280c576040805160e560020a62461bcd02815260206004820152601b60248201527f737472696e672063616e6e6f7420737461727420776974682030580000000000604482015290519081900360640190fd5b600091505b83821015612cdc5784517f40000000000000000000000000000000000000000000000000000000000000009086908490811061284957fe5b90602001015160f860020a900460f860020a02600160f860020a0319161180156128bd575084517f5b000000000000000000000000000000000000000000000000000000000000009086908490811061289e57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b1561292a5784828151811015156128d057fe5b90602001015160f860020a900460f860020a0260f860020a900460200160f860020a02858381518110151561290157fe5b906020010190600160f860020a031916908160001a90535082151561292557600192505b612cd1565b848281518110151561293857fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021480612a08575084517f60000000000000000000000000000000000000000000000000000000000000009086908490811061299457fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612a08575084517f7b00000000000000000000000000000000000000000000000000000000000000908690849081106129e957fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b80612ab2575084517f2f0000000000000000000000000000000000000000000000000000000000000090869084908110612a3e57fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612ab2575084517f3a0000000000000000000000000000000000000000000000000000000000000090869084908110612a9357fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b1515612b2e576040805160e560020a62461bcd02815260206004820152602260248201527f737472696e6720636f6e7461696e7320696e76616c696420636861726163746560448201527f7273000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8482815181101515612b3c57fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a021415612c1b578482600101815181101515612b7857fe5b90602001015160f860020a900460f860020a02600160f860020a031916602060f860020a0214151515612c1b576040805160e560020a62461bcd02815260206004820152602860248201527f737472696e672063616e6e6f7420636f6e7461696e20636f6e7365637574697660448201527f6520737061636573000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b82158015612cc7575084517f300000000000000000000000000000000000000000000000000000000000000090869084908110612c5457fe5b90602001015160f860020a900460f860020a02600160f860020a0319161080612cc7575084517f390000000000000000000000000000000000000000000000000000000000000090869084908110612ca857fe5b90602001015160f860020a900460f860020a02600160f860020a031916115b15612cd157600192505b600190910190612811565b600183151514612d36576040805160e560020a62461bcd02815260206004820152601d60248201527f737472696e672063616e6e6f74206265206f6e6c79206e756d62657273000000604482015290519081900360640190fd5b505050506020015192915050565b600080548082526006602052604090912060030154429081118015612dab575060008281526006602052604090206001015481111580612dab575060008281526006602052604090206001015481118015612dab5750600082815260066020526040902054155b15612de157612dbd846117f887612f0a565b60008681526003602081905260409091200155612ddc82868686612017565b611a06565b60008281526006602052604090206001015481118015612e13575060008281526006602052604090206002015460ff16155b15611a06576000828152600660205260409020600201805460ff19166001179055612e3d8361229c565b8051670de0b6b3a7640000830201815260208082018051880181526000888152600383526040908190206001015484519251828601516060808801516080808a015160a0808c015160c0808e01518b513381529d8e019a909a528c8b019b909b52948b0196909652600160a060020a0390941690890152928701929092529385019390935260e0840192909252610100830191909152519194507f603a740c9291cc914e0c8d16b355cdb091aefd5d9bbdf4f95371ce756f5e8a4091908190036101200190a15050505050565b6000818152600360205260408120600401548190612f299084906136a4565b600083815260036020819052604090912090810154600290910154612f539163ffffffff6124a316565b90506000811115612f7857600083815260036020819052604082206002810183905501555b8091505b50919050565b6000828152600460208181526040808420858552825280842060010154600692839052908420928301549290910154670de0b6b3a7640000926130169291612fe19190612fed90869084906064906122df90603263ffffffff61360a16565b9063ffffffff61360a16565b811515612ff657fe5b60008881526006602052604090206007015491900463ffffffff6124a316565b81151561301f57fe5b049392505050565b600082821115613081576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d61746820737562206661696c656400000000000000000000000000604482015290519081900360640190fd5b50900390565b60008281526004602090815260408083208484528252808320600281015460019091015460069093529083206007015461252a92670de0b6b3a7640000916130ce9161360a565b8115156130d757fe5b049063ffffffff61302716565b600061252a6130f284613105565b6117f8613105868663ffffffff6124a316565b60006309502f906131796d03b2a1d15167e7c5699bfde000006117f86131747a0dac7055469777a6122ee4310dd6c14410500f29048400000000006131686b01027e72f1f1281308800000612fe18a670de0b6b3a764000063ffffffff61360a16565b9063ffffffff6124a316565b61373c565b81151561318257fe5b0492915050565b600061319c670de0b6b3a764000061378f565b61317960026131cf6131bc86670de0b6b3a764000063ffffffff61360a16565b65886c8f6730709063ffffffff61360a16565b8115156131d857fe5b046131686131e58661378f565b6304a817c89063ffffffff61360a16565b6131fe6138ec565b60008381526003602052604090206004015415613232576000838152600360205260409020600401546132329084906136a4565b5060008054928152600360205260409020600401919091558051600a01815290565b600081815260066020526040812060010154429190821180156132835750600083815260066020526040902054155b156132b0576132a982613168601e670de0b6b3a7640000885b049063ffffffff61360a16565b90506132dd565b6000838152600660205260409020600101546132da90613168601e670de0b6b3a76400008861329c565b90505b6132ef6170808363ffffffff6124a316565b81101561330f576000838152600660205260409020600101819055610c3f565b6133216170808363ffffffff6124a316565b60008481526006602052604090206001015550505050565b6133416138ec565b600061336060646122df6007600101548761360a90919063ffffffff16565b60405190915073b14d7b0ec631daf0cf02d69860974df04987a9f89082156108fc029083906000818181858888f193505050501580156133a4573d6000803e3d6000fd5b5060a08301516133bb90829063ffffffff6124a316565b60a0840152509092915050565b6133d06138ec565b60008060006133f260646122df6007600001548a61360a90919063ffffffff16565b925061342161341460646122df6007600101548b61360a90919063ffffffff16565b889063ffffffff61302716565b9650613433878463ffffffff61302716565b91506134418989858961379b565b9050600081111561345f5761345c838263ffffffff61302716565b92505b6000898152600660208190526040909120015461348690613168848463ffffffff6124a316565b60008a8152600660208190526040909120015560c08501516134af90849063ffffffff6124a316565b60c08601525060e0840152509095945050505050565b42670de0b6b3a764000002816000015101816000018181525050600054751aba4714957d300d0e549208b31adb100000000000000284826020015101018160200181815250507f9a7c9c87d6b6f6612f5105b409490de2755b5b67db0172ab189b7431e57c7c848160000151826020015160036000888152602001908152602001600020600101543387878760400151886060015189608001518a60a001518b60c001518c60e00151604051808d81526020018c81526020018b600019166000191681526020018a600160a060020a0316600160a060020a0316815260200189815260200188815260200187600160a060020a0316600160a060020a0316815260200186600019166000191681526020018581526020018481526020018381526020018281526020019c5050505050505050505050505060405180910390a150505050565b600082151561361b575060006124fe565b5081810281838281151561362b57fe5b04146124fe576040805160e560020a62461bcd02815260206004820152601360248201527f536166654d617468206d756c206661696c656400000000000000000000000000604482015290519081900360640190fd5b60008080831161369057600080fd5b828481151561369b57fe5b04949350505050565b60006136b08383613087565b9050600081111561135b57600083815260036020819052604090912001546136df90829063ffffffff6124a316565b60008481526003602081815260408084209092019390935560048352808220858352909252206002015461371a90829063ffffffff6124a316565b6000848152600460209081526040808320868452909152902060020155505050565b600080600261374c8460016124a3565b81151561375557fe5b0490508291505b81811015612f7c57809150600261377e828581151561377757fe5b04836124a3565b81151561378757fe5b04905061375c565b60006124fe828361360a565b600084815260066020526040812060040154819081906137c986670de0b6b3a764000063ffffffff61360a16565b8115156137d257fe5b60008981526006602052604090206007015491900492506137fa90839063ffffffff6124a316565b600088815260066020526040902060070155670de0b6b3a7640000613825838663ffffffff61360a16565b81151561382e57fe5b60008881526004602090815260408083208c845282528083206002015460069092529091206007015492909104925061388191613168908490670de0b6b3a7640000906130ce908a63ffffffff61360a16565b60008781526004602081815260408084208c85528252808420600201949094556006905291902001546138e190670de0b6b3a7640000906138c990859063ffffffff61360a16565b8115156138d257fe5b8791900463ffffffff61302716565b979650505050505050565b6101006040519081016040528060008152602001600081526020016000600160a060020a03168152602001600080191681526020016000815260200160008152602001600081526020016000815250905600697473206e6f74207265616479207965742e0000000000000000000000000000736f7272792068756d616e73206f6e6c79000000000000000000000000000000a165627a7a723058203e269fe59c4bfa1d2ca77547b6a29cdbd7155d75cd8f8b68abd1b88ec385497a0029

   Swarm Source:
bzzr://3e269fe59c4bfa1d2ca77547b6a29cdbd7155d75cd8f8b68abd1b88ec385497a

 

View All
Block Age transaction Difficulty Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.