ETH Price: $3,268.49 (+0.26%)
Gas: 3 Gwei

Contract

0x851669F77544ca3e02305C74238160051cB0F51f
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Complete Crowdsa...54481372018-04-16 1:17:402294 days ago1523841460IN
0x851669F7...51cB0F51f
0 ETH0.000039731
Unpause Crowdsal...54481222018-04-16 1:13:212294 days ago1523841201IN
0x851669F7...51cB0F51f
0 ETH0.000027971
Pause Crowdsale54085822018-04-09 10:02:242301 days ago1523268144IN
0x851669F7...51cB0F51f
0 ETH0.000141415
Remove Whitelist...53306152018-03-27 10:24:012314 days ago1522146241IN
0x851669F7...51cB0F51f
0 ETH0.000131554
Remove Whitelist...53306132018-03-27 10:23:332314 days ago1522146213IN
0x851669F7...51cB0F51f
0 ETH0.000131554
Remove Whitelist...53305062018-03-27 9:58:312314 days ago1522144711IN
0x851669F7...51cB0F51f
0 ETH0.000098663
Remove Whitelist...53305062018-03-27 9:58:312314 days ago1522144711IN
0x851669F7...51cB0F51f
0 ETH0.000131424
Remove Whitelist...53304982018-03-27 9:56:122314 days ago1522144572IN
0x851669F7...51cB0F51f
0 ETH0.000131554
Remove Whitelist...53304912018-03-27 9:54:432314 days ago1522144483IN
0x851669F7...51cB0F51f
0 ETH0.000098663
Remove Whitelist...53304362018-03-27 9:40:202314 days ago1522143620IN
0x851669F7...51cB0F51f
0 ETH0.000131554
Transfer53303872018-03-27 9:29:252314 days ago1522142965IN
0x851669F7...51cB0F51f
0.11 ETH0.000182552
Set Whitelist Ad...53303292018-03-27 9:14:202314 days ago1522142060IN
0x851669F7...51cB0F51f
0 ETH0.000213673
Set Rate52867052018-03-20 2:22:522321 days ago1521512572IN
0x851669F7...51cB0F51f
0 ETH0.000027271
Set Rate52865802018-03-20 1:52:262321 days ago1521510746IN
0x851669F7...51cB0F51f
0 ETH0.000220728.09253734
Set Rate52864552018-03-20 1:23:062321 days ago1521508986IN
0x851669F7...51cB0F51f
0 ETH0.00010914
Set Rate52863392018-03-20 0:53:092321 days ago1521507189IN
0x851669F7...51cB0F51f
0 ETH0.00010914
Set Rate52862082018-03-20 0:23:492321 days ago1521505429IN
0x851669F7...51cB0F51f
0 ETH0.00010914
Set Rate52860802018-03-19 23:53:072321 days ago1521503587IN
0x851669F7...51cB0F51f
0 ETH0.00010914
Set Rate52859502018-03-19 23:22:092321 days ago1521501729IN
0x851669F7...51cB0F51f
0 ETH0.00010914
Set Rate52858522018-03-19 22:52:512321 days ago1521499971IN
0x851669F7...51cB0F51f
0 ETH0.000054552
Set Rate52857162018-03-19 22:22:262321 days ago1521498146IN
0x851669F7...51cB0F51f
0 ETH0.000081823
Set Rate52855822018-03-19 21:52:362321 days ago1521496356IN
0x851669F7...51cB0F51f
0 ETH0.000163656
Set Rate52854612018-03-19 21:22:342321 days ago1521494554IN
0x851669F7...51cB0F51f
0 ETH0.000084553.1
Set Rate52853152018-03-19 20:52:152321 days ago1521492735IN
0x851669F7...51cB0F51f
0 ETH0.00010914
Set Rate52852012018-03-19 20:22:392321 days ago1521490959IN
0x851669F7...51cB0F51f
0 ETH0.00010914
View all transactions

Latest 8 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
54481372018-04-16 1:17:402294 days ago1523841460
0x851669F7...51cB0F51f
52.75934374 ETH
53306152018-03-27 10:24:012314 days ago1522146241
0x851669F7...51cB0F51f
0.19 ETH
53306132018-03-27 10:23:332314 days ago1522146213
0x851669F7...51cB0F51f
0.3 ETH
53305062018-03-27 9:58:312314 days ago1522144711
0x851669F7...51cB0F51f
3 ETH
53305062018-03-27 9:58:312314 days ago1522144711
0x851669F7...51cB0F51f
10.1 ETH
53304982018-03-27 9:56:122314 days ago1522144572
0x851669F7...51cB0F51f
0.4 ETH
53304912018-03-27 9:54:432314 days ago1522144483
0x851669F7...51cB0F51f
10 ETH
53304362018-03-27 9:40:202314 days ago1522143620
0x851669F7...51cB0F51f
0.11 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ViolaCrowdsale

Compiler Version
v0.4.20+commit.3155dd80

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-03-13
*/

pragma solidity 0.4.20;

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws 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 Substracts 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) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}


// ----------------------------------------------------------------------------
// ERC Token Standard #20 Interface
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
// ----------------------------------------------------------------------------
contract ERC20Interface {
    function totalSupply() public view returns (uint256);
    function balanceOf(address who) public view returns (uint256);
    function transfer(address to, uint256 value) public returns (bool);
    function allowance(address owner, address spender) public view returns (uint256);
    function transferFrom(address from, address to, uint256 value) public returns (bool);
    function approve(address spender, uint256 value) public returns (bool);

    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Burn(address indexed burner, uint256 value);
}


// ----------------------------------------------------------------------------
// VIOLET ERC20 Standard Token
// ----------------------------------------------------------------------------
contract VLTToken is ERC20Interface {
    using SafeMath for uint256;

    address public owner = msg.sender;

    bytes32 public symbol;
    bytes32 public name;
    uint8 public decimals;
    uint256 public _totalSupply;

    mapping(address => uint256) internal balances;
    mapping(address => mapping (address => uint256)) internal allowed;

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    // ------------------------------------------------------------------------
    // Constructor
    // ------------------------------------------------------------------------
    function VLTToken() public {
        symbol = "VAI";
        name = "VIOLET";
        decimals = 18;
        _totalSupply = 250000000 * 10**uint256(decimals);
        balances[owner] = _totalSupply;
        Transfer(address(0), owner, _totalSupply);
    }


    /**
    * @dev total number of tokens in existence
    */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
    * @dev Gets the balance of the specified address.
    * @param _owner The address to query the the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address _owner) public view returns (uint256 balance) {
        return balances[_owner];
    }

    /**
    * @dev transfer token for a specified address
    * @param _to The address to transfer to.
    * @param _value The amount to be transferred.
    */
    function transfer(address _to, uint256 _value) public returns (bool) {
        // allow sending 0 tokens
        if (_value == 0) {
            Transfer(msg.sender, _to, _value);    // Follow the spec to louch the event when transfer 0
            return;
        }
        
        require(_to != address(0));
        require(_value <= balances[msg.sender]);

        // SafeMath.sub will throw if there is not enough balance.
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        Transfer(msg.sender, _to, _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;
        Approval(msg.sender, _spender, _value);
        return true;
    }

    /**
    * @dev Transfer tokens from one address to another
    * @param _from address The address which you want to send tokens from
    * @param _to address The address which you want to transfer to
    * @param _value uint256 the amount of tokens to be transferred
    */
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        // allow sending 0 tokens
        if (_value == 0) {
            Transfer(_from, _to, _value);    // Follow the spec to louch the event when transfer 0
            return;
        }

        require(_to != address(0));
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        Transfer(_from, _to, _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];
    }


    /**
    * @dev 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)
    * From MonolithDAO Token.sol
    * @param _spender The address which will spend the funds.
    * @param _addedValue The amount of tokens to increase the allowance by.
    */
    function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
        allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    /**
    * @dev 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)
    * From MonolithDAO Token.sol
    * @param _spender The address which will spend the funds.
    * @param _subtractedValue The amount of tokens to decrease the allowance by.
    */
    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);
        }
        Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    /**
    * @dev Burns a specific amount of tokens.
    * @param _value The amount of token to be burned.
    */
    function burn(uint256 _value) public {
        require(_value <= balances[msg.sender]);
        // no need to require value <= totalSupply, since that would imply the
        // sender's balance is greater than the totalSupply, which *should* be an assertion failure

        address burner = msg.sender;
        balances[burner] = balances[burner].sub(_value);
        _totalSupply = _totalSupply.sub(_value);
        Burn(burner, _value);
        Transfer(burner, address(0), _value);
    }

    /**
     * Destroy tokens from other account
     * Remove `_value` tokens from the system irreversibly on behalf of `_from`.
     * @param _from the address of the sender
     * @param _value the amount of money to burn
     */
    function burnFrom(address _from, uint256 _value) public returns (bool) {
        require(_value <= balances[_from]);               // Check if the targeted balance is enough
        require(_value <= allowed[_from][msg.sender]);    // Check allowed allowance
        balances[_from] = balances[_from].sub(_value);  // Subtract from the targeted balance
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);             // Subtract from the sender's allowance
        _totalSupply = _totalSupply.sub(_value);                              // Update totalSupply
        Burn(_from, _value);
        Transfer(_from, address(0), _value);
        return true;
    } 

    // ------------------------------------------------------------------------
    // Owner can transfer out any accidentally sent ERC20 tokens
    // ------------------------------------------------------------------------
    function transferAnyERC20Token(address tokenAddress, uint tokens) public onlyOwner returns (bool success) {
        return ERC20Interface(tokenAddress).transfer(owner, tokens);
    }
}

contract ERC20Basic {
  uint256 public totalSupply;
  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);
}

contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

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));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}



/**
 * @title ViolaCrowdsale
 * @dev ViolaCrowdsale reserves token from supply when eth is received
 * funds will be forwarded after the end of crowdsale. Tokens will be claimable
 * within 7 days after crowdsale ends.
 */
 
contract ViolaCrowdsale is Ownable {
  using SafeMath for uint256;

  enum State { Deployed, PendingStart, Active, Paused, Ended, Completed }

  //Status of contract
  State public status = State.Deployed;

  // The token being sold
  VLTToken public violaToken;

  //For keeping track of whitelist address. cap >0 = whitelisted
  mapping(address=>uint) public maxBuyCap;

  //For checking if address passed KYC
  mapping(address => bool)public addressKYC;

  //Total wei sum an address has invested
  mapping(address=>uint) public investedSum;

  //Total violaToken an address is allocated
  mapping(address=>uint) public tokensAllocated;

    //Total violaToken an address purchased externally is allocated
  mapping(address=>uint) public externalTokensAllocated;

  //Total bonus violaToken an address is entitled after vesting
  mapping(address=>uint) public bonusTokensAllocated;

  //Total bonus violaToken an address purchased externally is entitled after vesting
  mapping(address=>uint) public externalBonusTokensAllocated;

  //Store addresses that has registered for crowdsale before (pushed via setWhitelist)
  //Does not mean whitelisted as it can be revoked. Just to track address for loop
  address[] public registeredAddress;

  //Total amount not approved for withdrawal
  uint256 public totalApprovedAmount = 0;

  //Start and end timestamps where investments are allowed (both inclusive)
  uint256 public startTime;
  uint256 public endTime;
  uint256 public bonusVestingPeriod = 60 days;


  /**
   * Note all values are calculated in wei(uint256) including token amount
   * 1 ether = 1000000000000000000 wei
   * 1 viola = 1000000000000000000 vi lawei
   */


  //Address where funds are collected
  address public wallet;

  //Min amount investor can purchase
  uint256 public minWeiToPurchase;

  // how many token units *in wei* a buyer gets *per wei*
  uint256 public rate;

  //Extra bonus token to give *in percentage*
  uint public bonusTokenRateLevelOne = 20;
  uint public bonusTokenRateLevelTwo = 15;
  uint public bonusTokenRateLevelThree = 10;
  uint public bonusTokenRateLevelFour = 0;

  //Total amount of tokens allocated for crowdsale
  uint256 public totalTokensAllocated;

  //Total amount of tokens reserved from external sources
  //Sub set of totalTokensAllocated ( totalTokensAllocated - totalReservedTokenAllocated = total tokens allocated for purchases using ether )
  uint256 public totalReservedTokenAllocated;

  //Numbers of token left above 0 to still be considered sold
  uint256 public leftoverTokensBuffer;

  /**
   * event for front end logging
   */

  event TokenPurchase(address indexed purchaser, uint256 value, uint256 amount, uint256 bonusAmount);
  event ExternalTokenPurchase(address indexed purchaser, uint256 amount, uint256 bonusAmount);
  event ExternalPurchaseRefunded(address indexed purchaser, uint256 amount, uint256 bonusAmount);
  event TokenDistributed(address indexed tokenReceiver, uint256 tokenAmount);
  event BonusTokenDistributed(address indexed tokenReceiver, uint256 tokenAmount);
  event TopupTokenAllocated(address indexed tokenReceiver, uint256 amount, uint256 bonusAmount);
  event CrowdsalePending();
  event CrowdsaleStarted();
  event CrowdsaleEnded();
  event BonusRateChanged();
  event Refunded(address indexed beneficiary, uint256 weiAmount);

  //Set inital arguments of the crowdsale
  function initialiseCrowdsale (uint256 _startTime, uint256 _rate, address _tokenAddress, address _wallet) onlyOwner external {
    require(status == State.Deployed);
    require(_startTime >= now);
    require(_rate > 0);
    require(address(_tokenAddress) != address(0));
    require(_wallet != address(0));

    startTime = _startTime;
    endTime = _startTime + 30 days;
    rate = _rate;
    wallet = _wallet;
    violaToken = VLTToken(_tokenAddress);

    status = State.PendingStart;

    CrowdsalePending();

  }

  /**
   * Crowdsale state functions
   * To track state of current crowdsale
   */


  // To be called by Ethereum alarm clock or anyone
  //Can only be called successfully when time is valid
  function startCrowdsale() external {
    require(withinPeriod());
    require(violaToken != address(0));
    require(getTokensLeft() > 0);
    require(status == State.PendingStart);

    status = State.Active;

    CrowdsaleStarted();
  }

  //To be called by owner or contract
  //Ends the crowdsale when tokens are sold out
  function endCrowdsale() public {
    if (!tokensHasSoldOut()) {
      require(msg.sender == owner);
    }
    require(status == State.Active);

    bonusVestingPeriod = now + 60 days;

    status = State.Ended;

    CrowdsaleEnded();
  }
  //Emergency pause
  function pauseCrowdsale() onlyOwner external {
    require(status == State.Active);

    status = State.Paused;
  }
  //Resume paused crowdsale
  function unpauseCrowdsale() onlyOwner external {
    require(status == State.Paused);

    status = State.Active;
  }

  function completeCrowdsale() onlyOwner external {
    require(hasEnded());
    require(violaToken.allowance(owner, this) == 0);
    status = State.Completed;

    _forwardFunds();

    assert(this.balance == 0);
  }

  function burnExtraTokens() onlyOwner external {
    require(hasEnded());
    uint256 extraTokensToBurn = violaToken.allowance(owner, this);
    violaToken.burnFrom(owner, extraTokensToBurn);
    assert(violaToken.allowance(owner, this) == 0);
  }

  // send ether to the fund collection wallet
  function _forwardFunds() internal {
    wallet.transfer(this.balance);
  }

  function partialForwardFunds(uint _amountToTransfer) onlyOwner external {
    require(status == State.Ended);
    require(_amountToTransfer < totalApprovedAmount);
    totalApprovedAmount = totalApprovedAmount.sub(_amountToTransfer);
    
    wallet.transfer(_amountToTransfer);
  }

  /**
   * Setter functions for crowdsale parameters
   * Only owner can set values
   */


  function setLeftoverTokensBuffer(uint256 _tokenBuffer) onlyOwner external {
    require(_tokenBuffer > 0);
    require(getTokensLeft() >= _tokenBuffer);
    leftoverTokensBuffer = _tokenBuffer;
  }

  //Set the ether to token rate
  function setRate(uint _rate) onlyOwner external {
    require(_rate > 0);
    rate = _rate;
  }

  function setBonusTokenRateLevelOne(uint _rate) onlyOwner external {
    //require(_rate > 0);
    bonusTokenRateLevelOne = _rate;
    BonusRateChanged();
  }

  function setBonusTokenRateLevelTwo(uint _rate) onlyOwner external {
    //require(_rate > 0);
    bonusTokenRateLevelTwo = _rate;
    BonusRateChanged();
  }

  function setBonusTokenRateLevelThree(uint _rate) onlyOwner external {
    //require(_rate > 0);
    bonusTokenRateLevelThree = _rate;
    BonusRateChanged();
  }
  function setBonusTokenRateLevelFour(uint _rate) onlyOwner external {
    //require(_rate > 0);
    bonusTokenRateLevelFour = _rate;
    BonusRateChanged();
  }

  function setMinWeiToPurchase(uint _minWeiToPurchase) onlyOwner external {
    minWeiToPurchase = _minWeiToPurchase;
  }


  /**
   * Whitelisting and KYC functions
   * Whitelisted address can buy tokens, KYC successful purchaser can claim token. Refund if fail KYC
   */


  //Set the amount of wei an address can purchase up to
  //@dev Value of 0 = not whitelisted
  //@dev cap is in *18 decimals* ( 1 token = 1*10^18)
  
  function setWhitelistAddress( address _investor, uint _cap ) onlyOwner external {
        require(_cap > 0);
        require(_investor != address(0));
        maxBuyCap[_investor] = _cap;
        registeredAddress.push(_investor);
        //add event
    }

  //Remove the address from whitelist
  function removeWhitelistAddress(address _investor) onlyOwner external {
    require(_investor != address(0));
    
    maxBuyCap[_investor] = 0;
    uint256 weiAmount = investedSum[_investor];

    if (weiAmount > 0) {
      _refund(_investor);
    }
  }

  //Flag address as KYC approved. Address is now approved to claim tokens
  function approveKYC(address _kycAddress) onlyOwner external {
    require(_kycAddress != address(0));
    addressKYC[_kycAddress] = true;

    uint256 weiAmount = investedSum[_kycAddress];
    totalApprovedAmount = totalApprovedAmount.add(weiAmount);
  }

  //Set KYC status as failed. Refund any eth back to address
  function revokeKYC(address _kycAddress) onlyOwner external {
    require(_kycAddress != address(0));
    addressKYC[_kycAddress] = false;

    uint256 weiAmount = investedSum[_kycAddress];
    totalApprovedAmount = totalApprovedAmount.sub(weiAmount);

    if (weiAmount > 0) {
      _refund(_kycAddress);
    }
  }

  /**
   * Getter functions for crowdsale parameters
   * Does not use gas
   */

  //Checks if token has been sold out
    function tokensHasSoldOut() view internal returns (bool) {
      if (getTokensLeft() <= leftoverTokensBuffer) {
        return true;
      } else {
        return false;
      }
    }

      // @return true if the transaction can buy tokens
  function withinPeriod() public view returns (bool) {
    return now >= startTime && now <= endTime;
  }

  // @return true if crowdsale event has ended
  function hasEnded() public view returns (bool) {
    if (status == State.Ended) {
      return true;
    }
    return now > endTime;
  }

  function getTokensLeft() public view returns (uint) {
    return violaToken.allowance(owner, this).sub(totalTokensAllocated);
  }

  function transferTokens (address receiver, uint tokenAmount) internal {
     require(violaToken.transferFrom(owner, receiver, tokenAmount));
  }

  function getTimeBasedBonusRate() public view returns(uint) {
    bool bonusDuration1 = now >= startTime && now <= (startTime + 1 days);  //First 24hr
    bool bonusDuration2 = now > (startTime + 1 days) && now <= (startTime + 3 days);//Next 48 hr
    bool bonusDuration3 = now > (startTime + 3 days) && now <= (startTime + 10 days);//4th to 10th day
    bool bonusDuration4 = now > (startTime + 10 days) && now <= endTime;//11th day onwards
    if (bonusDuration1) {
      return bonusTokenRateLevelOne;
    } else if (bonusDuration2) {
      return bonusTokenRateLevelTwo;
    } else if (bonusDuration3) {
      return bonusTokenRateLevelThree;
    } else if (bonusDuration4) {
      return bonusTokenRateLevelFour;
    } else {
      return 0;
    }
  }

  function getTotalTokensByAddress(address _investor) public view returns(uint) {
    return getTotalNormalTokensByAddress(_investor).add(getTotalBonusTokensByAddress(_investor));
  }

  function getTotalNormalTokensByAddress(address _investor) public view returns(uint) {
    return tokensAllocated[_investor].add(externalTokensAllocated[_investor]);
  }

  function getTotalBonusTokensByAddress(address _investor) public view returns(uint) {
    return bonusTokensAllocated[_investor].add(externalBonusTokensAllocated[_investor]);
  }

  function _clearTotalNormalTokensByAddress(address _investor) internal {
    tokensAllocated[_investor] = 0;
    externalTokensAllocated[_investor] = 0;
  }

  function _clearTotalBonusTokensByAddress(address _investor) internal {
    bonusTokensAllocated[_investor] = 0;
    externalBonusTokensAllocated[_investor] = 0;
  }


  /**
   * Functions to handle buy tokens
   * Fallback function as entry point for eth
   */


  // Called when ether is sent to contract
  function () external payable {
    buyTokens(msg.sender);
  }

  //Used to buy tokens
  function buyTokens(address investor) internal {
    require(status == State.Active);
    require(msg.value >= minWeiToPurchase);

    uint weiAmount = msg.value;

    checkCapAndRecord(investor,weiAmount);

    allocateToken(investor,weiAmount);
    
  }

  //Internal call to check max user cap
  function checkCapAndRecord(address investor, uint weiAmount) internal {
      uint remaindingCap = maxBuyCap[investor];
      require(remaindingCap >= weiAmount);
      maxBuyCap[investor] = remaindingCap.sub(weiAmount);
      investedSum[investor] = investedSum[investor].add(weiAmount);
  }

  //Internal call to allocated tokens purchased
    function allocateToken(address investor, uint weiAmount) internal {
        // calculate token amount to be created
        uint tokens = weiAmount.mul(rate);
        uint bonusTokens = tokens.mul(getTimeBasedBonusRate()).div(100);
        
        uint tokensToAllocate = tokens.add(bonusTokens);
        
        require(getTokensLeft() >= tokensToAllocate);
        totalTokensAllocated = totalTokensAllocated.add(tokensToAllocate);

        tokensAllocated[investor] = tokensAllocated[investor].add(tokens);
        bonusTokensAllocated[investor] = bonusTokensAllocated[investor].add(bonusTokens);

        if (tokensHasSoldOut()) {
          endCrowdsale();
        }
        TokenPurchase(investor, weiAmount, tokens, bonusTokens);
  }



  /**
   * Functions for refunds & claim tokens
   * 
   */



  //Refund users in case of unsuccessful crowdsale
  function _refund(address _investor) internal {
    uint256 investedAmt = investedSum[_investor];
    require(investedAmt > 0);

  
      uint totalInvestorTokens = tokensAllocated[_investor].add(bonusTokensAllocated[_investor]);

    if (status == State.Active) {
      //Refunded tokens go back to sale pool
      totalTokensAllocated = totalTokensAllocated.sub(totalInvestorTokens);
    }

    _clearAddressFromCrowdsale(_investor);

    _investor.transfer(investedAmt);

    Refunded(_investor, investedAmt);
  }

    //Partial refund users
  function refundPartial(address _investor, uint _refundAmt, uint _tokenAmt, uint _bonusTokenAmt) onlyOwner external {

    uint investedAmt = investedSum[_investor];
    require(investedAmt > _refundAmt);
    require(tokensAllocated[_investor] > _tokenAmt);
    require(bonusTokensAllocated[_investor] > _bonusTokenAmt);

    investedSum[_investor] = investedSum[_investor].sub(_refundAmt);
    tokensAllocated[_investor] = tokensAllocated[_investor].sub(_tokenAmt);
    bonusTokensAllocated[_investor] = bonusTokensAllocated[_investor].sub(_bonusTokenAmt);


    uint totalRefundTokens = _tokenAmt.add(_bonusTokenAmt);

    if (status == State.Active) {
      //Refunded tokens go back to sale pool
      totalTokensAllocated = totalTokensAllocated.sub(totalRefundTokens);
    }

    _investor.transfer(_refundAmt);

    Refunded(_investor, _refundAmt);
  }

  //Used by investor to claim token
    function claimTokens() external {
      require(hasEnded());
      require(addressKYC[msg.sender]);
      address tokenReceiver = msg.sender;
      uint tokensToClaim = getTotalNormalTokensByAddress(tokenReceiver);

      require(tokensToClaim > 0);
      _clearTotalNormalTokensByAddress(tokenReceiver);

      violaToken.transferFrom(owner, tokenReceiver, tokensToClaim);

      TokenDistributed(tokenReceiver, tokensToClaim);

    }

    //Used by investor to claim bonus token
    function claimBonusTokens() external {
      require(hasEnded());
      require(now >= bonusVestingPeriod);
      require(addressKYC[msg.sender]);

      address tokenReceiver = msg.sender;
      uint tokensToClaim = getTotalBonusTokensByAddress(tokenReceiver);

      require(tokensToClaim > 0);
      _clearTotalBonusTokensByAddress(tokenReceiver);

      violaToken.transferFrom(owner, tokenReceiver, tokensToClaim);

      BonusTokenDistributed(tokenReceiver, tokensToClaim);
    }

    //Used by owner to distribute bonus token
    function distributeBonusTokens(address _tokenReceiver) onlyOwner external {
      require(hasEnded());
      require(now >= bonusVestingPeriod);

      address tokenReceiver = _tokenReceiver;
      uint tokensToClaim = getTotalBonusTokensByAddress(tokenReceiver);

      require(tokensToClaim > 0);
      _clearTotalBonusTokensByAddress(tokenReceiver);

      transferTokens(tokenReceiver, tokensToClaim);

      BonusTokenDistributed(tokenReceiver,tokensToClaim);

    }

    //Used by owner to distribute token
    function distributeICOTokens(address _tokenReceiver) onlyOwner external {
      require(hasEnded());

      address tokenReceiver = _tokenReceiver;
      uint tokensToClaim = getTotalNormalTokensByAddress(tokenReceiver);

      require(tokensToClaim > 0);
      _clearTotalNormalTokensByAddress(tokenReceiver);

      transferTokens(tokenReceiver, tokensToClaim);

      TokenDistributed(tokenReceiver,tokensToClaim);

    }

    //For owner to reserve token for presale
    // function reserveTokens(uint _amount) onlyOwner external {

    //   require(getTokensLeft() >= _amount);
    //   totalTokensAllocated = totalTokensAllocated.add(_amount);
    //   totalReservedTokenAllocated = totalReservedTokenAllocated.add(_amount);

    // }

    // //To distribute tokens not allocated by crowdsale contract
    // function distributePresaleTokens(address _tokenReceiver, uint _amount) onlyOwner external {
    //   require(hasEnded());
    //   require(_tokenReceiver != address(0));
    //   require(_amount > 0);

    //   violaToken.transferFrom(owner, _tokenReceiver, _amount);

    //   TokenDistributed(_tokenReceiver,_amount);

    // }

    //For external purchases & pre-sale via btc/fiat
    function externalPurchaseTokens(address _investor, uint _amount, uint _bonusAmount) onlyOwner external {
      require(_amount > 0);
      uint256 totalTokensToAllocate = _amount.add(_bonusAmount);

      require(getTokensLeft() >= totalTokensToAllocate);
      totalTokensAllocated = totalTokensAllocated.add(totalTokensToAllocate);
      totalReservedTokenAllocated = totalReservedTokenAllocated.add(totalTokensToAllocate);

      externalTokensAllocated[_investor] = externalTokensAllocated[_investor].add(_amount);
      externalBonusTokensAllocated[_investor] = externalBonusTokensAllocated[_investor].add(_bonusAmount);
      
      ExternalTokenPurchase(_investor,  _amount, _bonusAmount);

    }

    function refundAllExternalPurchase(address _investor) onlyOwner external {
      require(_investor != address(0));
      require(externalTokensAllocated[_investor] > 0);

      uint externalTokens = externalTokensAllocated[_investor];
      uint externalBonusTokens = externalBonusTokensAllocated[_investor];

      externalTokensAllocated[_investor] = 0;
      externalBonusTokensAllocated[_investor] = 0;

      uint totalInvestorTokens = externalTokens.add(externalBonusTokens);

      totalReservedTokenAllocated = totalReservedTokenAllocated.sub(totalInvestorTokens);
      totalTokensAllocated = totalTokensAllocated.sub(totalInvestorTokens);

      ExternalPurchaseRefunded(_investor,externalTokens,externalBonusTokens);
    }

    function refundExternalPurchase(address _investor, uint _amountToRefund, uint _bonusAmountToRefund) onlyOwner external {
      require(_investor != address(0));
      require(externalTokensAllocated[_investor] >= _amountToRefund);
      require(externalBonusTokensAllocated[_investor] >= _bonusAmountToRefund);

      uint totalTokensToRefund = _amountToRefund.add(_bonusAmountToRefund);
      externalTokensAllocated[_investor] = externalTokensAllocated[_investor].sub(_amountToRefund);
      externalBonusTokensAllocated[_investor] = externalBonusTokensAllocated[_investor].sub(_bonusAmountToRefund);

      totalReservedTokenAllocated = totalReservedTokenAllocated.sub(totalTokensToRefund);
      totalTokensAllocated = totalTokensAllocated.sub(totalTokensToRefund);

      ExternalPurchaseRefunded(_investor,_amountToRefund,_bonusAmountToRefund);
    }

    function _clearAddressFromCrowdsale(address _investor) internal {
      tokensAllocated[_investor] = 0;
      bonusTokensAllocated[_investor] = 0;
      investedSum[_investor] = 0;
      maxBuyCap[_investor] = 0;
    }

    function allocateTopupToken(address _investor, uint _amount, uint _bonusAmount) onlyOwner external {
      require(hasEnded());
      require(_amount > 0);
      uint256 tokensToAllocate = _amount.add(_bonusAmount);

      require(getTokensLeft() >= tokensToAllocate);
      totalTokensAllocated = totalTokensAllocated.add(_amount);

      tokensAllocated[_investor] = tokensAllocated[_investor].add(_amount);
      bonusTokensAllocated[_investor] = bonusTokensAllocated[_investor].add(_bonusAmount);

      TopupTokenAllocated(_investor,  _amount, _bonusAmount);
    }

  //For cases where token are mistakenly sent / airdrops
  function emergencyERC20Drain( ERC20 token, uint amount ) external onlyOwner {
    require(status == State.Completed);
    token.transfer(owner,amount);
  }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"withinPeriod","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusTokenRateLevelThree","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusTokenRateLevelTwo","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_kycAddress","type":"address"}],"name":"approveKYC","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"addressKYC","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amountToTransfer","type":"uint256"}],"name":"partialForwardFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"bonusTokensAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"status","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"endCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setBonusTokenRateLevelOne","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"endTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_bonusAmount","type":"uint256"}],"name":"externalPurchaseTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"externalTokensAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_kycAddress","type":"address"}],"name":"revokeKYC","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_investor","type":"address"}],"name":"getTotalNormalTokensByAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"completeCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_amountToRefund","type":"uint256"},{"name":"_bonusAmountToRefund","type":"uint256"}],"name":"refundExternalPurchase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_bonusAmount","type":"uint256"}],"name":"allocateTopupToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_minWeiToPurchase","type":"uint256"}],"name":"setMinWeiToPurchase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTimeBasedBonusRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minWeiToPurchase","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenReceiver","type":"address"}],"name":"distributeBonusTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"burnExtraTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpauseCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_investor","type":"address"}],"name":"getTotalBonusTokensByAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"registeredAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"violaToken","outputs":[{"name":"","type":"address"}],"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":"_tokenBuffer","type":"uint256"}],"name":"setLeftoverTokensBuffer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bonusTokenRateLevelFour","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":"","type":"address"}],"name":"investedSum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setBonusTokenRateLevelFour","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenReceiver","type":"address"}],"name":"distributeICOTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"leftoverTokensBuffer","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setBonusTokenRateLevelThree","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"startCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pauseCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"}],"name":"refundAllExternalPurchase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokensAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"maxBuyCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalApprovedAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalReservedTokenAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"}],"name":"removeWhitelistAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bonusTokenRateLevelOne","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTokensAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_refundAmt","type":"uint256"},{"name":"_tokenAmt","type":"uint256"},{"name":"_bonusTokenAmt","type":"uint256"}],"name":"refundPartial","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint256"},{"name":"_rate","type":"uint256"},{"name":"_tokenAddress","type":"address"},{"name":"_wallet","type":"address"}],"name":"initialiseCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}],"name":"emergencyERC20Drain","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTokensLeft","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"externalBonusTokensAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimBonusTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bonusVestingPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"hasEnded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_investor","type":"address"}],"name":"getTotalTokensByAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setBonusTokenRateLevelTwo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_cap","type":"uint256"}],"name":"setWhitelistAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"bonusAmount","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"bonusAmount","type":"uint256"}],"name":"ExternalTokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"bonusAmount","type":"uint256"}],"name":"ExternalPurchaseRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenReceiver","type":"address"},{"indexed":false,"name":"tokenAmount","type":"uint256"}],"name":"TokenDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenReceiver","type":"address"},{"indexed":false,"name":"tokenAmount","type":"uint256"}],"name":"BonusTokenDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenReceiver","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"bonusAmount","type":"uint256"}],"name":"TopupTokenAllocated","type":"event"},{"anonymous":false,"inputs":[],"name":"CrowdsalePending","type":"event"},{"anonymous":false,"inputs":[],"name":"CrowdsaleStarted","type":"event"},{"anonymous":false,"inputs":[],"name":"CrowdsaleEnded","type":"event"},{"anonymous":false,"inputs":[],"name":"BonusRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

606060405260008060146101000a81548160ff0219169083600581111561002257fe5b02179055506000600a55624f1a00600d556014601155600f601255600a6013556000601455336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614d08806100966000396000f3006060604052600436106102e0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063063575de146102eb578063083ab393146103185780630b8440ec146103415780630e27324d1461036a578063123a8708146103a357806317038cb2146103f4578063185d84c014610417578063200d2ed2146104645780632095f2d41461049b5780632493a2f2146104b05780632c4e722e146104d35780633197cbb6146104fc57806334fcf437146105255780633762346b1461054857806337e931bc1461059357806339ba645b146105e05780633b90176f146106195780633cbf41d21461066657806343f99e681461067b578063489979a3146106c657806348c54b9d146107115780634921e1471461072657806351ac0d1014610749578063521eb2731461077257806366ce5c52146107c757806367d6bcbf146107f057806368fad5041461082957806372d9b86f1461083e5780637321a17b146108535780637489f085146108a057806378a832321461090357806378e9792514610958578063827bc64b1461098157806384e9ec37146109a45780638da5cb5b146109cd5780638deb47ad14610a22578063921200ed14610a6f578063991cc28314610a925780639c0e7d6614610acb5780639ef48a3114610af4578063a39953b214610b17578063a8351c0314610b2c578063ab3a32c414610b41578063ae1133de14610b7a578063b04cd13414610bc7578063b420029414610c14578063b494f1fb14610c3d578063b7ecbaae14610c66578063b9fbe33114610c9f578063c07f773a14610cc8578063c17281d014610cf1578063cab067c014610d45578063db0e16f114610daf578063de5f986614610df1578063e25cdab714610e1a578063e28d8c4b14610e67578063e866563814610e7c578063ecb70fb714610ea5578063f2fde38b14610ed2578063f581308514610f0b578063f9a7c90614610f58578063fc43bbfb14610f7b575b6102e933610fbd565b005b34156102f657600080fd5b6102fe61101f565b604051808215151515815260200191505060405180910390f35b341561032357600080fd5b61032b61103a565b6040518082815260200191505060405180910390f35b341561034c57600080fd5b610354611040565b6040518082815260200191505060405180910390f35b341561037557600080fd5b6103a1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611046565b005b34156103ae57600080fd5b6103da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611198565b604051808215151515815260200191505060405180910390f35b34156103ff57600080fd5b61041560048080359060200190919050506111b8565b005b341561042257600080fd5b61044e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506112d7565b6040518082815260200191505060405180910390f35b341561046f57600080fd5b6104776112ef565b6040518082600581111561048757fe5b60ff16815260200191505060405180910390f35b34156104a657600080fd5b6104ae611302565b005b34156104bb57600080fd5b6104d160048080359060200190919050506113fe565b005b34156104de57600080fd5b6104e661148f565b6040518082815260200191505060405180910390f35b341561050757600080fd5b61050f611495565b6040518082815260200191505060405180910390f35b341561053057600080fd5b610546600480803590602001909190505061149b565b005b341561055357600080fd5b610591600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001909190505061150f565b005b341561059e57600080fd5b6105ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611762565b6040518082815260200191505060405180910390f35b34156105eb57600080fd5b610617600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061177a565b005b341561062457600080fd5b610650600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118df565b6040518082815260200191505060405180910390f35b341561067157600080fd5b610679611979565b005b341561068657600080fd5b6106c4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091908035906020019091905050611b7b565b005b34156106d157600080fd5b61070f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091908035906020019091905050611e81565b005b341561071c57600080fd5b6107246120cc565b005b341561073157600080fd5b61074760048080359060200190919050506122f0565b005b341561075457600080fd5b61075c612355565b6040518082815260200191505060405180910390f35b341561077d57600080fd5b61078561241c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107d257600080fd5b6107da612442565b6040518082815260200191505060405180910390f35b34156107fb57600080fd5b610827600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612448565b005b341561083457600080fd5b61083c61254d565b005b341561084957600080fd5b610851612941565b005b341561085e57600080fd5b61088a600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506129f6565b6040518082815260200191505060405180910390f35b34156108ab57600080fd5b6108c16004808035906020019091905050612a90565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561090e57600080fd5b610916612acf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561096357600080fd5b61096b612af5565b6040518082815260200191505060405180910390f35b341561098c57600080fd5b6109a26004808035906020019091905050612afb565b005b34156109af57600080fd5b6109b7612b85565b6040518082815260200191505060405180910390f35b34156109d857600080fd5b6109e0612b8b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a2d57600080fd5b610a59600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612bb0565b6040518082815260200191505060405180910390f35b3415610a7a57600080fd5b610a906004808035906020019091905050612bc8565b005b3415610a9d57600080fd5b610ac9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c59565b005b3415610ad657600080fd5b610ade612d4d565b6040518082815260200191505060405180910390f35b3415610aff57600080fd5b610b156004808035906020019091905050612d53565b005b3415610b2257600080fd5b610b2a612de4565b005b3415610b3757600080fd5b610b3f612ef1565b005b3415610b4c57600080fd5b610b78600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612fa6565b005b3415610b8557600080fd5b610bb1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613245565b6040518082815260200191505060405180910390f35b3415610bd257600080fd5b610bfe600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061325d565b6040518082815260200191505060405180910390f35b3415610c1f57600080fd5b610c27613275565b6040518082815260200191505060405180910390f35b3415610c4857600080fd5b610c5061327b565b6040518082815260200191505060405180910390f35b3415610c7157600080fd5b610c9d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613281565b005b3415610caa57600080fd5b610cb26133b8565b6040518082815260200191505060405180910390f35b3415610cd357600080fd5b610cdb6133be565b6040518082815260200191505060405180910390f35b3415610cfc57600080fd5b610d43600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919080359060200190919080359060200190919050506133c4565b005b3415610d5057600080fd5b610dad600480803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506137c0565b005b3415610dba57600080fd5b610def600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506139d7565b005b3415610dfc57600080fd5b610e04613b51565b6040518082815260200191505060405180910390f35b3415610e2557600080fd5b610e51600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613ca1565b6040518082815260200191505060405180910390f35b3415610e7257600080fd5b610e7a613cb9565b005b3415610e8757600080fd5b610e8f613eee565b6040518082815260200191505060405180910390f35b3415610eb057600080fd5b610eb8613ef4565b604051808215151515815260200191505060405180910390f35b3415610edd57600080fd5b610f09600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613f38565b005b3415610f1657600080fd5b610f42600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061408d565b6040518082815260200191505060405180910390f35b3415610f6357600080fd5b610f7960048080359060200190919050506140b9565b005b3415610f8657600080fd5b610fbb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061414a565b005b600060026005811115610fcc57fe5b600060149054906101000a900460ff166005811115610fe757fe5b141515610ff357600080fd5b600f54341015151561100457600080fd5b349050611011828261429b565b61101b82826143de565b5050565b6000600b5442101580156110355750600c544211155b905090565b60135481565b60125481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110a357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156110df57600080fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061118e81600a5461461490919063ffffffff16565b600a819055505050565b60036020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121357600080fd5b6004600581111561122057fe5b600060149054906101000a900460ff16600581111561123b57fe5b14151561124757600080fd5b600a548110151561125757600080fd5b61126c81600a5461463290919063ffffffff16565b600a81905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156112d457600080fd5b50565b60076020528060005260406000206000915090505481565b600060149054906101000a900460ff1681565b61130a61464b565b151561136c576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561136b57600080fd5b5b6002600581111561137957fe5b600060149054906101000a900460ff16600581111561139457fe5b1415156113a057600080fd5b624f1a004201600d819055506004600060146101000a81548160ff021916908360058111156113cb57fe5b02179055507fd499d29ff9f7facc77232f25dece0ab9dff206faee2228931a6943fb45707d7460405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145957600080fd5b806011819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b60105481565b600c5481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114f657600080fd5b60008111151561150557600080fd5b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561156c57600080fd5b60008311151561157b57600080fd5b61158e828461461490919063ffffffff16565b905080611599613b51565b101515156115a657600080fd5b6115bb8160155461461490919063ffffffff16565b6015819055506115d68160165461461490919063ffffffff16565b60168190555061162e83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506116c382600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167f0923390e595bc62f1a7afe42725e5bb526f690f2f8badb25ce12e525472d68888484604051808381526020018281526020019250505060405180910390a250505050565b60066020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117d757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561181357600080fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506118c281600a5461463290919063ffffffff16565b600a8190555060008111156118db576118da82614670565b5b5050565b6000611972600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119d457600080fd5b6119dc613ef4565b15156119e757600080fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515611b0357600080fd5b6102c65a03f11515611b1457600080fd5b50505060405180519050141515611b2a57600080fd5b6005600060146101000a81548160ff02191690836005811115611b4957fe5b0217905550611b5661483d565b60003073ffffffffffffffffffffffffffffffffffffffff1631141515611b7957fe5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bd857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515611c1457600080fd5b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611c6257600080fd5b81600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611cb057600080fd5b611cc3828461461490919063ffffffff16565b9050611d1783600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611dac82600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e048160165461463290919063ffffffff16565b601681905550611e1f8160155461463290919063ffffffff16565b6015819055508373ffffffffffffffffffffffffffffffffffffffff167f970dddbfaeeb6347318f1a4b7c03a8ec6e0f99acecd7cbe866303eb1254836e28484604051808381526020018281526020019250505060405180910390a250505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ede57600080fd5b611ee6613ef4565b1515611ef157600080fd5b600083111515611f0057600080fd5b611f13828461461490919063ffffffff16565b905080611f1e613b51565b10151515611f2b57600080fd5b611f408360155461461490919063ffffffff16565b601581905550611f9883600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202d82600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167f75c8b83c19331020aeddea4bf94aff9b29a6215c70f4ab00473e1d583794001b8484604051808381526020018281526020019250505060405180910390a250505050565b6000806120d7613ef4565b15156120e257600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561213a57600080fd5b339150612146826118df565b905060008111151561215757600080fd5b612160826148b8565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561228257600080fd5b6102c65a03f1151561229357600080fd5b50505060405180519050508173ffffffffffffffffffffffffffffffffffffffff167ff6f55ada4fbb9e2bc6813f97e749a30067f3c13a200ce783269b50e6419e8f64826040518082815260200191505060405180910390a25050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561234b57600080fd5b80600f8190555050565b6000806000806000600b544210158015612376575062015180600b54014211155b935062015180600b54014211801561239557506203f480600b54014211155b92506203f480600b5401421180156123b45750620d2f00600b54014211155b9150620d2f00600b5401421180156123ce5750600c544211155b905083156123e0576011549450612415565b82156123f0576012549450612415565b8115612400576013549450612415565b8015612410576014549450612415565b600094505b5050505090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124a657600080fd5b6124ae613ef4565b15156124b957600080fd5b600d5442101515156124ca57600080fd5b8291506124d6826129f6565b90506000811115156124e757600080fd5b6124f082614945565b6124fa82826149d2565b8173ffffffffffffffffffffffffffffffffffffffff167f160df65e77825f234b36cd56fa84256d633fc5ce97380cebf2386224c52c6907826040518082815260200191505060405180910390a2505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125aa57600080fd5b6125b2613ef4565b15156125bd57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156126d757600080fd5b6102c65a03f115156126e857600080fd5b505050604051805190509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc67906000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15156127e257600080fd5b6102c65a03f115156127f357600080fd5b50505060405180519050506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561291a57600080fd5b6102c65a03f1151561292b57600080fd5b5050506040518051905014151561293e57fe5b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561299c57600080fd5b600360058111156129a957fe5b600060149054906101000a900460ff1660058111156129c457fe5b1415156129d057600080fd5b6002600060146101000a81548160ff021916908360058111156129ef57fe5b0217905550565b6000612a89600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b9050919050565b600981815481101515612a9f57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b5657600080fd5b600081111515612b6557600080fd5b80612b6e613b51565b10151515612b7b57600080fd5b8060178190555050565b60145481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60046020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c2357600080fd5b806014819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cb757600080fd5b612cbf613ef4565b1515612cca57600080fd5b829150612cd6826118df565b9050600081111515612ce757600080fd5b612cf0826148b8565b612cfa82826149d2565b8173ffffffffffffffffffffffffffffffffffffffff167ff6f55ada4fbb9e2bc6813f97e749a30067f3c13a200ce783269b50e6419e8f64826040518082815260200191505060405180910390a2505050565b60175481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612dae57600080fd5b806013819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b612dec61101f565b1515612df757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515612e5557600080fd5b6000612e5f613b51565b111515612e6b57600080fd5b60016005811115612e7857fe5b600060149054906101000a900460ff166005811115612e9357fe5b141515612e9f57600080fd5b6002600060146101000a81548160ff02191690836005811115612ebe57fe5b02179055507f4722e6c4579996b373f4de030a1847ddba1df215e3fc5388223a9873d563e7ef60405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612f4c57600080fd5b60026005811115612f5957fe5b600060149054906101000a900460ff166005811115612f7457fe5b141515612f8057600080fd5b6003600060146101000a81548160ff02191690836005811115612f9f57fe5b0217905550565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561300657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561304257600080fd5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561309057600080fd5b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131b1828461461490919063ffffffff16565b90506131c88160165461463290919063ffffffff16565b6016819055506131e38160155461463290919063ffffffff16565b6015819055508373ffffffffffffffffffffffffffffffffffffffff167f970dddbfaeeb6347318f1a4b7c03a8ec6e0f99acecd7cbe866303eb1254836e28484604051808381526020018281526020019250505060405180910390a250505050565b60056020528060005260406000206000915090505481565b60026020528060005260406000206000915090505481565b600a5481565b60165481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156132de57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561331a57600080fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156133b4576133b382614670565b5b5050565b60115481565b60155481565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561342257600080fd5b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150848211151561347257600080fd5b83600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115156134bf57600080fd5b82600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561350c57600080fd5b61355e85600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135f384600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061368883600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136de838561461490919063ffffffff16565b9050600260058111156136ed57fe5b600060149054906101000a900460ff16600581111561370857fe5b141561372a576137238160155461463290919063ffffffff16565b6015819055505b8573ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050151561376a57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d0651866040518082815260200191505060405180910390a2505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561381b57600080fd5b6000600581111561382857fe5b600060149054906101000a900460ff16600581111561384357fe5b14151561384f57600080fd5b42841015151561385e57600080fd5b60008311151561386d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156138a957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156138e557600080fd5b83600b8190555062278d008401600c819055508260108190555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600060146101000a81548160ff021916908360058111156139a057fe5b02179055507ffd25b305b4ec040a79a72abbc43d24ff5d3aee83f1d425e0e22f8ffdee016ad460405160405180910390a150505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613a3257600080fd5b600580811115613a3e57fe5b600060149054906101000a900460ff166005811115613a5957fe5b141515613a6557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515613b3157600080fd5b6102c65a03f11515613b4257600080fd5b50505060405180519050505050565b6000613c9c601554600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515613c7357600080fd5b6102c65a03f11515613c8457600080fd5b5050506040518051905061463290919063ffffffff16565b905090565b60086020528060005260406000206000915090505481565b600080613cc4613ef4565b1515613ccf57600080fd5b600d544210151515613ce057600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515613d3857600080fd5b339150613d44826129f6565b9050600081111515613d5557600080fd5b613d5e82614945565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515613e8057600080fd5b6102c65a03f11515613e9157600080fd5b50505060405180519050508173ffffffffffffffffffffffffffffffffffffffff167f160df65e77825f234b36cd56fa84256d633fc5ce97380cebf2386224c52c6907826040518082815260200191505060405180910390a25050565b600d5481565b600060046005811115613f0357fe5b600060149054906101000a900460ff166005811115613f1e57fe5b1415613f2d5760019050613f35565b600c54421190505b90565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613f9357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613fcf57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006140b261409b836129f6565b6140a4846118df565b61461490919063ffffffff16565b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561411457600080fd5b806012819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156141a557600080fd5b6000811115156141b457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156141f057600080fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600980548060010182816142489190614c8b565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101515156142ee57600080fd5b614301828261463290919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061439682600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b60008060006143f860105485614b1e90919063ffffffff16565b9250614427606461441961440a612355565b86614b1e90919063ffffffff16565b614b5990919063ffffffff16565b915061443c828461461490919063ffffffff16565b905080614447613b51565b1015151561445457600080fd5b6144698160155461461490919063ffffffff16565b6015819055506144c183600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061455682600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145a161464b565b156145af576145ae611302565b5b8473ffffffffffffffffffffffffffffffffffffffff167f347f5f0051b895093800553e6e78ef332849e2552639a4f5ffe66535788ae07885858560405180848152602001838152602001828152602001935050505060405180910390a25050505050565b600080828401905083811015151561462857fe5b8091505092915050565b600082821115151561464057fe5b818303905092915050565b6000601754614658613b51565b111515614668576001905061466d565b600090505b90565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506000821115156146c457600080fd5b614755600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b90506002600581111561476457fe5b600060149054906101000a900460ff16600581111561477f57fe5b14156147a15761479a8160155461463290919063ffffffff16565b6015819055505b6147aa83614b74565b8273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156147ea57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d0651836040518082815260200191505060405180910390a2505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015156148b657600080fd5b565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515614af457600080fd5b6102c65a03f11515614b0557600080fd5b505050604051805190501515614b1a57600080fd5b5050565b6000806000841415614b335760009150614b52565b8284029050828482811515614b4457fe5b04141515614b4e57fe5b8091505b5092915050565b6000808284811515614b6757fe5b0490508091505092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b815481835581811511614cb257818360005260206000209182019101614cb19190614cb7565b5b505050565b614cd991905b80821115614cd5576000816000905550600101614cbd565b5090565b905600a165627a7a723058205db8e40549bfc3fcbc97e2befcb3a7476092927487958256753b0b91951246e90029

Deployed Bytecode

0x6060604052600436106102e0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063063575de146102eb578063083ab393146103185780630b8440ec146103415780630e27324d1461036a578063123a8708146103a357806317038cb2146103f4578063185d84c014610417578063200d2ed2146104645780632095f2d41461049b5780632493a2f2146104b05780632c4e722e146104d35780633197cbb6146104fc57806334fcf437146105255780633762346b1461054857806337e931bc1461059357806339ba645b146105e05780633b90176f146106195780633cbf41d21461066657806343f99e681461067b578063489979a3146106c657806348c54b9d146107115780634921e1471461072657806351ac0d1014610749578063521eb2731461077257806366ce5c52146107c757806367d6bcbf146107f057806368fad5041461082957806372d9b86f1461083e5780637321a17b146108535780637489f085146108a057806378a832321461090357806378e9792514610958578063827bc64b1461098157806384e9ec37146109a45780638da5cb5b146109cd5780638deb47ad14610a22578063921200ed14610a6f578063991cc28314610a925780639c0e7d6614610acb5780639ef48a3114610af4578063a39953b214610b17578063a8351c0314610b2c578063ab3a32c414610b41578063ae1133de14610b7a578063b04cd13414610bc7578063b420029414610c14578063b494f1fb14610c3d578063b7ecbaae14610c66578063b9fbe33114610c9f578063c07f773a14610cc8578063c17281d014610cf1578063cab067c014610d45578063db0e16f114610daf578063de5f986614610df1578063e25cdab714610e1a578063e28d8c4b14610e67578063e866563814610e7c578063ecb70fb714610ea5578063f2fde38b14610ed2578063f581308514610f0b578063f9a7c90614610f58578063fc43bbfb14610f7b575b6102e933610fbd565b005b34156102f657600080fd5b6102fe61101f565b604051808215151515815260200191505060405180910390f35b341561032357600080fd5b61032b61103a565b6040518082815260200191505060405180910390f35b341561034c57600080fd5b610354611040565b6040518082815260200191505060405180910390f35b341561037557600080fd5b6103a1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611046565b005b34156103ae57600080fd5b6103da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611198565b604051808215151515815260200191505060405180910390f35b34156103ff57600080fd5b61041560048080359060200190919050506111b8565b005b341561042257600080fd5b61044e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506112d7565b6040518082815260200191505060405180910390f35b341561046f57600080fd5b6104776112ef565b6040518082600581111561048757fe5b60ff16815260200191505060405180910390f35b34156104a657600080fd5b6104ae611302565b005b34156104bb57600080fd5b6104d160048080359060200190919050506113fe565b005b34156104de57600080fd5b6104e661148f565b6040518082815260200191505060405180910390f35b341561050757600080fd5b61050f611495565b6040518082815260200191505060405180910390f35b341561053057600080fd5b610546600480803590602001909190505061149b565b005b341561055357600080fd5b610591600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001909190505061150f565b005b341561059e57600080fd5b6105ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611762565b6040518082815260200191505060405180910390f35b34156105eb57600080fd5b610617600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061177a565b005b341561062457600080fd5b610650600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118df565b6040518082815260200191505060405180910390f35b341561067157600080fd5b610679611979565b005b341561068657600080fd5b6106c4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091908035906020019091905050611b7b565b005b34156106d157600080fd5b61070f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091908035906020019091905050611e81565b005b341561071c57600080fd5b6107246120cc565b005b341561073157600080fd5b61074760048080359060200190919050506122f0565b005b341561075457600080fd5b61075c612355565b6040518082815260200191505060405180910390f35b341561077d57600080fd5b61078561241c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107d257600080fd5b6107da612442565b6040518082815260200191505060405180910390f35b34156107fb57600080fd5b610827600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612448565b005b341561083457600080fd5b61083c61254d565b005b341561084957600080fd5b610851612941565b005b341561085e57600080fd5b61088a600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506129f6565b6040518082815260200191505060405180910390f35b34156108ab57600080fd5b6108c16004808035906020019091905050612a90565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561090e57600080fd5b610916612acf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561096357600080fd5b61096b612af5565b6040518082815260200191505060405180910390f35b341561098c57600080fd5b6109a26004808035906020019091905050612afb565b005b34156109af57600080fd5b6109b7612b85565b6040518082815260200191505060405180910390f35b34156109d857600080fd5b6109e0612b8b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a2d57600080fd5b610a59600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612bb0565b6040518082815260200191505060405180910390f35b3415610a7a57600080fd5b610a906004808035906020019091905050612bc8565b005b3415610a9d57600080fd5b610ac9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612c59565b005b3415610ad657600080fd5b610ade612d4d565b6040518082815260200191505060405180910390f35b3415610aff57600080fd5b610b156004808035906020019091905050612d53565b005b3415610b2257600080fd5b610b2a612de4565b005b3415610b3757600080fd5b610b3f612ef1565b005b3415610b4c57600080fd5b610b78600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612fa6565b005b3415610b8557600080fd5b610bb1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613245565b6040518082815260200191505060405180910390f35b3415610bd257600080fd5b610bfe600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061325d565b6040518082815260200191505060405180910390f35b3415610c1f57600080fd5b610c27613275565b6040518082815260200191505060405180910390f35b3415610c4857600080fd5b610c5061327b565b6040518082815260200191505060405180910390f35b3415610c7157600080fd5b610c9d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613281565b005b3415610caa57600080fd5b610cb26133b8565b6040518082815260200191505060405180910390f35b3415610cd357600080fd5b610cdb6133be565b6040518082815260200191505060405180910390f35b3415610cfc57600080fd5b610d43600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919080359060200190919080359060200190919050506133c4565b005b3415610d5057600080fd5b610dad600480803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506137c0565b005b3415610dba57600080fd5b610def600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506139d7565b005b3415610dfc57600080fd5b610e04613b51565b6040518082815260200191505060405180910390f35b3415610e2557600080fd5b610e51600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613ca1565b6040518082815260200191505060405180910390f35b3415610e7257600080fd5b610e7a613cb9565b005b3415610e8757600080fd5b610e8f613eee565b6040518082815260200191505060405180910390f35b3415610eb057600080fd5b610eb8613ef4565b604051808215151515815260200191505060405180910390f35b3415610edd57600080fd5b610f09600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613f38565b005b3415610f1657600080fd5b610f42600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061408d565b6040518082815260200191505060405180910390f35b3415610f6357600080fd5b610f7960048080359060200190919050506140b9565b005b3415610f8657600080fd5b610fbb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061414a565b005b600060026005811115610fcc57fe5b600060149054906101000a900460ff166005811115610fe757fe5b141515610ff357600080fd5b600f54341015151561100457600080fd5b349050611011828261429b565b61101b82826143de565b5050565b6000600b5442101580156110355750600c544211155b905090565b60135481565b60125481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110a357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156110df57600080fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061118e81600a5461461490919063ffffffff16565b600a819055505050565b60036020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121357600080fd5b6004600581111561122057fe5b600060149054906101000a900460ff16600581111561123b57fe5b14151561124757600080fd5b600a548110151561125757600080fd5b61126c81600a5461463290919063ffffffff16565b600a81905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156112d457600080fd5b50565b60076020528060005260406000206000915090505481565b600060149054906101000a900460ff1681565b61130a61464b565b151561136c576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561136b57600080fd5b5b6002600581111561137957fe5b600060149054906101000a900460ff16600581111561139457fe5b1415156113a057600080fd5b624f1a004201600d819055506004600060146101000a81548160ff021916908360058111156113cb57fe5b02179055507fd499d29ff9f7facc77232f25dece0ab9dff206faee2228931a6943fb45707d7460405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145957600080fd5b806011819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b60105481565b600c5481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114f657600080fd5b60008111151561150557600080fd5b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561156c57600080fd5b60008311151561157b57600080fd5b61158e828461461490919063ffffffff16565b905080611599613b51565b101515156115a657600080fd5b6115bb8160155461461490919063ffffffff16565b6015819055506115d68160165461461490919063ffffffff16565b60168190555061162e83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506116c382600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167f0923390e595bc62f1a7afe42725e5bb526f690f2f8badb25ce12e525472d68888484604051808381526020018281526020019250505060405180910390a250505050565b60066020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117d757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561181357600080fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506118c281600a5461463290919063ffffffff16565b600a8190555060008111156118db576118da82614670565b5b5050565b6000611972600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119d457600080fd5b6119dc613ef4565b15156119e757600080fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515611b0357600080fd5b6102c65a03f11515611b1457600080fd5b50505060405180519050141515611b2a57600080fd5b6005600060146101000a81548160ff02191690836005811115611b4957fe5b0217905550611b5661483d565b60003073ffffffffffffffffffffffffffffffffffffffff1631141515611b7957fe5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bd857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515611c1457600080fd5b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611c6257600080fd5b81600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515611cb057600080fd5b611cc3828461461490919063ffffffff16565b9050611d1783600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611dac82600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e048160165461463290919063ffffffff16565b601681905550611e1f8160155461463290919063ffffffff16565b6015819055508373ffffffffffffffffffffffffffffffffffffffff167f970dddbfaeeb6347318f1a4b7c03a8ec6e0f99acecd7cbe866303eb1254836e28484604051808381526020018281526020019250505060405180910390a250505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ede57600080fd5b611ee6613ef4565b1515611ef157600080fd5b600083111515611f0057600080fd5b611f13828461461490919063ffffffff16565b905080611f1e613b51565b10151515611f2b57600080fd5b611f408360155461461490919063ffffffff16565b601581905550611f9883600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202d82600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167f75c8b83c19331020aeddea4bf94aff9b29a6215c70f4ab00473e1d583794001b8484604051808381526020018281526020019250505060405180910390a250505050565b6000806120d7613ef4565b15156120e257600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561213a57600080fd5b339150612146826118df565b905060008111151561215757600080fd5b612160826148b8565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561228257600080fd5b6102c65a03f1151561229357600080fd5b50505060405180519050508173ffffffffffffffffffffffffffffffffffffffff167ff6f55ada4fbb9e2bc6813f97e749a30067f3c13a200ce783269b50e6419e8f64826040518082815260200191505060405180910390a25050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561234b57600080fd5b80600f8190555050565b6000806000806000600b544210158015612376575062015180600b54014211155b935062015180600b54014211801561239557506203f480600b54014211155b92506203f480600b5401421180156123b45750620d2f00600b54014211155b9150620d2f00600b5401421180156123ce5750600c544211155b905083156123e0576011549450612415565b82156123f0576012549450612415565b8115612400576013549450612415565b8015612410576014549450612415565b600094505b5050505090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f5481565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156124a657600080fd5b6124ae613ef4565b15156124b957600080fd5b600d5442101515156124ca57600080fd5b8291506124d6826129f6565b90506000811115156124e757600080fd5b6124f082614945565b6124fa82826149d2565b8173ffffffffffffffffffffffffffffffffffffffff167f160df65e77825f234b36cd56fa84256d633fc5ce97380cebf2386224c52c6907826040518082815260200191505060405180910390a2505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125aa57600080fd5b6125b2613ef4565b15156125bd57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156126d757600080fd5b6102c65a03f115156126e857600080fd5b505050604051805190509050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc67906000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15156127e257600080fd5b6102c65a03f115156127f357600080fd5b50505060405180519050506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561291a57600080fd5b6102c65a03f1151561292b57600080fd5b5050506040518051905014151561293e57fe5b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561299c57600080fd5b600360058111156129a957fe5b600060149054906101000a900460ff1660058111156129c457fe5b1415156129d057600080fd5b6002600060146101000a81548160ff021916908360058111156129ef57fe5b0217905550565b6000612a89600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b9050919050565b600981815481101515612a9f57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b5657600080fd5b600081111515612b6557600080fd5b80612b6e613b51565b10151515612b7b57600080fd5b8060178190555050565b60145481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60046020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c2357600080fd5b806014819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cb757600080fd5b612cbf613ef4565b1515612cca57600080fd5b829150612cd6826118df565b9050600081111515612ce757600080fd5b612cf0826148b8565b612cfa82826149d2565b8173ffffffffffffffffffffffffffffffffffffffff167ff6f55ada4fbb9e2bc6813f97e749a30067f3c13a200ce783269b50e6419e8f64826040518082815260200191505060405180910390a2505050565b60175481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612dae57600080fd5b806013819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b612dec61101f565b1515612df757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515612e5557600080fd5b6000612e5f613b51565b111515612e6b57600080fd5b60016005811115612e7857fe5b600060149054906101000a900460ff166005811115612e9357fe5b141515612e9f57600080fd5b6002600060146101000a81548160ff02191690836005811115612ebe57fe5b02179055507f4722e6c4579996b373f4de030a1847ddba1df215e3fc5388223a9873d563e7ef60405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612f4c57600080fd5b60026005811115612f5957fe5b600060149054906101000a900460ff166005811115612f7457fe5b141515612f8057600080fd5b6003600060146101000a81548160ff02191690836005811115612f9f57fe5b0217905550565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561300657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561304257600080fd5b6000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561309057600080fd5b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131b1828461461490919063ffffffff16565b90506131c88160165461463290919063ffffffff16565b6016819055506131e38160155461463290919063ffffffff16565b6015819055508373ffffffffffffffffffffffffffffffffffffffff167f970dddbfaeeb6347318f1a4b7c03a8ec6e0f99acecd7cbe866303eb1254836e28484604051808381526020018281526020019250505060405180910390a250505050565b60056020528060005260406000206000915090505481565b60026020528060005260406000206000915090505481565b600a5481565b60165481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156132de57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561331a57600080fd5b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156133b4576133b382614670565b5b5050565b60115481565b60155481565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561342257600080fd5b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150848211151561347257600080fd5b83600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115156134bf57600080fd5b82600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411151561350c57600080fd5b61355e85600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135f384600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061368883600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461463290919063ffffffff16565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136de838561461490919063ffffffff16565b9050600260058111156136ed57fe5b600060149054906101000a900460ff16600581111561370857fe5b141561372a576137238160155461463290919063ffffffff16565b6015819055505b8573ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050151561376a57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d0651866040518082815260200191505060405180910390a2505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561381b57600080fd5b6000600581111561382857fe5b600060149054906101000a900460ff16600581111561384357fe5b14151561384f57600080fd5b42841015151561385e57600080fd5b60008311151561386d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156138a957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156138e557600080fd5b83600b8190555062278d008401600c819055508260108190555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600060146101000a81548160ff021916908360058111156139a057fe5b02179055507ffd25b305b4ec040a79a72abbc43d24ff5d3aee83f1d425e0e22f8ffdee016ad460405160405180910390a150505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613a3257600080fd5b600580811115613a3e57fe5b600060149054906101000a900460ff166005811115613a5957fe5b141515613a6557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515613b3157600080fd5b6102c65a03f11515613b4257600080fd5b50505060405180519050505050565b6000613c9c601554600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515613c7357600080fd5b6102c65a03f11515613c8457600080fd5b5050506040518051905061463290919063ffffffff16565b905090565b60086020528060005260406000206000915090505481565b600080613cc4613ef4565b1515613ccf57600080fd5b600d544210151515613ce057600080fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515613d3857600080fd5b339150613d44826129f6565b9050600081111515613d5557600080fd5b613d5e82614945565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515613e8057600080fd5b6102c65a03f11515613e9157600080fd5b50505060405180519050508173ffffffffffffffffffffffffffffffffffffffff167f160df65e77825f234b36cd56fa84256d633fc5ce97380cebf2386224c52c6907826040518082815260200191505060405180910390a25050565b600d5481565b600060046005811115613f0357fe5b600060149054906101000a900460ff166005811115613f1e57fe5b1415613f2d5760019050613f35565b600c54421190505b90565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613f9357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613fcf57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006140b261409b836129f6565b6140a4846118df565b61461490919063ffffffff16565b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561411457600080fd5b806012819055507f104241c2b0a9768a080af4cbdf561f874a8f36b9bfb26437f18255b5dd0eabaf60405160405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156141a557600080fd5b6000811115156141b457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156141f057600080fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600980548060010182816142489190614c8b565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101515156142ee57600080fd5b614301828261463290919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061439682600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b60008060006143f860105485614b1e90919063ffffffff16565b9250614427606461441961440a612355565b86614b1e90919063ffffffff16565b614b5990919063ffffffff16565b915061443c828461461490919063ffffffff16565b905080614447613b51565b1015151561445457600080fd5b6144698160155461461490919063ffffffff16565b6015819055506144c183600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061455682600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145a161464b565b156145af576145ae611302565b5b8473ffffffffffffffffffffffffffffffffffffffff167f347f5f0051b895093800553e6e78ef332849e2552639a4f5ffe66535788ae07885858560405180848152602001838152602001828152602001935050505060405180910390a25050505050565b600080828401905083811015151561462857fe5b8091505092915050565b600082821115151561464057fe5b818303905092915050565b6000601754614658613b51565b111515614668576001905061466d565b600090505b90565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506000821115156146c457600080fd5b614755600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461461490919063ffffffff16565b90506002600581111561476457fe5b600060149054906101000a900460ff16600581111561477f57fe5b14156147a15761479a8160155461463290919063ffffffff16565b6015819055505b6147aa83614b74565b8273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156147ea57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d0651836040518082815260200191505060405180910390a2505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015156148b657600080fd5b565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515614af457600080fd5b6102c65a03f11515614b0557600080fd5b505050604051805190501515614b1a57600080fd5b5050565b6000806000841415614b335760009150614b52565b8284029050828482811515614b4457fe5b04141515614b4e57fe5b8091505b5092915050565b6000808284811515614b6757fe5b0490508091505092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b815481835581811511614cb257818360005260206000209182019101614cb19190614cb7565b5b505050565b614cd991905b80821115614cd5576000816000905550600101614cbd565b5090565b905600a165627a7a723058205db8e40549bfc3fcbc97e2befcb3a7476092927487958256753b0b91951246e90029

Swarm Source

bzzr://5db8e40549bfc3fcbc97e2befcb3a7476092927487958256753b0b91951246e9

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.