Contract 0x8eb965ee9cCFBCE76c0a06264492c0afEfc2826d

 

TxHash Block Age From To Value [TxFee]
0x35972be71aafce13b76f53f94f57ab514fbf4f177ed7599ce06852495b1ef83d72295769 hrs 44 mins ago0x2b7c0c5dd8aaae6808f85139468ce0d00efdc563  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.000150598
0xc150a1005831256ab60fd02cafcd87925ecf4cd396b9da40a7f1a32f5e1c14f0722915412 hrs 8 mins ago0xf6fb44f07cfc3fac77df3efc071c7704dc510f0c  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.00095125
0x71098c78d3d8bc0d6a2374ac3d7f93e231d9310c29fdf8332dc6885c0133974871935328 days 17 hrs ago0xc5ef1c754e26f12c81ccb3f02caedba6b4d6e719  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.000182524
0x1ba7905fb85533b592bbf8b09f4b31d4e39d41f44ef15a9b6fe6847c13dd306e717441112 days 15 hrs ago0xa73fa2565c18218ac6510c8cd3b220f5794f3b84  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.000045695
0x8c108dc65541d781ab2a49417c7992b9373281667fec4cafe2290bc5c0cc028d713575120 days 12 hrs ago0x0dbddae8ba17f005eed7bde70caeca5f7194895d  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.000289812
0x4b14c883ae6ae5b3cd0098d42bcb197d6a53c4549c4fef2ae339d4868c6b0617711269625 days 1 hr ago0x321fd420f3517c37c715d0840c7751760af0b60a  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.003960764
0xa75d39b91ef99f1d944f3c755b994146314cf2fa0d2c35d65014d8cc1205c382707117332 days 17 hrs ago0xf935847a822b1f5937c0d3ffebf3675fd9945933  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.001
0x1c0219fe9f6fc908e99ea54df28ab41ea2d977f14f03da4754ba69a74538e432706508133 days 19 hrs ago0xf935847a822b1f5937c0d3ffebf3675fd9945933  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.0006
0x978dcb6699c91a23bd4dfcea9ae34ca2271445f71bcd7cfe52e32eb5813a33d7704833436 days 18 hrs ago0x521db06bf657ed1d6c98553a70319a8ddbac75a3  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.002204981338
0xc20f55c7c9fb4adac66864b1c47a944e3908d56b9634873833942b0563228ca6703337439 days 11 hrs ago0x68b4683475747e28a83596e94b58187d452099cf  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.00018278
0xa6cab04992859a4f0f815ea9993b917af355ee3553c541cd3ccdc5a8b42e44b8702772640 days 11 hrs ago0xc0a4c80ff85ec29c55c76d406bce2675c2bfae19  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.0000547572
0xb13b9dd82ee6c197da801aa016b46285e7b3d622fb379e6ecbfc717595263f18702766940 days 12 hrs ago0xc0a4c80ff85ec29c55c76d406bce2675c2bfae19  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.0000547572
0xd654bfeaa5a047d25474b51a008b5ed9188b0b5b2806717d9294a6d6be2639fb702747340 days 12 hrs ago0x521db06bf657ed1d6c98553a70319a8ddbac75a3  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.002810094803
0xfe03add6c5db820cf9e84408a5d02667113629463f1289ec0175c292333c5ff8701290143 days 3 hrs ago0xb25eb24b1aebde4a80aa6c626b186e5bdb52ddf7  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.000221494
0x045536c9e744c98fe93486e8c81e1c646981583ef9ded498f69493e65beaa070697585049 days 12 hrs ago0x45a3b5fd782dfdff1b3e43e43146e1be46e23036  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.000148312
0x89903d8f2958403b6433928f0a6f69d590ebdd53e02220eeacd6e81f88315a4d695061153 days 18 hrs ago0x8325aff2ccc014468cdf20f2538d8534db7a100f  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.000595672
0xb934d41d730e6fe6c3ccea2f3ea26982e34a403dac4e50dcea62fac9cf410979695011853 days 21 hrs ago0x8325aff2ccc014468cdf20f2538d8534db7a100f  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.0001045806
0x700074753ed97d2cb6d281734d05a9a53550e259bf24f34c0aa9c6c836e215d8695010053 days 21 hrs ago0x8325aff2ccc014468cdf20f2538d8534db7a100f  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.000092277
0x22ea39bcba744573e4a0fc7fcb5450c3681929039c649171800fe23fbbb1a5cf694984753 days 22 hrs ago0x8325aff2ccc014468cdf20f2538d8534db7a100f  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.0001414561
0x1370fd1bcf8a4b3a97bc6e0289d3da9e009b89d036e2cb3b3be08c8d6d5fab93694968253 days 22 hrs ago0xd576b29870a145dde8b2b39a4531626b8d76f42f  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.000463795
0x35cae892a582335a3f31056b5f941850886b0bba0ca00176b08868d1e1c3e1cb694838154 days 3 hrs ago0x15a42386b7b5d3b680767b3754ca55a87c9370f3  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.00177035
0x61ea8bef50cf12c89cd1f46060c3dbe807f175bc787a56f14c58ac26a4259641694803354 days 5 hrs ago0x521db06bf657ed1d6c98553a70319a8ddbac75a3  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.001417332006
0x17d6bcd9b07bf0f3da7070b1b21c4207d59a19f056d25ee8c67bd3e1203c1703694712554 days 8 hrs ago0x7219738d11ba72c0d3343753e7a7884ae5f45f33  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.003006079
0x5935541648d0bde496f032997b349c8a54a5545ff85010ebcd0e18b79791761c694313455 days 1 hr ago0x3410b04c2362496d0d06a0be58658e7cd5b50e31  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.0004
0x3dc53ad89203715b1fbf5902a7d4697a9849536e46caa06a0c5823bbb56d2c55694311455 days 1 hr ago0x3410b04c2362496d0d06a0be58658e7cd5b50e31  IN   0x8eb965ee9ccfbce76c0a06264492c0afefc2826d0 Ether0.00032
[ Download CSV Export 

Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: ToorToken
Compiler Version: v0.4.24+commit.e67f0147
Optimization Enabled: No
Runs (Optimizer):  200


Contract Source Code
pragma solidity ^0.4.18;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address public owner;


    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


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

    /**
    * @dev Throws if called by any account other than the owner.
    */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    /**
    * @dev Allows the current owner to transfer control of the contract to a newOwner.
    * @param newOwner The address to transfer ownership to.
    */
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0));
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

}


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}







/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
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;
        assert(c / a == b);
        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) {
        assert(b <= a);
        return a - b;
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }
}

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract ToorToken is ERC20Basic, Ownable {
    using SafeMath for uint256;

    struct Account {
        uint balance;
        uint lastInterval;
    }

    mapping(address => Account) public accounts;
    mapping(uint256 => uint256) ratesByYear;
    mapping (address => mapping (address => uint256)) internal allowed;
    uint256 private rateMultiplier;

    uint256 initialSupply_;
    uint256 totalSupply_;
    uint256 public maxSupply;
    uint256 public startTime;
    uint256 public pendingRewardsToMint;

    string public name;
    uint public decimals;
    string public symbol;

    uint256 private tokenGenInterval; // This defines the frequency at which we calculate rewards
    uint256 private vestingPeriod; // Defines how often tokens vest to team
    uint256 private cliff; // Defines the minimum amount of time required before tokens vest
    uint256 public pendingInstallments; // Defines the number of pending vesting installments for team
    uint256 public paidInstallments; // Defines the number of paid vesting installments for team
    uint256 private totalVestingPool; //  Defines total vesting pool set aside for team
    uint256 public pendingVestingPool; // Defines pending tokens in pool set aside for team
    uint256 public finalIntervalForTokenGen; // The last instance of reward calculation, after which rewards will cease
    uint256 private totalRateWindows; // This specifies the number of rate windows over the total period of time
    uint256 private intervalsPerWindow; // Total number of times we calculate rewards within 1 rate window

    // Variable to define once reward generation is complete
    bool public rewardGenerationComplete;

    // Ether addresses of founders and company
    mapping(uint256 => address) public distributionAddresses;

    // Events section
    event Mint(address indexed to, uint256 amount);
    event Burn(address indexed burner, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    function ToorToken() public {
        name = "ToorCoin";
        decimals = 18;
        symbol = "TOOR";

        // Setup the token staking reward percentage per year
        rateMultiplier = 10**9;
        ratesByYear[1] = 1.00474436 * 10**9;
        ratesByYear[2] = 1.003278088 * 10**9;
        ratesByYear[3] = 1.002799842 * 10**9;
        ratesByYear[4] = 1.002443535 * 10**9;
        ratesByYear[5] = 1.002167763 * 10**9;
        ratesByYear[6] = 1.001947972 * 10**9;
        ratesByYear[7] = 1.001768676 * 10**9;
        ratesByYear[8] = 1.001619621 * 10**9;
        ratesByYear[9] = 1.001493749 * 10**9;
        ratesByYear[10] = 1.001386038 * 10**9;
        ratesByYear[11] = 1.001292822 * 10**9;
        ratesByYear[12] = 1.001211358 * 10**9;
        ratesByYear[13] = 1.001139554 * 10**9;
        ratesByYear[14] = 1.001075789 * 10**9;
        ratesByYear[15] = 1.001018783 * 10**9;
        ratesByYear[16] = 1.000967516 * 10**9;
        ratesByYear[17] = 1.000921162 * 10**9;
        ratesByYear[18] = 1.000879048 * 10**9;
        ratesByYear[19] = 1.000840616 * 10**9;
        ratesByYear[20] = 1.000805405 * 10**9;

        totalRateWindows = 20;
        
        maxSupply = 100000000 * 10**18;
        initialSupply_ = 13500000 * 10**18;
        pendingInstallments = 7;
        paidInstallments = 0;
        totalVestingPool = 4500000 * 10**18;
        startTime = now;

        distributionAddresses[1] = 0x7d3BC9bb69dAB0544d34b7302DED8806bCF715e6; // founder 1
        distributionAddresses[2] = 0x34Cf9afae3f926B9D040CA7A279C411355c5C480; // founder 2
        distributionAddresses[3] = 0x059Cbd8A57b1dD944Da020a0D0a18D8dD7e78E04; // founder 3
        distributionAddresses[4] = 0x4F8bC705827Fb8A781b27B9F02d2491F531f8962; // founder 4
        distributionAddresses[5] = 0x532d370a98a478714625E9148D1205be061Df3bf; // founder 5
        distributionAddresses[6] = 0xDe485bB000fA57e73197eF709960Fb7e32e0380E; // company
        distributionAddresses[7] = 0xd562f635c75D2d7f3BE0005FBd3808a5cfb896bd; // bounty
        
        // This is for 20 years
        tokenGenInterval = 603936;  // This is roughly 1 week in seconds
        uint256 timeToGenAllTokens = 628093440; // This is close to 20 years in seconds

        rewardGenerationComplete = false;
        
        // Mint initial tokens
        accounts[distributionAddresses[6]].balance = (initialSupply_ * 60) / 100; // 60% of initial balance goes to Company
        accounts[distributionAddresses[6]].lastInterval = 0;
        generateMintEvents(distributionAddresses[6],accounts[distributionAddresses[6]].balance);
        accounts[distributionAddresses[7]].balance = (initialSupply_ * 40) / 100; // 40% of inital balance goes to Bounty
        accounts[distributionAddresses[7]].lastInterval = 0;
        generateMintEvents(distributionAddresses[7],accounts[distributionAddresses[7]].balance);

        pendingVestingPool = totalVestingPool;
        pendingRewardsToMint = maxSupply - initialSupply_ - totalVestingPool;
        totalSupply_ = initialSupply_;
        vestingPeriod = timeToGenAllTokens / (totalRateWindows * 12); // One vesting period is a month
        cliff = vestingPeriod * 6; // Cliff is six vesting periods aka 6 months roughly
        finalIntervalForTokenGen = timeToGenAllTokens / tokenGenInterval;
        intervalsPerWindow = finalIntervalForTokenGen / totalRateWindows;
    }

    // This gives the total supply of actual minted coins. Does not take rewards pending minting into consideration
    function totalSupply() public view returns (uint256) {
        return totalSupply_;
    }

    // This function is called directly by users who wish to transfer tokens
    function transfer(address _to, uint256 _value) canTransfer(_to) public returns (bool) {
        // Call underlying transfer method and pass in the sender address
        transferBasic(msg.sender, _to, _value);
        return true;
    }

    // This function is called by both transfer and transferFrom
    function transferBasic(address _from, address _to, uint256 _value) internal {
        uint256 tokensOwedSender = 0;
        uint256 tokensOwedReceiver = 0;
        uint256 balSender = balanceOfBasic(_from);

        // Distribute rewards tokens first
        if (!rewardGenerationComplete) {
            tokensOwedSender = tokensOwed(_from);
            require(_value <= (balSender.add(tokensOwedSender))); // Sender should have the number of tokens they want to send

            tokensOwedReceiver = tokensOwed(_to);

            // If there were tokens owed, increase total supply accordingly
            if ((tokensOwedSender.add(tokensOwedReceiver)) > 0) {
                increaseTotalSupply(tokensOwedSender.add(tokensOwedReceiver)); // This will break if total exceeds max cap
                pendingRewardsToMint = pendingRewardsToMint.sub(tokensOwedSender.add(tokensOwedReceiver));
            }

            // If there were tokens owed, raise mint events for them
            raiseEventIfMinted(_from, tokensOwedSender);
            raiseEventIfMinted(_to, tokensOwedReceiver);
        } else {
            require(_value <= balSender);
        }
        
        // Update balances of sender and receiver
        accounts[_from].balance = (balSender.add(tokensOwedSender)).sub(_value);
        accounts[_to].balance = (accounts[_to].balance.add(tokensOwedReceiver)).add(_value);

        // Update last intervals for sender and receiver
        uint256 currInt = intervalAtTime(now);
        accounts[_from].lastInterval = currInt;
        accounts[_to].lastInterval = currInt;

        emit Transfer(_from, _to, _value);
    }

    // If you want to transfer tokens to multiple receivers at once
    function batchTransfer(address[] _receivers, uint256 _value) public returns (bool) {
        uint256 cnt = _receivers.length;
        uint256 amount = cnt.mul(_value);
        
        // Check that the value to send is more than 0
        require(_value > 0);

        // Add pending rewards for sender first
        if (!rewardGenerationComplete) {
            addReward(msg.sender);
        }

        // Get current balance of sender
        uint256 balSender = balanceOfBasic(msg.sender);

        // Check that the sender has the required amount
        require(balSender >= amount);

        // Update balance and lastInterval of sender
        accounts[msg.sender].balance = balSender.sub(amount);
        uint256 currInt = intervalAtTime(now);
        accounts[msg.sender].lastInterval = currInt;
        
        
        for (uint i = 0; i < cnt; i++) {
            // Add pending rewards for receiver first
            if (!rewardGenerationComplete) {
                address receiver = _receivers[i];
                
                addReward(receiver);
            }

            // Update balance and lastInterval of receiver
            accounts[_receivers[i]].balance = (accounts[_receivers[i]].balance).add(_value);
            accounts[_receivers[i]].lastInterval = currInt;
            emit Transfer(msg.sender, _receivers[i], _value);
        }

        return true;
    }

    // This function allows someone to withdraw tokens from someone's address
    // For this to work, the person needs to have been approved by the account owner (via the approve function)
    function transferFrom(address _from, address _to, uint256 _value) canTransfer(_to) public returns (bool)
    {
        // Check that function caller has been approved to withdraw tokens
        require(_value <= allowed[_from][msg.sender]);

        // Call out base transfer method
        transferBasic(_from, _to, _value);

        // Subtract withdrawn tokens from allowance
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);

        return true;
    }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
    function approve(address _spender, uint256 _value) public returns (bool) {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

      /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
    function allowance(address _owner, address _spender) public view returns (uint256)
    {
        return allowed[_owner][_spender];
    }

  
   // Increase the amount of tokens that an owner allowed to a spender.
   // approve should be called when allowed[_spender] == 0. To increment
   // allowed value is better to use this function to avoid 2 calls (and wait until the first transaction is mined)
    function increaseApproval(address _spender, uint _addedValue) public returns (bool)
    {
        allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

   // Decrease the amount of tokens that an owner allowed to a spender.
   // approve should be called when allowed[_spender] == 0. To decrement
   // allowed value is better to use this function to avoid 2 calls (and wait until the first transaction is mined)
    function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool)
    {
        uint oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue > oldValue) {
            allowed[msg.sender][_spender] = 0;
        } else {
            allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
        }
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    function raiseEventIfMinted(address owner, uint256 tokensToReward) private returns (bool) {
        if (tokensToReward > 0) {
            generateMintEvents(owner, tokensToReward);
        }
    }

    function addReward(address owner) private returns (bool) {
        uint256 tokensToReward = tokensOwed(owner);

        if (tokensToReward > 0) {
            increaseTotalSupply(tokensToReward); // This will break if total supply exceeds max cap. Should never happen though as tokensOwed checks for this condition
            accounts[owner].balance = accounts[owner].balance.add(tokensToReward);
            accounts[owner].lastInterval = intervalAtTime(now);
            pendingRewardsToMint = pendingRewardsToMint.sub(tokensToReward); // This helps track rounding errors when computing rewards
            generateMintEvents(owner, tokensToReward);
        }

        return true;
    }

    // This function is to vest tokens to the founding team
    // This deliberately doesn't use SafeMath as all the values are controlled without risk of overflow
    function vestTokens() public returns (bool) {
        require(pendingInstallments > 0);
        require(paidInstallments < 7);
        require(pendingVestingPool > 0);
        require(now - startTime > cliff);

        // If they have rewards pending, allocate those first
        if (!rewardGenerationComplete) {
            for (uint256 i = 1; i <= 5; i++) {
                addReward(distributionAddresses[i]);
            }
        }

        uint256 currInterval = intervalAtTime(now);
        uint256 tokensToVest = 0;
        uint256 totalTokensToVest = 0;
        uint256 totalPool = totalVestingPool;

        uint256[2] memory founderCat;
        founderCat[0] = 0;
        founderCat[1] = 0;

        uint256[5] memory origFounderBal;
        origFounderBal[0] = accounts[distributionAddresses[1]].balance;
        origFounderBal[1] = accounts[distributionAddresses[2]].balance;
        origFounderBal[2] = accounts[distributionAddresses[3]].balance;
        origFounderBal[3] = accounts[distributionAddresses[4]].balance;
        origFounderBal[4] = accounts[distributionAddresses[5]].balance;

        uint256[2] memory rewardCat;
        rewardCat[0] = 0;
        rewardCat[1] = 0;

        // Pay out cliff
        if (paidInstallments < 1) {
            uint256 intervalAtCliff = intervalAtTime(cliff + startTime);
            tokensToVest = totalPool / 4;

            founderCat[0] = tokensToVest / 4;
            founderCat[1] = tokensToVest / 8;

            // Update vesting pool
            pendingVestingPool -= tokensToVest;

            // This condition checks if there are any rewards to pay after the cliff
            if (currInterval > intervalAtCliff && !rewardGenerationComplete) {
                rewardCat[0] = tokensOwedByInterval(founderCat[0], intervalAtCliff, currInterval);
                rewardCat[1] = rewardCat[0] / 2;

                // Add rewards to founder tokens being vested
                founderCat[0] += rewardCat[0];
                founderCat[1] += rewardCat[1];

                // Increase total amount of tokens to vest
                tokensToVest += ((3 * rewardCat[0]) + (2 * rewardCat[1]));

                // Reduce pending rewards
                pendingRewardsToMint -= ((3 * rewardCat[0]) + (2 * rewardCat[1]));
            }

            // Vest tokens for each of the founders, this includes any rewards pending since cliff passed
            accounts[distributionAddresses[1]].balance += founderCat[0];
            accounts[distributionAddresses[2]].balance += founderCat[0];
            accounts[distributionAddresses[3]].balance += founderCat[0];
            accounts[distributionAddresses[4]].balance += founderCat[1];
            accounts[distributionAddresses[5]].balance += founderCat[1];

            totalTokensToVest = tokensToVest;

            // Update pending and paid installments
            pendingInstallments -= 1;
            paidInstallments += 1;
        }

        // Calculate the pending non-cliff installments to pay based on current time
        uint256 installments = ((currInterval * tokenGenInterval) - cliff) / vestingPeriod;
        uint256 installmentsToPay = installments + 1 - paidInstallments;

        // If there are no installments to pay, skip this
        if (installmentsToPay > 0) {
            if (installmentsToPay > pendingInstallments) {
                installmentsToPay = pendingInstallments;
            }

            // 12.5% vesting monthly after the cliff
            tokensToVest = (totalPool * 125) / 1000;

            founderCat[0] = tokensToVest / 4;
            founderCat[1] = tokensToVest / 8;

            uint256 intervalsAtVest = 0;

            // Loop through installments to pay, so that we can add token holding rewards as we go along
            for (uint256 installment = paidInstallments; installment < (installmentsToPay + paidInstallments); installment++) {
                intervalsAtVest = intervalAtTime(cliff + (installment * vestingPeriod) + startTime);

                // This condition checks if there are any rewards to pay after the cliff
                if (currInterval >= intervalsAtVest && !rewardGenerationComplete) {
                    rewardCat[0] = tokensOwedByInterval(founderCat[0], intervalsAtVest, currInterval);
                    rewardCat[1] = rewardCat[0] / 2;

                    // Increase total amount of tokens to vest
                    totalTokensToVest += tokensToVest;
                    totalTokensToVest += ((3 * rewardCat[0]) + (2 * rewardCat[1]));

                    // Reduce pending rewards
                    pendingRewardsToMint -= ((3 * rewardCat[0]) + (2 * rewardCat[1]));

                    // Vest tokens for each of the founders, this includes any rewards pending since vest interval passed
                    accounts[distributionAddresses[1]].balance += (founderCat[0] + rewardCat[0]);
                    accounts[distributionAddresses[2]].balance += (founderCat[0] + rewardCat[0]);
                    accounts[distributionAddresses[3]].balance += (founderCat[0] + rewardCat[0]);
                    accounts[distributionAddresses[4]].balance += (founderCat[1] + rewardCat[1]);
                    accounts[distributionAddresses[5]].balance += (founderCat[1] + rewardCat[1]);
                }
            }

            // Reduce pendingVestingPool and update pending and paid installments
            pendingVestingPool -= (installmentsToPay * tokensToVest);
            pendingInstallments -= installmentsToPay;
            paidInstallments += installmentsToPay;
        }

        // Increase total supply by the number of tokens being vested
        increaseTotalSupply(totalTokensToVest);
            
        accounts[distributionAddresses[1]].lastInterval = currInterval;
        accounts[distributionAddresses[2]].lastInterval = currInterval;
        accounts[distributionAddresses[3]].lastInterval = currInterval;
        accounts[distributionAddresses[4]].lastInterval = currInterval;
        accounts[distributionAddresses[5]].lastInterval = currInterval;

        // Create events for token generation
        generateMintEvents(distributionAddresses[1], (accounts[distributionAddresses[1]].balance - origFounderBal[0]));
        generateMintEvents(distributionAddresses[2], (accounts[distributionAddresses[2]].balance - origFounderBal[1]));
        generateMintEvents(distributionAddresses[3], (accounts[distributionAddresses[3]].balance - origFounderBal[2]));
        generateMintEvents(distributionAddresses[4], (accounts[distributionAddresses[4]].balance - origFounderBal[3]));
        generateMintEvents(distributionAddresses[5], (accounts[distributionAddresses[5]].balance - origFounderBal[4]));
    }

    function increaseTotalSupply (uint256 tokens) private returns (bool) {
        require ((totalSupply_.add(tokens)) <= maxSupply);
        totalSupply_ = totalSupply_.add(tokens);

        return true;
    }

    function tokensOwed(address owner) public view returns (uint256) {
        // This array is introduced to circumvent stack depth issues
        uint256 currInterval = intervalAtTime(now);
        uint256 lastInterval = accounts[owner].lastInterval;
        uint256 balance = accounts[owner].balance;

        return tokensOwedByInterval(balance, lastInterval, currInterval);
    }

    function tokensOwedByInterval(uint256 balance, uint256 lastInterval, uint256 currInterval) public view returns (uint256) {
        // Once the specified address has received all possible rewards, don't calculate anything
        if (lastInterval >= currInterval || lastInterval >= finalIntervalForTokenGen) {
            return 0;
        }

        uint256 tokensHeld = balance; //tokensHeld
        uint256 intPerWin = intervalsPerWindow;
        uint256 totalRateWinds = totalRateWindows;

        // Defines the number of intervals we compute rewards for at a time
        uint256 intPerBatch = 5; // Hardcoded here instead of storing on blockchain to save gas

        mapping(uint256 => uint256) ratByYear = ratesByYear;
        uint256 ratMultiplier = rateMultiplier;

        uint256 minRateWindow = (lastInterval / intPerWin).add(1);
        uint256 maxRateWindow = (currInterval / intPerWin).add(1);
        if (maxRateWindow > totalRateWinds) {
            maxRateWindow = totalRateWinds;
        }

        // Loop through pending periods of rewards, and calculate the total balance user should hold
        for (uint256 rateWindow = minRateWindow; rateWindow <= maxRateWindow; rateWindow++) {
            uint256 intervals = getIntervalsForWindow(rateWindow, lastInterval, currInterval, intPerWin);

            // This part is to ensure we don't overflow when rewards are pending for a large number of intervals
            // Loop through interval in batches
            while (intervals > 0) {
                if (intervals >= intPerBatch) {
                    tokensHeld = (tokensHeld.mul(ratByYear[rateWindow] ** intPerBatch)) / (ratMultiplier ** intPerBatch);
                    intervals = intervals.sub(intPerBatch);
                } else {
                    tokensHeld = (tokensHeld.mul(ratByYear[rateWindow] ** intervals)) / (ratMultiplier ** intervals);
                    intervals = 0;
                }
            }            
        }

        // Rewards owed are the total balance that user SHOULD have minus what they currently have
        return (tokensHeld.sub(balance));
    }

    function intervalAtTime(uint256 time) public view returns (uint256) {
        // Check to see that time passed in is not before contract generation time, as that would cause a negative value in the next step
        if (time <= startTime) {
            return 0;
        }

        // Based on time passed in, check how many intervals have elapsed
        uint256 interval = (time.sub(startTime)) / tokenGenInterval;
        uint256 finalInt = finalIntervalForTokenGen; // Assign to local to reduce gas
        
        // Return max intervals if it's greater than that time
        if (interval > finalInt) {
            return finalInt;
        } else {
            return interval;
        }
    }

    // This function checks how many intervals for a given window do we owe tokens to someone for 
    function getIntervalsForWindow(uint256 rateWindow, uint256 lastInterval, uint256 currInterval, uint256 intPerWind) public pure returns (uint256) {
        // If lastInterval for holder falls in a window previous to current one, the lastInterval for the window passed into the function would be the window start interval
        if (lastInterval < ((rateWindow.sub(1)).mul(intPerWind))) {
            lastInterval = ((rateWindow.sub(1)).mul(intPerWind));
        }

        // If currentInterval for holder falls in a window higher than current one, the currentInterval for the window passed into the function would be the window end interval
        if (currInterval > rateWindow.mul(intPerWind)) {
            currInterval = rateWindow.mul(intPerWind);
        }

        return currInterval.sub(lastInterval);
    }

    // This function tells the balance of tokens at a particular address
    function balanceOf(address _owner) public view returns (uint256 balance) {
        if (rewardGenerationComplete) {
            return accounts[_owner].balance;
        } else {
            return (accounts[_owner].balance).add(tokensOwed(_owner));
        }
    }

    function balanceOfBasic(address _owner) public view returns (uint256 balance) {
        return accounts[_owner].balance;
    }

    // This functions returns the last time at which rewards were transferred to a particular address
    function lastTimeOf(address _owner) public view returns (uint256 interval, uint256 time) {
        return (accounts[_owner].lastInterval, ((accounts[_owner].lastInterval).mul(tokenGenInterval)).add(startTime));
    }

    // This function is not meant to be used. It's only written as a fail-safe against potential unforeseen issues
    function mint(address _to, uint256 _amount) onlyOwner public returns (bool) {
        // Add pending rewards for recipient of minted tokens
        if (!rewardGenerationComplete) {
            addReward(_to);
        }

        // Increase total supply by minted amount
        increaseTotalSupply(_amount);

        // Update balance and last interval
        accounts[_to].lastInterval = intervalAtTime(now);
        accounts[_to].balance = (accounts[_to].balance).add(_amount);

        generateMintEvents(_to, _amount);
        return true;
    }

    function generateMintEvents(address _to, uint256 _amount) private returns (bool) {
        emit Mint(_to, _amount);
        emit Transfer(address(0), _to, _amount);

        return true;
    }

    // Allows the burning of tokens
    function burn(uint256 _value) public {
        require(_value <= balanceOf(msg.sender));

        // First add any rewards pending for the person burning tokens
        if (!rewardGenerationComplete) {
            addReward(msg.sender);
        }

        // Update balance and lastInterval of person burning tokens
        accounts[msg.sender].balance = (accounts[msg.sender].balance).sub(_value);
        accounts[msg.sender].lastInterval = intervalAtTime(now);

        // Update total supply
        totalSupply_ = totalSupply_.sub(_value);

        // Raise events
        emit Burn(msg.sender, _value);
        emit Transfer(msg.sender, address(0), _value);
    }

    // These set of functions allow changing of founder and company addresses
    function setFounder(uint256 id, address _to) onlyOwner public returns (bool) {
        require(_to != address(0));
        distributionAddresses[id] = _to;
        return true;
    }

    // This is a setter for rewardGenerationComplete. It will be used to see if token rewards need to be computed, and can only be set by owner
    function setRewardGenerationComplete(bool _value) onlyOwner public returns (bool) {
        rewardGenerationComplete = _value;
        return true;
    }

    // This function is added to get a state of where the token is in term of reward generation
    function getNow() public view returns (uint256, uint256, uint256) {
        return (now, block.number, intervalAtTime(now));
    }

    // This modifier is used on the transfer method and defines where tokens CANNOT be sent
    modifier canTransfer(address _to) {
        require(_to != address(0)); // Transfer should not be allowed to burn tokens
        _;
    }
}

Contract ABI
[{"constant":true,"inputs":[{"name":"time","type":"uint256"}],"name":"intervalAtTime","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":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"lastTimeOf","outputs":[{"name":"interval","type":"uint256"},{"name":"time","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"tokensOwed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"balance","type":"uint256"},{"name":"lastInterval","type":"uint256"},{"name":"currInterval","type":"uint256"}],"name":"tokensOwedByInterval","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paidInstallments","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingRewardsToMint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"accounts","outputs":[{"name":"balance","type":"uint256"},{"name":"lastInterval","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_receivers","type":"address[]"},{"name":"_value","type":"uint256"}],"name":"batchTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingVestingPool","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"_to","type":"address"}],"name":"setFounder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"bool"}],"name":"setRewardGenerationComplete","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"vestTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNow","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"distributionAddresses","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardGenerationComplete","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"rateWindow","type":"uint256"},{"name":"lastInterval","type":"uint256"},{"name":"currInterval","type":"uint256"},{"name":"intPerWind","type":"uint256"}],"name":"getIntervalsForWindow","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOfBasic","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingInstallments","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"finalIntervalForTokenGen","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

Contract Creation Code
60806040523480156200001157600080fd5b506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040805190810160405280600881526020017f546f6f72436f696e000000000000000000000000000000000000000000000000815250600a9080519060200190620000a192919062000b71565b506012600b819055506040805190810160405280600481526020017f544f4f5200000000000000000000000000000000000000000000000000000000815250600c9080519060200190620000f792919062000b71565b50633b9aca00600481905550633be32ea8600260006001815260200190815260200160002081905550633bcccf08600260006002815260200190815260200160002081905550633bc582e2600260006003815260200190815260200160002081905550633bc0130f600260006004815260200190815260200160002081905550633bbbddd3600260006005815260200190815260200160002081905550633bb88344600260006006815260200190815260200160002081905550633bb5c6e4600260006007815260200190815260200160002081905550633bb380a5600260006008815260200190815260200160002081905550633bb194f5600260006009815260200190815260200160002081905550633baff03660026000600a815260200190815260200160002081905550633bae841660026000600b815260200190815260200160002081905550633bad45de60026000600c815260200190815260200160002081905550633bac2d6260026000600d815260200190815260200160002081905550633bab344d60026000600e815260200190815260200160002081905550633baa559f60026000600f815260200190815260200160002081905550633ba98d5c600260006010815260200190815260200160002081905550633ba8d84a600260006011815260200190815260200160002081905550633ba833c8600260006012815260200190815260200160002081905550633ba79da8600260006013815260200190815260200160002081905550633ba7141d60026000601481526020019081526020016000208190555060146015819055506a52b7d2dcc80cd2e40000006007819055506a0b2abc7767ce87fd800000600581905550600760108190555060006011819055506a03b8e97d229a2d5480000060128190555042600881905550737d3bc9bb69dab0544d34b7302ded8806bcf715e6601860006001815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507334cf9afae3f926b9d040ca7a279c411355c5c480601860006002815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073059cbd8a57b1dd944da020a0d0a18d8dd7e78e04601860006003815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734f8bc705827fb8a781b27b9f02d2491f531f8962601860006004815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073532d370a98a478714625e9148d1205be061df3bf601860006005815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073de485bb000fa57e73197ef709960fb7e32e0380e601860006006815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d562f635c75d2d7f3be0005fbd3808a5cfb896bd601860006007815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062093720600d8190555063256ff20090506000601760006101000a81548160ff0219169083151502179055506064603c60055402811515620006ab57fe5b0460016000601860006006815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600060016000601860006006815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555062000867601860006006815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016000601860006006815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015462000ab1640100000000026401000000009004565b5060646028600554028115156200087a57fe5b0460016000601860006007815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600060016000601860006007815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555062000a36601860006007815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016000601860006007815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015462000ab1640100000000026401000000009004565b506012546013819055506012546005546007540303600981905550600554600681905550600c601554028181151562000a6b57fe5b04600e819055506006600e5402600f81905550600d548181151562000a8c57fe5b0460148190555060155460145481151562000aa357fe5b046016819055505062000c20565b60008273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000bb457805160ff191683800117855562000be5565b8280016001018555821562000be5579182015b8281111562000be457825182559160200191906001019062000bc7565b5b50905062000bf4919062000bf8565b5090565b62000c1d91905b8082111562000c1957600081600090555060010162000bff565b5090565b90565b61414b8062000c306000396000f3006080604052600436106101c2576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063011de7aa146101c757806306fdde0314610208578063095ea7b31461029857806318160ddd146102fd57806323b872dd146103285780632a491877146103ad578063313ce5671461040b5780633d5dff531461043657806340c10f191461048d57806340db4b09146104f257806342966c681461054757806344defdfd1461057457806356f2eb901461059f5780635e5c06e2146105ca578063661884631461062857806370a082311461068d57806378e97925146106e457806383f12fec1461070f57806386dc8ace146107975780638da5cb5b146107c257806395d89b411461081957806399384976146108a9578063a60eb2991461090e578063a9059cbb14610955578063abf0c538146109ba578063bbe4fd50146109e9578063c0a21d3214610a22578063c61b8a4414610a8f578063c821861b14610abe578063c93e253d14610b1d578063d5abeb0114610b74578063d73dd62314610b9f578063dd62ed3e14610c04578063e799284514610c7b578063f26df08314610ca6578063f2fde38b14610cd1575b600080fd5b3480156101d357600080fd5b506101f260048036038101908080359060200190929190505050610d14565b6040518082815260200191505060405180910390f35b34801561021457600080fd5b5061021d610d71565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561025d578082015181840152602081019050610242565b50505050905090810190601f16801561028a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102a457600080fd5b506102e3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e0f565b604051808215151515815260200191505060405180910390f35b34801561030957600080fd5b50610312610f01565b6040518082815260200191505060405180910390f35b34801561033457600080fd5b50610393600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f0b565b604051808215151515815260200191505060405180910390f35b3480156103b957600080fd5b506103ee600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110fb565b604051808381526020018281526020019250505060405180910390f35b34801561041757600080fd5b506104206111b5565b6040518082815260200191505060405180910390f35b34801561044257600080fd5b50610477600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111bb565b6040518082815260200191505060405180910390f35b34801561049957600080fd5b506104d8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061126b565b604051808215151515815260200191505060405180910390f35b3480156104fe57600080fd5b506105316004803603810190808035906020019092919080359060200190929190803590602001909291905050506113f2565b6040518082815260200191505060405180910390f35b34801561055357600080fd5b506105726004803603810190808035906020019092919050505061157c565b005b34801561058057600080fd5b50610589611770565b6040518082815260200191505060405180910390f35b3480156105ab57600080fd5b506105b4611776565b6040518082815260200191505060405180910390f35b3480156105d657600080fd5b5061060b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061177c565b604051808381526020018281526020019250505060405180910390f35b34801561063457600080fd5b50610673600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117a0565b604051808215151515815260200191505060405180910390f35b34801561069957600080fd5b506106ce600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a31565b6040518082815260200191505060405180910390f35b3480156106f057600080fd5b506106f9611af7565b6040518082815260200191505060405180910390f35b34801561071b57600080fd5b5061077d6004803603810190808035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190929190505050611afd565b604051808215151515815260200191505060405180910390f35b3480156107a357600080fd5b506107ac611e1e565b6040518082815260200191505060405180910390f35b3480156107ce57600080fd5b506107d7611e24565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082557600080fd5b5061082e611e49565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561086e578082015181840152602081019050610853565b50505050905090810190601f16801561089b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108b557600080fd5b506108f460048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ee7565b604051808215151515815260200191505060405180910390f35b34801561091a57600080fd5b5061093b600480360381019080803515159060200190929190505050611fdc565b604051808215151515815260200191505060405180910390f35b34801561096157600080fd5b506109a0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061205c565b604051808215151515815260200191505060405180910390f35b3480156109c657600080fd5b506109cf6120b1565b604051808215151515815260200191505060405180910390f35b3480156109f557600080fd5b506109fe6135b9565b60405180848152602001838152602001828152602001935050505060405180910390f35b348015610a2e57600080fd5b50610a4d600480360381019080803590602001909291905050506135d4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a9b57600080fd5b50610aa4613607565b604051808215151515815260200191505060405180910390f35b348015610aca57600080fd5b50610b076004803603810190808035906020019092919080359060200190929190803590602001909291908035906020019092919050505061361a565b6040518082815260200191505060405180910390f35b348015610b2957600080fd5b50610b5e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506136bf565b6040518082815260200191505060405180910390f35b348015610b8057600080fd5b50610b8961370b565b6040518082815260200191505060405180910390f35b348015610bab57600080fd5b50610bea600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613711565b604051808215151515815260200191505060405180910390f35b348015610c1057600080fd5b50610c65600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061390d565b6040518082815260200191505060405180910390f35b348015610c8757600080fd5b50610c90613994565b6040518082815260200191505060405180910390f35b348015610cb257600080fd5b50610cbb61399a565b6040518082815260200191505060405180910390f35b348015610cdd57600080fd5b50610d12600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139a0565b005b600080600060085484111515610d2d5760009250610d6a565b600d54610d4560085486613af590919063ffffffff16565b811515610d4e57fe5b049150601454905080821115610d6657809250610d6a565b8192505b5050919050565b600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e075780601f10610ddc57610100808354040283529160200191610e07565b820191906000526020600020905b815481529060010190602001808311610dea57829003601f168201915b505050505081565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600654905090565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610f4a57600080fd5b600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548311151515610fd557600080fd5b610fe0858585613b0e565b61106f83600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613af590919063ffffffff16565b600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060019150509392505050565b600080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546111ac60085461119e600d54600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154613e2390919063ffffffff16565b613e5b90919063ffffffff16565b91509150915091565b600b5481565b6000806000806111ca42610d14565b9250600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549150600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506112618183856113f2565b9350505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c857600080fd5b601760009054906101000a900460ff1615156112e9576112e783613e77565b505b6112f282613fb3565b506112fc42610d14565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061139782600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613e5b90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506113e78383613ffe565b506001905092915050565b60008060008060008060008060008060008b8d10158061141457506014548d10155b156114225760009a5061156b565b8d9950601654985060155497506005965060029550600454945061145b60018a8f81151561144c57fe5b04613e5b90919063ffffffff16565b935061147c60018a8e81151561146d57fe5b04613e5b90919063ffffffff16565b92508783111561148a578792505b8391505b8282111515611555576114a3828e8e8c61361a565b90505b60008111156115485786811015156115085786850a6114e288886000868152602001908152602001600020540a8c613e2390919063ffffffff16565b8115156114eb57fe5b0499506115018782613af590919063ffffffff16565b9050611543565b80850a61153282886000868152602001908152602001600020540a8c613e2390919063ffffffff16565b81151561153b57fe5b049950600090505b6114a6565b818060010192505061148e565b6115688e8b613af590919063ffffffff16565b9a505b505050505050505050509392505050565b61158533611a31565b811115151561159357600080fd5b601760009054906101000a900460ff1615156115b4576115b233613e77565b505b61160981600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613af590919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061165842610d14565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506116b381600654613af590919063ffffffff16565b6006819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a2600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350565b60115481565b60095481565b60016020528060005260406000206000915090508060000154908060010154905082565b600080600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050808311156118b1576000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611945565b6118c48382613af590919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b6000601760009054906101000a900460ff1615611a9257600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050611af2565b611aef611a9e836111bb565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613e5b90919063ffffffff16565b90505b919050565b60085481565b600080600080600080600088519550611b1f8887613e2390919063ffffffff16565b9450600088111515611b3057600080fd5b601760009054906101000a900460ff161515611b5157611b4f33613e77565b505b611b5a336136bf565b9350848410151515611b6b57600080fd5b611b7e8585613af590919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550611bcd42610d14565b925082600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600091505b85821015611e0e57601760009054906101000a900460ff161515611c5e578882815181101515611c4757fe5b906020019060200201519050611c5c81613e77565b505b611cca88600160008c86815181101515611c7457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613e5b90919063ffffffff16565b600160008b85815181101515611cdc57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555082600160008b85815181101515611d3a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508882815181101515611d9357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8a6040518082815260200191505060405180910390a38180600101925050611c1b565b6001965050505050505092915050565b60135481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611edf5780601f10611eb457610100808354040283529160200191611edf565b820191906000526020600020905b815481529060010190602001808311611ec257829003601f168201915b505050505081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f4457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611f8057600080fd5b816018600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561203957600080fd5b81601760006101000a81548160ff02191690831515021790555060019050919050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561209b57600080fd5b6120a6338585613b0e565b600191505092915050565b6000806000806000806120c26140da565b6120ca6140fc565b6120d26140da565b6000806000806000806010541115156120ea57600080fd5b60076011541015156120fb57600080fd5b600060135411151561210c57600080fd5b600f54600854420311151561212057600080fd5b601760009054906101000a900460ff1615156121905760019c505b60058d11151561218f57612181601860008f815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613e77565b508c806001019d505061213b565b5b61219942610d14565b9b5060009a5060009950601254985060008860006002811015156121b957fe5b60200201818152505060008860016002811015156121d357fe5b60200201818152505060016000601860006001815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015487600060058110151561226257fe5b60200201818152505060016000601860006002815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548760016005811015156122f157fe5b60200201818152505060016000601860006003815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015487600260058110151561238057fe5b60200201818152505060016000601860006004815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015487600360058110151561240f57fe5b60200201818152505060016000601860006005815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015487600460058110151561249e57fe5b60200201818152505060008660006002811015156124b857fe5b60200201818152505060008660016002811015156124d257fe5b602002018181525050600160115410156129de576124f5600854600f5401610d14565b945060048981151561250357fe5b049a5060048b81151561251257fe5b0488600060028110151561252257fe5b60200201818152505060088b81151561253757fe5b0488600160028110151561254757fe5b6020020181815250508a601360008282540392505081905550848c11801561257c5750601760009054906101000a900460ff16155b156126c55761259f88600060028110151561259357fe5b6020020151868e6113f2565b8660006002811015156125ae57fe5b60200201818152505060028660006002811015156125c857fe5b60200201518115156125d657fe5b048660016002811015156125e657fe5b6020020181815250508560006002811015156125fe57fe5b602002015188600060028110151561261257fe5b60200201818151019150818152505085600160028110151561263057fe5b602002015188600160028110151561264457fe5b60200201818151019150818152505085600160028110151561266257fe5b602002015160020286600060028110151561267957fe5b6020020151600302018b019a5085600160028110151561269557fe5b60200201516002028660006002811015156126ac57fe5b6020020151600302016009600082825403925050819055505b8760006002811015156126d457fe5b602002015160016000601860006001815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254019250508190555087600060028110151561276b57fe5b602002015160016000601860006002815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254019250508190555087600060028110151561280257fe5b602002015160016000601860006003815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254019250508190555087600160028110151561289957fe5b602002015160016000601860006004815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254019250508190555087600160028110151561293057fe5b602002015160016000601860006005815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825401925050819055508a9950600160106000828254039250508190555060016011600082825401925050819055505b600e54600f54600d548e02038115156129f357fe5b049350601154600185010392506000831115612f4657601054831115612a195760105492505b6103e8607d8a02811515612a2957fe5b049a5060048b811515612a3857fe5b04886000600281101515612a4857fe5b60200201818152505060088b811515612a5d57fe5b04886001600281101515612a6d57fe5b6020020181815250506000915060115490505b6011548301811015612f1357612aa1600854600e548302600f540101610d14565b9150818c10158015612ac05750601760009054906101000a900460ff16155b15612f0657612ae3886000600281101515612ad757fe5b6020020151838e6113f2565b866000600281101515612af257fe5b6020020181815250506002866000600281101515612b0c57fe5b6020020151811515612b1a57fe5b04866001600281101515612b2a57fe5b6020020181815250508a8a019950856001600281101515612b4757fe5b6020020151600202866000600281101515612b5e57fe5b6020020151600302018a019950856001600281101515612b7a57fe5b6020020151600202866000600281101515612b9157fe5b602002015160030201600960008282540392505081905550856000600281101515612bb857fe5b6020020151886000600281101515612bcc57fe5b60200201510160016000601860006001815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282540192505081905550856000600281101515612c6457fe5b6020020151886000600281101515612c7857fe5b60200201510160016000601860006002815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282540192505081905550856000600281101515612d1057fe5b6020020151886000600281101515612d2457fe5b60200201510160016000601860006003815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282540192505081905550856001600281101515612dbc57fe5b6020020151886001600281101515612dd057fe5b60200201510160016000601860006004815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282540192505081905550856001600281101515612e6857fe5b6020020151886001600281101515612e7c57fe5b60200201510160016000601860006005815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825401925050819055505b8080600101915050612a80565b8a830260136000828254039250508190555082601060008282540392505081905550826011600082825401925050819055505b612f4f8a613fb3565b508b60016000601860006001815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508b60016000601860006002815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508b60016000601860006003815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508b60016000601860006004815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508b60016000601860006005815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550613280601860006001815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168860006005811015156131fe57fe5b602002015160016000601860006001815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403613ffe565b5061334a601860006002815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168860016005811015156132c857fe5b602002015160016000601860006002815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403613ffe565b50613414601860006003815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688600260058110151561339257fe5b602002015160016000601860006003815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403613ffe565b506134de601860006004815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688600360058110151561345c57fe5b602002015160016000601860006004815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403613ffe565b506135a8601860006005815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1688600460058110151561352657fe5b602002015160016000601860006005815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403613ffe565b505050505050505050505050505090565b600080600042436135c942610d14565b925092509250909192565b60186020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601760009054906101000a900460ff1681565b600061364282613634600188613af590919063ffffffff16565b613e2390919063ffffffff16565b8410156136725761366f82613661600188613af590919063ffffffff16565b613e2390919063ffffffff16565b93505b6136858286613e2390919063ffffffff16565b8311156136a25761369f8286613e2390919063ffffffff16565b92505b6136b58484613af590919063ffffffff16565b9050949350505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b60075481565b60006137a282600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613e5b90919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60105481565b60145481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156139fb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613a3757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000828211151515613b0357fe5b818303905092915050565b6000806000806000935060009250613b25876136bf565b9150601760009054906101000a900460ff161515613bf457613b46876111bb565b9350613b5b8483613e5b90919063ffffffff16565b8511151515613b6957600080fd5b613b72866111bb565b92506000613b898486613e5b90919063ffffffff16565b1115613bd957613baa613ba58486613e5b90919063ffffffff16565b613fb3565b50613bd2613bc18486613e5b90919063ffffffff16565b600954613af590919063ffffffff16565b6009819055505b613be387856140be565b50613bee86846140be565b50613c04565b818511151515613c0357600080fd5b5b613c2985613c1b8685613e5b90919063ffffffff16565b613af590919063ffffffff16565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550613cd685613cc885600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613e5b90919063ffffffff16565b613e5b90919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550613d2542610d14565b905080600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555080600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a350505050505050565b600080831415613e365760009050613e55565b8183029050818382811515613e4757fe5b04141515613e5157fe5b8090505b92915050565b60008183019050828110151515613e6e57fe5b80905092915050565b600080613e83836111bb565b90506000811115613fa957613e9781613fb3565b50613eed81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613e5b90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550613f3c42610d14565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550613f9781600954613af590919063ffffffff16565b600981905550613fa78382613ffe565b505b6001915050919050565b6000600754613fcd83600654613e5b90919063ffffffff16565b11151515613fda57600080fd5b613fef82600654613e5b90919063ffffffff16565b60068190555060019050919050565b60008273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000808211156140d4576140d28383613ffe565b505b92915050565b6040805190810160405280600290602082028038833980820191505090505090565b60a0604051908101604052806005906020820280388339808201915050905050905600a165627a7a72305820743a4097f06e10351dce172395bc465febd64a21459f5646aa466412fba157c30029


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