ETH Price: $3,464.74 (+0.49%)

Token

DAY (DAY)
 

Overview

Max Total Supply

1,443,504.645584774246221168 DAY

Holders

3,330 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
309.569948506737017434 DAY

Value
$0.00
0x317337Ba03d96E68B100c3396682bfeaA0808A6F
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

ChronoLogic technology is used to create debt & innovative time-based smart contracts.

ICO Information

ICO Start Date : Aug 28, 2017 
ICO End Date : Sep 04, 2017
Hard Cap : 38,383 ETH
Raised : $7,400,000
ICO Price  : $12.654
Country : USA

# Exchange Pair Price  24H Volume % Volume

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x7268F9C2...31CE8E945
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
DayToken

Compiler Version
v0.4.16+commit.d7661dd9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2017-09-15
*/

pragma solidity ^0.4.13; 


////////////////// >>>>> Wallet Contract <<<<< ///////////////////


/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
/// @author Stefan George - <[email protected]>
contract MultiSigWallet {

    uint constant public MAX_OWNER_COUNT = 50;

    event Confirmation(address indexed sender, uint indexed transactionId);
    event Revocation(address indexed sender, uint indexed transactionId);
    event Submission(uint indexed transactionId);
    event Execution(uint indexed transactionId);
    event ExecutionFailure(uint indexed transactionId);
    event Deposit(address indexed sender, uint value);
    event OwnerAddition(address indexed owner);
    event OwnerRemoval(address indexed owner);
    event RequirementChange(uint required);

    mapping (uint => Transaction) public transactions;
    mapping (uint => mapping (address => bool)) public confirmations;
    mapping (address => bool) public isOwner;
    address[] public owners;
    uint public required;
    uint public transactionCount;

    struct Transaction {
        address destination;
        uint value;
        bytes data;
        bool executed;
    }

    modifier onlyWallet() {
        if (msg.sender != address(this))
            throw;
        _;
    }

    modifier ownerDoesNotExist(address owner) {
        if (isOwner[owner])
            throw;
        _;
    }

    modifier ownerExists(address owner) {
        if (!isOwner[owner])
            throw;
        _;
    }

    modifier transactionExists(uint transactionId) {
        if (transactions[transactionId].destination == 0)
            throw;
        _;
    }

    modifier confirmed(uint transactionId, address owner) {
        if (!confirmations[transactionId][owner])
            throw;
        _;
    }

    modifier notConfirmed(uint transactionId, address owner) {
        if (confirmations[transactionId][owner])
            throw;
        _;
    }

    modifier notExecuted(uint transactionId) {
        if (transactions[transactionId].executed)
            throw;
        _;
    }

    modifier notNull(address _address) {
        if (_address == 0)
            throw;
        _;
    }

    modifier validRequirement(uint ownerCount, uint _required) {
        if (   ownerCount > MAX_OWNER_COUNT
            || _required > ownerCount
            || _required == 0
            || ownerCount == 0)
            throw;
        _;
    }

    /// @dev Fallback function allows to deposit ether.
    function()
        payable
    {
        if (msg.value > 0)
            Deposit(msg.sender, msg.value);
    }

    /*
     * Public functions
     */
    /// @dev Contract constructor sets initial owners and required number of confirmations.
    /// @param _owners List of initial owners.
    /// @param _required Number of required confirmations.
    function MultiSigWallet(address[] _owners, uint _required)
        public
        validRequirement(_owners.length, _required)
    {
        for (uint i=0; i<_owners.length; i++) {
            if (isOwner[_owners[i]] || _owners[i] == 0)
                throw;
            isOwner[_owners[i]] = true;
        }
        owners = _owners;
        required = _required;
    }

    /// @dev Allows to add a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of new owner.
    function addOwner(address owner)
        public
        onlyWallet
        ownerDoesNotExist(owner)
        notNull(owner)
        validRequirement(owners.length + 1, required)
    {
        isOwner[owner] = true;
        owners.push(owner);
        OwnerAddition(owner);
    }

    /// @dev Allows to remove an owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner.
    function removeOwner(address owner)
        public
        onlyWallet
        ownerExists(owner)
    {
        isOwner[owner] = false;
        for (uint i=0; i<owners.length - 1; i++)
            if (owners[i] == owner) {
                owners[i] = owners[owners.length - 1];
                break;
            }
        owners.length -= 1;
        if (required > owners.length)
            changeRequirement(owners.length);
        OwnerRemoval(owner);
    }

    /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner to be replaced.
    /// @param owner Address of new owner.
    function replaceOwner(address owner, address newOwner)
        public
        onlyWallet
        ownerExists(owner)
        ownerDoesNotExist(newOwner)
    {
        for (uint i=0; i<owners.length; i++)
            if (owners[i] == owner) {
                owners[i] = newOwner;
                break;
            }
        isOwner[owner] = false;
        isOwner[newOwner] = true;
        OwnerRemoval(owner);
        OwnerAddition(newOwner);
    }

    /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
    /// @param _required Number of required confirmations.
    function changeRequirement(uint _required)
        public
        onlyWallet
        validRequirement(owners.length, _required)
    {
        required = _required;
        RequirementChange(_required);
    }

    /// @dev Allows an owner to submit and confirm a transaction.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function submitTransaction(address destination, uint value, bytes data)
        public
        returns (uint transactionId)
    {
        transactionId = addTransaction(destination, value, data);
        confirmTransaction(transactionId);
    }

    /// @dev Allows an owner to confirm a transaction.
    /// @param transactionId Transaction ID.
    function confirmTransaction(uint transactionId)
        public
        ownerExists(msg.sender)
        transactionExists(transactionId)
        notConfirmed(transactionId, msg.sender)
    {
        confirmations[transactionId][msg.sender] = true;
        Confirmation(msg.sender, transactionId);
        executeTransaction(transactionId);
    }

    /// @dev Allows an owner to revoke a confirmation for a transaction.
    /// @param transactionId Transaction ID.
    function revokeConfirmation(uint transactionId)
        public
        ownerExists(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        confirmations[transactionId][msg.sender] = false;
        Revocation(msg.sender, transactionId);
    }

    /// @dev Allows anyone to execute a confirmed transaction.
    /// @param transactionId Transaction ID.
    function executeTransaction(uint transactionId)
        public
        notExecuted(transactionId)
    {
        if (isConfirmed(transactionId)) {
            Transaction tx = transactions[transactionId];
            tx.executed = true;
            if (tx.destination.call.value(tx.value)(tx.data))
                Execution(transactionId);
            else {
                ExecutionFailure(transactionId);
                tx.executed = false;
            }
        }
    }

    /// @dev Returns the confirmation status of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Confirmation status.
    function isConfirmed(uint transactionId)
        public
        constant
        returns (bool)
    {
        uint count = 0;
        for (uint i=0; i<owners.length; i++) {
            if (confirmations[transactionId][owners[i]])
                count += 1;
            if (count == required)
                return true;
        }
    }

    /*
     * Internal functions
     */
    /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function addTransaction(address destination, uint value, bytes data)
        internal
        notNull(destination)
        returns (uint transactionId)
    {
        transactionId = transactionCount;
        transactions[transactionId] = Transaction({
            destination: destination,
            value: value,
            data: data,
            executed: false
        });
        transactionCount += 1;
        Submission(transactionId);
    }

    /*
     * Web3 call functions
     */
    /// @dev Returns number of confirmations of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Number of confirmations.
    function getConfirmationCount(uint transactionId)
        public
        constant
        returns (uint count)
    {
        for (uint i=0; i<owners.length; i++)
            if (confirmations[transactionId][owners[i]])
                count += 1;
    }

    /// @dev Returns total number of transactions after filers are applied.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Total number of transactions after filters are applied.
    function getTransactionCount(bool pending, bool executed)
        public
        constant
        returns (uint count)
    {
        for (uint i=0; i<transactionCount; i++)
            if (   pending && !transactions[i].executed
                || executed && transactions[i].executed)
                count += 1;
    }

    /// @dev Returns list of owners.
    /// @return List of owner addresses.
    function getOwners()
        public
        constant
        returns (address[])
    {
        return owners;
    }

    /// @dev Returns array with owner addresses, which confirmed transaction.
    /// @param transactionId Transaction ID.
    /// @return Returns array of owner addresses.
    function getConfirmations(uint transactionId)
        public
        constant
        returns (address[] _confirmations)
    {
        address[] memory confirmationsTemp = new address[](owners.length);
        uint count = 0;
        uint i;
        for (i=0; i<owners.length; i++)
            if (confirmations[transactionId][owners[i]]) {
                confirmationsTemp[count] = owners[i];
                count += 1;
            }
        _confirmations = new address[](count);
        for (i=0; i<count; i++)
            _confirmations[i] = confirmationsTemp[i];
    }

    /// @dev Returns list of transaction IDs in defined range.
    /// @param from Index start position of transaction array.
    /// @param to Index end position of transaction array.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Returns array of transaction IDs.
    function getTransactionIds(uint from, uint to, bool pending, bool executed)
        public
        constant
        returns (uint[] _transactionIds)
    {
        uint[] memory transactionIdsTemp = new uint[](transactionCount);
        uint count = 0;
        uint i;
        for (i=0; i<transactionCount; i++)
            if (   pending && !transactions[i].executed
                || executed && transactions[i].executed)
            {
                transactionIdsTemp[count] = i;
                count += 1;
            }
        _transactionIds = new uint[](to - from);
        for (i=from; i<to; i++)
            _transactionIds[i - from] = transactionIdsTemp[i];
    }
}


////////////////// >>>>> Library Contracts <<<<< ///////////////////


contract SafeMathLib {
  function safeMul(uint a, uint b) constant returns (uint) {
    uint c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }

  function safeSub(uint a, uint b) constant returns (uint) {
    assert(b <= a);
    return a - b;
  }

  function safeAdd(uint a, uint b) constant returns (uint) {
    uint c = a + b;
    assert(c>=a);
    return c;
  }
}




/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control 
 * functions, this simplifies the implementation of "user permissions". 
 */
contract Ownable {
  address public owner;
  address public newOwner;
  event OwnershipTransferred(address indexed _from, address indexed _to);
  /** 
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() {
    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) onlyOwner {
    newOwner = _newOwner;
  }

  function acceptOwnership() {
    require(msg.sender == newOwner);
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}


////////////////// >>>>> Token Contracts <<<<< ///////////////////

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20Basic {
  uint public totalSupply;
  function balanceOf(address _owner) constant returns (uint balance);
  function transfer(address _to, uint _value) returns (bool success);
  event Transfer(address indexed _from, address indexed _to, uint _value);
}


/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address _owner, address _spender) constant returns (uint remaining);
  function transferFrom(address _from, address _to, uint _value) returns (bool success);
  function approve(address _spender, uint _value) returns (bool success);
  event Approval(address indexed _owner, address indexed _spender, uint _value);
}



/**
 * Standard ERC20 token with Short Hand Attack and approve() race condition mitigation.
 *
 * Based on code by FirstBlood:
 * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, SafeMathLib {
  /* Token supply got increased and a new owner received these tokens */
  event Minted(address receiver, uint amount);

  /* Actual balances of token holders */
  mapping(address => uint) balances;

  /* approve() allowances */
  mapping (address => mapping (address => uint)) allowed;

  function transfer(address _to, uint _value) returns (bool success) {
    if (balances[msg.sender] >= _value 
        && _value > 0 
        && balances[_to] + _value > balances[_to]
        ) {
      balances[msg.sender] = safeSub(balances[msg.sender],_value);
      balances[_to] = safeAdd(balances[_to],_value);
      Transfer(msg.sender, _to, _value);
      return true;
    }
    else{
      return false;
    }
    
  }

  function transferFrom(address _from, address _to, uint _value) returns (bool success) {
    uint _allowance = allowed[_from][msg.sender];

    if (balances[_from] >= _value   // From a/c has balance
        && _allowance >= _value    // Transfer approved
        && _value > 0              // Non-zero transfer
        && balances[_to] + _value > balances[_to]  // Overflow check
        ){
    balances[_to] = safeAdd(balances[_to],_value);
    balances[_from] = safeSub(balances[_from],_value);
    allowed[_from][msg.sender] = safeSub(_allowance,_value);
    Transfer(_from, _to, _value);
    return true;
        }
    else {
      return false;
    }
  }

  function balanceOf(address _owner) constant returns (uint balance) {
    return balances[_owner];
  }

  function approve(address _spender, uint _value) returns (bool success) {

    // To change the approve amount you first have to reduce the addresses`
    //  allowance to zero by calling `approve(_spender, 0)` if it is not
    //  already 0 to mitigate the race condition described here:
    //  https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
    require((_value == 0) || (allowed[msg.sender][_spender] == 0));

    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  function allowance(address _owner, address _spender) constant returns (uint remaining) {
    return allowed[_owner][_spender];
  }

}


    

/**
 * A token that can increase its supply by another contract.
 *
 * This allows uncapped crowdsale by dynamically increasing the supply when money pours in.
 * Only mint agents, contracts whitelisted by owner, can mint new tokens.
 *
 */
contract MintableToken is StandardToken, Ownable {

  bool public mintingFinished = false;

  /** List of agents that are allowed to create new tokens */
  mapping (address => bool) public mintAgents;

  event MintingAgentChanged(address addr, bool state  );

  /**
   * Create new tokens and allocate them to an address..
   *
   * Only callably by a crowdsale contract (mint agent).
   */
  function mint(address receiver, uint amount) onlyMintAgent canMint public {
    totalSupply = safeAdd(totalSupply, amount);
    balances[receiver] = safeAdd(balances[receiver], amount);
    // This will make the mint transaction apper in EtherScan.io
    // We can remove this after there is a standardized minting event
    Transfer(0, receiver, amount);
  }

  /**
   * Owner can allow a crowdsale contract to mint new tokens.
   */
  function setMintAgent(address addr, bool state) onlyOwner canMint public {
    mintAgents[addr] = state;
    MintingAgentChanged(addr, state);
  }

  modifier onlyMintAgent() {
    // Only crowdsale contracts are allowed to mint new tokens
    require(mintAgents[msg.sender]);
    _;
  }

  /** Make sure we are not done yet. */
  modifier canMint() {
    require(!mintingFinished);
    _;
  }
}



/**
 * Define interface for releasing the token transfer after a successful crowdsale.
 */
contract ReleasableToken is ERC20, Ownable {

  /* The finalizer contract that allows unlift the transfer limits on this token */
  address public releaseAgent;

  /** A crowdsale contract can release us to the wild if ICO success. 
   * If false we are are in transfer lock up period.
   */
  bool public released = false;

  /** Map of agents that are allowed to transfer tokens regardless of the lock down period. 
   * These are crowdsale contracts and possible the team multisig itself. 
   */
  mapping (address => bool) public transferAgents;

  /**
   * Limit token transfer until the crowdsale is over.
   */
  modifier canTransfer(address _sender) {

    if (!released) {
        require(transferAgents[_sender]);
    }

    _;
  }

  /**
   * Set the contract that can call release and make the token transferable.
   *
   * Design choice. Allow reset the release agent to fix fat finger mistakes.
   */
  function setReleaseAgent(address addr) onlyOwner inReleaseState(false) public {

    // We don't do interface check here as we might want to a normal wallet address to act as a release agent
    releaseAgent = addr;
  }

  /**
   * Owner can allow a particular address (a crowdsale contract) to transfer tokens despite the lock up period.
   */
  function setTransferAgent(address addr, bool state) onlyOwner inReleaseState(false) public {
    transferAgents[addr] = state;
  }

  /**
   * One way function to release the tokens to the wild.
   *
   * Can be called only from the release agent that is the final ICO contract. 
   * It is only called if the crowdsale has been success (first milestone reached).
   */
  function releaseTokenTransfer() public onlyReleaseAgent {
    released = true;
  }

  /** The function can be called only before or after the tokens have been releasesd */
  modifier inReleaseState(bool releaseState) {
    require(releaseState == released);
    _;
  }

  /** The function can be called only by a whitelisted release agent. */
  modifier onlyReleaseAgent() {
    require(msg.sender == releaseAgent);
    _;
  }

  function transfer(address _to, uint _value) canTransfer(msg.sender) returns (bool success) {
    // Call StandardToken.transfer()
   return super.transfer(_to, _value);
  }

  function transferFrom(address _from, address _to, uint _value) canTransfer(_from) returns (bool success) {
    // Call StandardToken.transferForm()
    return super.transferFrom(_from, _to, _value);
  }

}


 

/**
 * Upgrade agent interface inspired by Lunyr.
 *
 * Upgrade agent transfers tokens to a new contract.
 * Upgrade agent itself can be the token contract, or just a middle man contract doing the heavy lifting.
 */
contract UpgradeAgent {
  uint public originalSupply;
  /** Interface marker */
  function isUpgradeAgent() public constant returns (bool) {
    return true;
  }
  function upgradeFrom(address _from, uint256 _value) public;
}

/**
 * A token upgrade mechanism where users can opt-in amount of tokens to the next smart contract revision.
 *
 * First envisioned by Golem and Lunyr projects.
 */
contract UpgradeableToken is StandardToken {

  /** Contract / person who can set the upgrade path. 
   * This can be the same as team multisig wallet, as what it is with its default value. 
   */
  address public upgradeMaster;

  /** The next contract where the tokens will be migrated. */
  UpgradeAgent public upgradeAgent;

  /** How many tokens we have upgraded by now. */
  uint256 public totalUpgraded;

  /**
   * Upgrade states.
   *
   * - NotAllowed: The child contract has not reached a condition where the upgrade can bgun
   * - WaitingForAgent: Token allows upgrade, but we don't have a new agent yet
   * - ReadyToUpgrade: The agent is set, but not a single token has been upgraded yet
   * - Upgrading: Upgrade agent is set and the balance holders can upgrade their tokens
   *
   */
  enum UpgradeState {Unknown, NotAllowed, WaitingForAgent, ReadyToUpgrade, Upgrading}

  /**
   * Somebody has upgraded some of their tokens.
   */
  event Upgrade(address indexed _from, address indexed _to, uint256 _value);

  /**
   * New upgrade agent available.
   */
  event UpgradeAgentSet(address agent);

  /**
   * Do not allow construction without upgrade master set.
   */
  function UpgradeableToken(address _upgradeMaster) {
    upgradeMaster = _upgradeMaster;
  }

  /**
   * Allow the token holder to upgrade some of their tokens to a new contract.
   */
  function upgrade(uint256 value) public {
    UpgradeState state = getUpgradeState();
    require((state == UpgradeState.ReadyToUpgrade || state == UpgradeState.Upgrading));
    // Validate input value.
    require(value!=0);

    balances[msg.sender] = safeSub(balances[msg.sender],value);

    // Take tokens out from circulation
    totalSupply = safeSub(totalSupply,value);
    totalUpgraded = safeAdd(totalUpgraded,value);

    // Upgrade agent reissues the tokens
    upgradeAgent.upgradeFrom(msg.sender, value);
    Upgrade(msg.sender, upgradeAgent, value);
  }

  /**
   * Set an upgrade agent that handles
   */
  function setUpgradeAgent(address agent) external {
    require(canUpgrade());
    require(agent != 0x0);
    // Only a master can designate the next agent
    require(msg.sender == upgradeMaster);
    // Upgrade has already begun for an agent
    require(getUpgradeState() != UpgradeState.Upgrading);

    upgradeAgent = UpgradeAgent(agent);

    // Bad interface
    require(upgradeAgent.isUpgradeAgent());
    // Make sure that token supplies match in source and target
    require(upgradeAgent.originalSupply() == totalSupply);

    UpgradeAgentSet(upgradeAgent);
  }

  /**
   * Get the state of the token upgrade.
   */
  function getUpgradeState() public constant returns(UpgradeState) {
    if (!canUpgrade()) return UpgradeState.NotAllowed;
    else if(address(upgradeAgent) == 0x00) return UpgradeState.WaitingForAgent;
    else if(totalUpgraded == 0) return UpgradeState.ReadyToUpgrade;
    else return UpgradeState.Upgrading;
  }

  /**
   * Change the upgrade master.
   *
   * This allows us to set a new owner for the upgrade mechanism.
   */
  function setUpgradeMaster(address master) public {
    require(master != 0x0);
    require(msg.sender == upgradeMaster);
    upgradeMaster = master;
  }

  /**
   * Child contract can enable to provide the condition when the upgrade can begun.
   */
  function canUpgrade() public constant returns(bool) {
     return true;
  }

}


/**
 * A crowdsale token.
 *
 * An ERC-20 token designed specifically for crowdsales with investor protection and 
 * further development path.
 *
 * - The token transfer() is disabled until the crowdsale is over
 * - The token contract gives an opt-in upgrade path to a new contract
 * - The same token can be part of several crowdsales through approve() mechanism
 * - The token can be capped (supply set in the constructor) 
 *   or uncapped (crowdsale contract can mint new tokens)
 */
contract DayToken is  ReleasableToken, MintableToken, UpgradeableToken {

    enum sellingStatus {NOTONSALE, EXPIRED, ONSALE}

    /** Basic structure for a contributor with a minting Address
     * adr address of the contributor
     * initialContributionDay initial contribution of the contributor in wei
     * lastUpdatedOn day count from Minting Epoch when the account balance was last updated
     * mintingPower Initial Minting power of the address
     * expiryBlockNumber Variable to mark end of Minting address sale. Set by user
     * minPriceInDay minimum price of Minting address in Day tokens. Set by user
     * status Selling status Variable for transfer Minting address.
     * sellingPriceInDay Variable for transfer Minting address. Price at which the address is actually sold
     */ 
    struct Contributor {
        address adr;
        uint256 initialContributionDay;
        uint256 lastUpdatedOn; //Day from Minting Epoch
        uint256 mintingPower;
        uint expiryBlockNumber;
        uint256 minPriceInDay;
        sellingStatus status;
    }

    /* Stores maximum days for which minting will happen since minting epoch */
    uint256 public maxMintingDays = 1095;

    /* Mapping to store id of each minting address */
    mapping (address => uint) public idOf;
    /* Mapping from id of each minting address to their respective structures */
    mapping (uint256 => Contributor) public contributors;
    /* mapping to store unix timestamp of when the minting address is issued to each team member */
    mapping (address => uint256) public teamIssuedTimestamp;
    mapping (address => bool) public soldAddresses;
    mapping (address => uint256) public sellingPriceInDayOf;

    /* Stores the id of the first  contributor */
    uint256 public firstContributorId;
    /* Stores total Pre + Post ICO TimeMints */
    uint256 public totalNormalContributorIds;
    /* Stores total Normal TimeMints allocated */
    uint256 public totalNormalContributorIdsAllocated = 0;
    
    /* Stores the id of the first team TimeMint */
    uint256 public firstTeamContributorId;
    /* Stores the total team TimeMints */
    uint256 public totalTeamContributorIds;
    /* Stores total team TimeMints allocated */
    uint256 public totalTeamContributorIdsAllocated = 0;

    /* Stores the id of the first Post ICO contributor (for auctionable TimeMints) */
    uint256 public firstPostIcoContributorId;
    /* Stores total Post ICO TimeMints (for auction) */
    uint256 public totalPostIcoContributorIds;
    /* Stores total Auction TimeMints allocated */
    uint256 public totalPostIcoContributorIdsAllocated = 0;

    /* Maximum number of address */
    uint256 public maxAddresses;

    /* Min Minting power with 19 decimals: 0.5% : 5000000000000000000 */
    uint256 public minMintingPower;
    /* Max Minting power with 19 decimals: 1% : 10000000000000000000 */
    uint256 public maxMintingPower;
    /* Halving cycle in days (88) */
    uint256 public halvingCycle; 
    /* Unix timestamp when minting is to be started */
    uint256 public initialBlockTimestamp;
    /* Flag to prevent setting initialBlockTimestamp more than once */
    bool public isInitialBlockTimestampSet;
    /* number of decimals in minting power */
    uint256 public mintingDec; 

    /* Minimum Balance in Day tokens required to sell a minting address */
    uint256 public minBalanceToSell;
    /* Team address lock down period from issued time, in seconds */
    uint256 public teamLockPeriodInSec;  //Initialize and set function
    /* Duration in secs that we consider as a day. (For test deployment purposes, 
       if we want to decrease length of a day. default: 84600)*/
    uint256 public DayInSecs;

    event UpdatedTokenInformation(string newName, string newSymbol); 
    event MintingAdrTransferred(uint id, address from, address to);
    event ContributorAdded(address adr, uint id);
    event TimeMintOnSale(uint id, address seller, uint minPriceInDay, uint expiryBlockNumber);
    event TimeMintSold(uint id, address buyer, uint offerInDay);
    event PostInvested(address investor, uint weiAmount, uint tokenAmount, uint customerId, uint contributorId);
    
    event TeamAddressAdded(address teamAddress, uint id);
    // Tell us invest was success
    event Invested(address receiver, uint weiAmount, uint tokenAmount, uint customerId, uint contributorId);

    modifier onlyContributor(uint id){
        require(isValidContributorId(id));
        _;
    }

    string public name; 

    string public symbol; 

    uint8 public decimals; 

    /**
        * Construct the token.
        *
        * This token must be created through a team multisig wallet, so that it is owned by that wallet.
        *
        * @param _name Token name
        * @param _symbol Token symbol - should be all caps
        * @param _initialSupply How many tokens we start with
        * @param _decimals Number of decimal places
        * _mintable Are new tokens created over the crowdsale or do we distribute only the initial supply?
        */
    function DayToken(string _name, string _symbol, uint _initialSupply, uint8 _decimals, 
        bool _mintable, uint _maxAddresses, uint _firstTeamContributorId, uint _totalTeamContributorIds, 
        uint _totalPostIcoContributorIds, uint256 _minMintingPower, uint256 _maxMintingPower, uint _halvingCycle, 
        uint256 _minBalanceToSell, uint256 _dayInSecs, uint256 _teamLockPeriodInSec) 
        UpgradeableToken(msg.sender) {
        
        // Create any address, can be transferred
        // to team multisig via changeOwner(),
        // also remember to call setUpgradeMaster()
        owner = msg.sender; 
        name = _name; 
        symbol = _symbol;  
        totalSupply = _initialSupply; 
        decimals = _decimals; 
        // Create initially all balance on the team multisig
        balances[owner] = totalSupply; 
        maxAddresses = _maxAddresses;
        require(maxAddresses > 1); // else division by zero will occur in setInitialMintingPowerOf
        
        firstContributorId = 1;
        totalNormalContributorIds = maxAddresses - _totalTeamContributorIds - _totalPostIcoContributorIds;

        // check timeMint total is sane
        require(totalNormalContributorIds >= 1);

        firstTeamContributorId = _firstTeamContributorId;
        totalTeamContributorIds = _totalTeamContributorIds;
        totalPostIcoContributorIds = _totalPostIcoContributorIds;
        
        // calculate first contributor id to be auctioned post ICO
        firstPostIcoContributorId = maxAddresses - totalPostIcoContributorIds + 1;
        minMintingPower = _minMintingPower;
        maxMintingPower = _maxMintingPower;
        halvingCycle = _halvingCycle;
        // setting future date far far away, year 2020, 
        // call setInitialBlockTimestamp to set proper timestamp
        initialBlockTimestamp = 1577836800;
        isInitialBlockTimestampSet = false;
        // use setMintingDec to change this
        mintingDec = 19;
        minBalanceToSell = _minBalanceToSell;
        DayInSecs = _dayInSecs;
        teamLockPeriodInSec = _teamLockPeriodInSec;
        
        if (totalSupply > 0) {
            Minted(owner, totalSupply); 
        }

        if (!_mintable) {
            mintingFinished = true; 
            require(totalSupply != 0); 
        }
    }

    /**
    * Used to set timestamp at which minting power of TimeMints is activated
    * Can be called only by owner
    * @param _initialBlockTimestamp timestamp to be set.
    */
    function setInitialBlockTimestamp(uint _initialBlockTimestamp) internal onlyOwner {
        require(!isInitialBlockTimestampSet);
        isInitialBlockTimestampSet = true;
        initialBlockTimestamp = _initialBlockTimestamp;
    }

    /**
    * check if mintining power is activated and Day token and Timemint transfer is enabled
    */
    function isDayTokenActivated() constant returns (bool isActivated) {
        return (block.timestamp >= initialBlockTimestamp);
    }


    /**
    * to check if an id is a valid contributor
    * @param _id contributor id to check.
    */
    function isValidContributorId(uint _id) constant returns (bool isValidContributor) {
        return (_id > 0 && _id <= maxAddresses && contributors[_id].adr != 0 
            && idOf[contributors[_id].adr] == _id); // cross checking
    }

    /**
    * to check if an address is a valid contributor
    * @param _address  contributor address to check.
    */
    function isValidContributorAddress(address _address) constant returns (bool isValidContributor) {
        return isValidContributorId(idOf[_address]);
    }


    /**
    * In case of Team address check if lock-in period is over (returns true for all non team addresses)
    * @param _address team address to check lock in period for.
    */
    function isTeamLockInPeriodOverIfTeamAddress(address _address) constant returns (bool isLockInPeriodOver) {
        isLockInPeriodOver = true;
        if (teamIssuedTimestamp[_address] != 0) {
                if (block.timestamp - teamIssuedTimestamp[_address] < teamLockPeriodInSec)
                    isLockInPeriodOver = false;
        }

        return isLockInPeriodOver;
    }

    /**
    * Used to set mintingDec
    * Can be called only by owner
    * @param _mintingDec bounty to be set.
    */
    function setMintingDec(uint256 _mintingDec) onlyOwner {
        require(!isInitialBlockTimestampSet);
        mintingDec = _mintingDec;
    }

    /**
        * When token is released to be transferable, enforce no new tokens can be created.
        */
    function releaseTokenTransfer() public onlyOwner {
        require(isInitialBlockTimestampSet);
        mintingFinished = true; 
        super.releaseTokenTransfer(); 
    }

    /**
        * Allow upgrade agent functionality kick in only if the crowdsale was success.
        */
    function canUpgrade() public constant returns(bool) {
        return released && super.canUpgrade(); 
    }

    /**
        * Owner can update token information here
        */
    function setTokenInformation(string _name, string _symbol) onlyOwner {
        name = _name; 
        symbol = _symbol; 
        UpdatedTokenInformation(name, symbol); 
    }

    /**
        * Returns the current phase.  
        * Note: Phase starts with 1
        * @param _day Number of days since Minting Epoch
        */
    function getPhaseCount(uint _day) public constant returns (uint phase) {
        phase = (_day/halvingCycle) + 1; 
        return (phase); 
    }
    /**
        * Returns current day number since minting epoch 
        * or zero if initialBlockTimestamp is in future or its DayZero.
        */
    function getDayCount() public constant returns (uint daySinceMintingEpoch) {
        daySinceMintingEpoch = 0;
        if (isDayTokenActivated())
            daySinceMintingEpoch = (block.timestamp - initialBlockTimestamp)/DayInSecs; 

        return daySinceMintingEpoch; 
    }
    /**
        * Calculates and Sets the minting power of a particular id.
        * Called before Minting Epoch by constructor
        * @param _id id of the address whose minting power is to be set.
        */
    function setInitialMintingPowerOf(uint256 _id) internal onlyContributor(_id) {
        contributors[_id].mintingPower = 
            (maxMintingPower - ((_id-1) * (maxMintingPower - minMintingPower)/(maxAddresses-1))); 
    }

    /**
        * Returns minting power of a particular id.
        * @param _id Contribution id whose minting power is to be returned
        */
    function getMintingPowerById(uint _id) public constant returns (uint256 mintingPower) {
        return contributors[_id].mintingPower/(2**(getPhaseCount(getDayCount())-1)); 
    }

    /**
        * Returns minting power of a particular address.
        * @param _adr Address whose minting power is to be returned
        */
    function getMintingPowerByAddress(address _adr) public constant returns (uint256 mintingPower) {
        return getMintingPowerById(idOf[_adr]);
    }


    /**
        * Calculates and returns the balance based on the minting power, day and phase.
        * Can only be called internally
        * Can calculate balance based on last updated.
        * @param _id id whose balnce is to be calculated
        * @param _dayCount day count upto which balance is to be updated
        */
    function availableBalanceOf(uint256 _id, uint _dayCount) internal returns (uint256) {
        uint256 balance = balances[contributors[_id].adr]; 
        uint maxUpdateDays = _dayCount < maxMintingDays ? _dayCount : maxMintingDays;
        uint i = contributors[_id].lastUpdatedOn + 1;
        while(i <= maxUpdateDays) {
             uint phase = getPhaseCount(i);
             uint phaseEndDay = phase * halvingCycle - 1; // as first day is 0
             uint constantFactor = contributors[_id].mintingPower / 2**(phase-1);

            for (uint j = i; j <= phaseEndDay && j <= maxUpdateDays; j++) {
                balance = safeAdd( balance, constantFactor * balance / 10**(mintingDec + 2) );
            }

            i = j;
            
        } 
        return balance; 
    }

    /**
        * Updates the balance of the specified id in its structure and also in the balances[] mapping.
        * returns true if successful.
        * Only for internal calls. Not public.
        * @param _id id whose balance is to be updated.
        */
    function updateBalanceOf(uint256 _id) internal returns (bool success) {
        // check if its contributor
        if (isValidContributorId(_id)) {
            uint dayCount = getDayCount();
            // proceed only if not already updated today
            if (contributors[_id].lastUpdatedOn != dayCount && contributors[_id].lastUpdatedOn < maxMintingDays) {
                address adr = contributors[_id].adr;
                uint oldBalance = balances[adr];
                totalSupply = safeSub(totalSupply, oldBalance);
                uint newBalance = availableBalanceOf(_id, dayCount);
                balances[adr] = newBalance;
                totalSupply = safeAdd(totalSupply, newBalance);
                contributors[_id].lastUpdatedOn = dayCount;
                Transfer(0, adr, newBalance - oldBalance);
                return true; 
            }
        }
        return false;
    }


    /**
        * Standard ERC20 function overridden.
        * Returns the balance of the specified address.
        * Calculates the balance on fly only if it is a minting address else 
        * simply returns balance from balances[] mapping.
        * For public calls.
        * @param _adr address whose balance is to be returned.
        */
    function balanceOf(address _adr) constant returns (uint balance) {
        uint id = idOf[_adr];
        if (id != 0)
            return balanceById(id);
        else 
            return balances[_adr]; 
    }


    /**
        * Standard ERC20 function overridden.
        * Returns the balance of the specified id.
        * Calculates the balance on fly only if it is a minting address else 
        * simply returns balance from balances[] mapping.
        * For public calls.
        * @param _id address whose balance is to be returned.
        */
    function balanceById(uint _id) public constant returns (uint256 balance) {
        address adr = contributors[_id].adr; 
        if (isDayTokenActivated()) {
            if (isValidContributorId(_id)) {
                return ( availableBalanceOf(_id, getDayCount()) );
            }
        }
        return balances[adr]; 
    }

    /**
        * Returns totalSupply of DAY tokens.
        */
    function getTotalSupply() public constant returns (uint) {
        return totalSupply;
    }

    /** Function to update balance of a Timemint
        * returns true if balance updated, false otherwise
        * @param _id TimeMint to update
        */
    function updateTimeMintBalance(uint _id) public returns (bool) {
        require(isDayTokenActivated());
        return updateBalanceOf(_id);
    }

    /** Function to update balance of sender's Timemint
        * returns true if balance updated, false otherwise
        */
    function updateMyTimeMintBalance() public returns (bool) {
        require(isDayTokenActivated());
        return updateBalanceOf(idOf[msg.sender]);
    }

    /**
        * Standard ERC20 function overidden.
        * Used to transfer day tokens from caller's address to another
        * @param _to address to which Day tokens are to be transferred
        * @param _value Number of Day tokens to be transferred
        */
    function transfer(address _to, uint _value) public returns (bool success) {
        require(isDayTokenActivated());
        // if Team address, check if lock-in period is over
        require(isTeamLockInPeriodOverIfTeamAddress(msg.sender));

        updateBalanceOf(idOf[msg.sender]);

        // Check sender account has enough balance and transfer amount is non zero
        require ( balanceOf(msg.sender) >= _value && _value != 0 ); 
        
        updateBalanceOf(idOf[_to]);

        balances[msg.sender] = safeSub(balances[msg.sender], _value); 
        balances[_to] = safeAdd(balances[_to], _value); 
        Transfer(msg.sender, _to, _value);

        return true;
    }
    

    /**
        * Standard ERC20 Standard Token function overridden. Added Team address vesting period lock. 
        */
    function transferFrom(address _from, address _to, uint _value) public returns (bool success) {
        require(isDayTokenActivated());

        // if Team address, check if lock-in period is over
        require(isTeamLockInPeriodOverIfTeamAddress(_from));

        uint _allowance = allowed[_from][msg.sender];

        updateBalanceOf(idOf[_from]);

        // Check from account has enough balance, transfer amount is non zero 
        // and _value is allowed to be transferred
        require ( balanceOf(_from) >= _value && _value != 0  &&  _value <= _allowance); 

        updateBalanceOf(idOf[_to]);

        allowed[_from][msg.sender] = safeSub(_allowance, _value);
        balances[_from] = safeSub(balances[_from], _value);
        balances[_to] = safeAdd(balances[_to], _value);
    
        Transfer(_from, _to, _value);
        
        return true;
    }


    /** 
        * Add any contributor structure (For every kind of contributors: Team/Pre-ICO/ICO/Test)
        * @param _adr Address of the contributor to be added  
        * @param _initialContributionDay Initial Contribution of the contributor to be added
        */
  function addContributor(uint contributorId, address _adr, uint _initialContributionDay) internal onlyOwner {
        require(contributorId <= maxAddresses);
        //address should not be an existing contributor
        require(!isValidContributorAddress(_adr));
        //TimeMint should not be already allocated
        require(!isValidContributorId(contributorId));
        contributors[contributorId].adr = _adr;
        idOf[_adr] = contributorId;
        setInitialMintingPowerOf(contributorId);
        contributors[contributorId].initialContributionDay = _initialContributionDay;
        contributors[contributorId].lastUpdatedOn = getDayCount();
        ContributorAdded(_adr, contributorId);
        contributors[contributorId].status = sellingStatus.NOTONSALE;
    }


    /** Function to be called by minting addresses in order to sell their address
        * @param _minPriceInDay Minimum price in DAY tokens set by the seller
        * @param _expiryBlockNumber Expiry Block Number set by the seller
        */
    function sellMintingAddress(uint256 _minPriceInDay, uint _expiryBlockNumber) public returns (bool) {
        require(isDayTokenActivated());
        require(_expiryBlockNumber > block.number);

        // if Team address, check if lock-in period is over
        require(isTeamLockInPeriodOverIfTeamAddress(msg.sender));

        uint id = idOf[msg.sender];
        require(contributors[id].status == sellingStatus.NOTONSALE);

        // update balance of sender address before checking for minimum required balance
        updateBalanceOf(id);
        require(balances[msg.sender] >= minBalanceToSell);
        contributors[id].minPriceInDay = _minPriceInDay;
        contributors[id].expiryBlockNumber = _expiryBlockNumber;
        contributors[id].status = sellingStatus.ONSALE;
        balances[msg.sender] = safeSub(balances[msg.sender], minBalanceToSell);
        balances[this] = safeAdd(balances[this], minBalanceToSell);
        Transfer(msg.sender, this, minBalanceToSell);
        TimeMintOnSale(id, msg.sender, contributors[id].minPriceInDay, contributors[id].expiryBlockNumber);
        return true;
    }


    /** Function to be called by minting address in order to cancel the sale of their TimeMint
        */
    function cancelSaleOfMintingAddress() onlyContributor(idOf[msg.sender]) public {
        uint id = idOf[msg.sender];
        // TimeMint should be on sale
        require(contributors[id].status == sellingStatus.ONSALE);
        contributors[id].status = sellingStatus.EXPIRED;
    }


    /** Function to be called by any user to get a list of all On Sale TimeMints
        */
    function getOnSaleIds() constant public returns(uint[]) {
        uint[] memory idsOnSale = new uint[](maxAddresses);
        uint j = 0;
        for(uint i=1; i <= maxAddresses; i++) {

            if ( isValidContributorId(i) &&
                block.number <= contributors[i].expiryBlockNumber && 
                contributors[i].status == sellingStatus.ONSALE ) {
                    idsOnSale[j] = i;
                    j++;     
            }
            
        }
        return idsOnSale;
    }


    /** Function to be called by any user to get status of a Time Mint.
        * returns status 0 - Not on sale, 1 - Expired, 2 - On sale,
        * @param _id ID number of the Time Mint 
        */
    function getSellingStatus(uint _id) constant public returns(sellingStatus status) {
        require(isValidContributorId(_id));
        status = contributors[_id].status;
        if ( block.number > contributors[_id].expiryBlockNumber && 
                status == sellingStatus.ONSALE )
            status = sellingStatus.EXPIRED;

        return status;
    }

    /** Function to be called by any user to buy a onsale address by offering an amount
        * @param _offerId ID number of the address to be bought by the buyer
        * @param _offerInDay Offer given by the buyer in number of DAY tokens
        */
    function buyMintingAddress(uint _offerId, uint256 _offerInDay) public returns(bool) {
        if (contributors[_offerId].status == sellingStatus.ONSALE 
            && block.number > contributors[_offerId].expiryBlockNumber)
        {
            contributors[_offerId].status = sellingStatus.EXPIRED;
        }
        address soldAddress = contributors[_offerId].adr;
        require(contributors[_offerId].status == sellingStatus.ONSALE);
        require(_offerInDay >= contributors[_offerId].minPriceInDay);

        // prevent seller from cancelling sale in between
        contributors[_offerId].status = sellingStatus.NOTONSALE;

        // first get the offered DayToken in the token contract & 
        // then transfer the total sum (minBalanceToSend+_offerInDay) to the seller
        balances[msg.sender] = safeSub(balances[msg.sender], _offerInDay);
        balances[this] = safeAdd(balances[this], _offerInDay);
        Transfer(msg.sender, this, _offerInDay);
        if(transferMintingAddress(contributors[_offerId].adr, msg.sender)) {
            //mark the offer as sold & let seller pull the proceed to their own account.
            sellingPriceInDayOf[soldAddress] = _offerInDay;
            soldAddresses[soldAddress] = true; 
            TimeMintSold(_offerId, msg.sender, _offerInDay);  
        }
        return true;
    }


    /**
        * Transfer minting address from one user to another
        * Gives the transfer-to address, the id of the original address
        * returns true if successful and false if not.
        * @param _to address of the user to which minting address is to be tranferred
        */
    function transferMintingAddress(address _from, address _to) internal onlyContributor(idOf[_from]) returns (bool) {
        require(isDayTokenActivated());

        // _to should be non minting address
        require(!isValidContributorAddress(_to));
        
        uint id = idOf[_from];
        // update balance of from address before transferring minting power
        updateBalanceOf(id);

        contributors[id].adr = _to;
        idOf[_to] = id;
        idOf[_from] = 0;
        contributors[id].initialContributionDay = 0;
        // needed as id is assigned to new address
        contributors[id].lastUpdatedOn = getDayCount();
        contributors[id].expiryBlockNumber = 0;
        contributors[id].minPriceInDay = 0;
        MintingAdrTransferred(id, _from, _to);
        return true;
    }


    /** Function to allow seller to get back their deposited amount of day tokens(minBalanceToSell) and 
        * offer made by buyer after successful sale.
        * Throws if sale is not successful
        */
    function fetchSuccessfulSaleProceed() public  returns(bool) {
        require(soldAddresses[msg.sender] == true);
        // to prevent re-entrancy attack
        soldAddresses[msg.sender] = false;
        uint saleProceed = safeAdd(minBalanceToSell, sellingPriceInDayOf[msg.sender]);
        balances[this] = safeSub(balances[this], saleProceed);
        balances[msg.sender] = safeAdd(balances[msg.sender], saleProceed);
        Transfer(this, msg.sender, saleProceed);
        return true;
                
    }

    /** Function that lets a seller get their deposited day tokens (minBalanceToSell) back, if no buyer turns up.
        * Allowed only after expiryBlockNumber
        * Throws if any other state other than EXPIRED
        */
    function refundFailedAuctionAmount() onlyContributor(idOf[msg.sender]) public returns(bool){
        uint id = idOf[msg.sender];
        if(block.number > contributors[id].expiryBlockNumber && contributors[id].status == sellingStatus.ONSALE)
        {
            contributors[id].status = sellingStatus.EXPIRED;
        }
        require(contributors[id].status == sellingStatus.EXPIRED);
        // reset selling status
        contributors[id].status = sellingStatus.NOTONSALE;
        balances[this] = safeSub(balances[this], minBalanceToSell);
        // update balance of seller address before refunding
        updateBalanceOf(id);
        balances[msg.sender] = safeAdd(balances[msg.sender], minBalanceToSell);
        contributors[id].minPriceInDay = 0;
        contributors[id].expiryBlockNumber = 0;
        Transfer(this, msg.sender, minBalanceToSell);
        return true;
    }


    /** Function to add a team address as a contributor and store it's time issued to calculate vesting period
        * Called by owner
        */
    function addTeamTimeMints(address _adr, uint _id, uint _tokens, bool _isTest) public onlyOwner {
        //check if Id is in range of team Ids
        require(_id >= firstTeamContributorId && _id < firstTeamContributorId + totalTeamContributorIds);
        require(totalTeamContributorIdsAllocated < totalTeamContributorIds);
        addContributor(_id, _adr, 0);
        totalTeamContributorIdsAllocated++;
        // enforce lockin period if not test address
        if(!_isTest) teamIssuedTimestamp[_adr] = block.timestamp;
        mint(_adr, _tokens);
        TeamAddressAdded(_adr, _id);
    }


    /** Function to add reserved aution TimeMints post-ICO. Only by owner
        * @param _receiver Address of the minting to be added
        * @param _customerId Server side id of the customer
        * @param _id contributorId
        */
    function postAllocateAuctionTimeMints(address _receiver, uint _customerId, uint _id) public onlyOwner {

        //check if Id is in range of Auction Ids
        require(_id >= firstPostIcoContributorId && _id < firstPostIcoContributorId + totalPostIcoContributorIds);
        require(totalPostIcoContributorIdsAllocated < totalPostIcoContributorIds);
        
        require(released == true);
        addContributor(_id, _receiver, 0);
        totalPostIcoContributorIdsAllocated++;
        PostInvested(_receiver, 0, 0, _customerId, _id);
    }


    /** Function to add all contributors except team, test and Auctions TimeMints. Only by owner
        * @param _receiver Address of the minting to be added
        * @param _customerId Server side id of the customer
        * @param _id contributor id
        * @param _tokens day tokens to allocate
        * @param _weiAmount ether invested in wei
        */
    function allocateNormalTimeMints(address _receiver, uint _customerId, uint _id, uint _tokens, uint _weiAmount) public onlyOwner {
        // check if Id is in range of Normal Ids
        require(_id >= firstContributorId && _id <= totalNormalContributorIds);
        require(totalNormalContributorIdsAllocated < totalNormalContributorIds);
        addContributor(_id, _receiver, _tokens);
        totalNormalContributorIdsAllocated++;
        mint(_receiver, _tokens);
        Invested(_receiver, _weiAmount, _tokens, _customerId, _id);
        
    }


    /** Function to release token
        * Called by owner
        */
    function releaseToken(uint _initialBlockTimestamp) public onlyOwner {
        require(!released); // check not already released
        
        setInitialBlockTimestamp(_initialBlockTimestamp);

        // Make token transferable
        releaseTokenTransfer();
    }
    
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"state","type":"bool"}],"name":"setTransferAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalNormalContributorIdsAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_receiver","type":"address"},{"name":"_customerId","type":"uint256"},{"name":"_id","type":"uint256"},{"name":"_tokens","type":"uint256"},{"name":"_weiAmount","type":"uint256"}],"name":"allocateNormalTimeMints","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"teamLockPeriodInSec","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isDayTokenActivated","outputs":[{"name":"isActivated","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"firstTeamContributorId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalPostIcoContributorIdsAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"setReleaseAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"fetchSuccessfulSaleProceed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_adr","type":"address"},{"name":"_id","type":"uint256"},{"name":"_tokens","type":"uint256"},{"name":"_isTest","type":"bool"}],"name":"addTeamTimeMints","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getMintingPowerById","outputs":[{"name":"mintingPower","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_day","type":"uint256"}],"name":"getPhaseCount","outputs":[{"name":"phase","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"contributors","outputs":[{"name":"adr","type":"address"},{"name":"initialContributionDay","type":"uint256"},{"name":"lastUpdatedOn","type":"uint256"},{"name":"mintingPower","type":"uint256"},{"name":"expiryBlockNumber","type":"uint256"},{"name":"minPriceInDay","type":"uint256"},{"name":"status","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_minPriceInDay","type":"uint256"},{"name":"_expiryBlockNumber","type":"uint256"}],"name":"sellMintingAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"mintAgents","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"state","type":"bool"}],"name":"setMintAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"upgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"balanceById","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"halvingCycle","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DayInSecs","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"teamIssuedTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initialBlockTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"}],"name":"setTokenInformation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mintingDec","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxMintingPower","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"soldAddresses","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minMintingPower","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"upgradeAgent","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_offerId","type":"uint256"},{"name":"_offerInDay","type":"uint256"}],"name":"buyMintingAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"releaseTokenTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradeMaster","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_adr","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTeamContributorIdsAllocated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelSaleOfMintingAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getUpgradeState","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"isValidContributorAddress","outputs":[{"name":"isValidContributor","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"transferAgents","outputs":[{"name":"","type":"bool"}],"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":"_address","type":"address"}],"name":"isTeamLockInPeriodOverIfTeamAddress","outputs":[{"name":"isLockInPeriodOver","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"sellingPriceInDayOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalPostIcoContributorIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxAddresses","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"released","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_receiver","type":"address"},{"name":"_customerId","type":"uint256"},{"name":"_id","type":"uint256"}],"name":"postAllocateAuctionTimeMints","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"canUpgrade","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isInitialBlockTimestampSet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_mintingDec","type":"uint256"}],"name":"setMintingDec","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"firstPostIcoContributorId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeSub","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxMintingDays","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"}],"name":"updateTimeMintBalance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalNormalContributorIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"refundFailedAuctionAmount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_initialBlockTimestamp","type":"uint256"}],"name":"releaseToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_adr","type":"address"}],"name":"getMintingPowerByAddress","outputs":[{"name":"mintingPower","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalTeamContributorIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getSellingStatus","outputs":[{"name":"status","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateMyTimeMintBalance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalUpgraded","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"firstContributorId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeMul","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"releaseAgent","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minBalanceToSell","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"agent","type":"address"}],"name":"setUpgradeAgent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"idOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"isValidContributorId","outputs":[{"name":"isValidContributor","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOnSaleIds","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeAdd","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDayCount","outputs":[{"name":"daySinceMintingEpoch","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"master","type":"address"}],"name":"setUpgradeMaster","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_initialSupply","type":"uint256"},{"name":"_decimals","type":"uint8"},{"name":"_mintable","type":"bool"},{"name":"_maxAddresses","type":"uint256"},{"name":"_firstTeamContributorId","type":"uint256"},{"name":"_totalTeamContributorIds","type":"uint256"},{"name":"_totalPostIcoContributorIds","type":"uint256"},{"name":"_minMintingPower","type":"uint256"},{"name":"_maxMintingPower","type":"uint256"},{"name":"_halvingCycle","type":"uint256"},{"name":"_minBalanceToSell","type":"uint256"},{"name":"_dayInSecs","type":"uint256"},{"name":"_teamLockPeriodInSec","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newName","type":"string"},{"indexed":false,"name":"newSymbol","type":"string"}],"name":"UpdatedTokenInformation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"}],"name":"MintingAdrTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"adr","type":"address"},{"indexed":false,"name":"id","type":"uint256"}],"name":"ContributorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"seller","type":"address"},{"indexed":false,"name":"minPriceInDay","type":"uint256"},{"indexed":false,"name":"expiryBlockNumber","type":"uint256"}],"name":"TimeMintOnSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"buyer","type":"address"},{"indexed":false,"name":"offerInDay","type":"uint256"}],"name":"TimeMintSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"investor","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"customerId","type":"uint256"},{"indexed":false,"name":"contributorId","type":"uint256"}],"name":"PostInvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"teamAddress","type":"address"},{"indexed":false,"name":"id","type":"uint256"}],"name":"TeamAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"receiver","type":"address"},{"indexed":false,"name":"weiAmount","type":"uint256"},{"indexed":false,"name":"tokenAmount","type":"uint256"},{"indexed":false,"name":"customerId","type":"uint256"},{"indexed":false,"name":"contributorId","type":"uint256"}],"name":"Invested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Upgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"agent","type":"address"}],"name":"UpgradeAgentSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"state","type":"bool"}],"name":"MintingAgentChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"receiver","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"}]

60606040526005805460a060020a60ff02191690556007805460ff19169055610447600c55600060148190556017819055601a5534156200003f57600080fd5b60405162003a9b38038062003a9b833981016040528080518201919060200180518201919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519150505b335b5b60038054600160a060020a03191633600160a060020a03161790555b60098054600160a060020a031916600160a060020a0383161790555b5060038054600160a060020a03191633600160a060020a031617905560258f80516200012d92916020019062000291565b5060268e80516200014392916020019062000291565b5060008d81556027805460ff191660ff8f16179055600354600160a060020a031681526001602081905260409091208e9055601b8b90558a116200018657600080fd5b60016012819055601b5489900388900360138190551015620001a757600080fd5b601589905560168890556019879055601b54879003600101601855601c869055601d859055601e849055635e0be100601f556020805460ff19169055601360215560228390556024829055602381905560008054111562000256576003546000547f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe91600160a060020a031690604051600160a060020a03909216825260208201526040908101905180910390a15b8a15156200027a576007805460ff1916600117905560005415156200027a57600080fd5b5b5b5050505050505050505050505050506200033b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002d457805160ff191683800117855562000304565b8280016001018555821562000304579182015b8281111562000304578251825591602001919060010190620002e7565b5b506200031392915062000317565b5090565b6200033891905b808211156200031357600081556001016200031e565b5090565b90565b613750806200034b6000396000f300606060405236156103b65763ffffffff60e060020a60003504166302f652a381146103bb57806304d41474146103e157806305d2035b1461040657806306fdde031461042d578063095ea7b3146104b85780630a402742146104ee5780630c58062b1461051b57806310f1726d14610540578063128e37611461056757806318160ddd1461058c5780631bf2a90a146105b157806323b872dd146105d657806329ff4f53146106125780632f83f78114610633578063313ce5671461065a578063331c55b414610683578063335494a4146106af57806335995022146106d75780633cb5d100146106ff5780633ed66d3d1461077557806340c10f19146107a257806342c1867b146107c657806343214675146107f957806345977d031461081f5780634778dfb8146108375780634813e3e51461085f578063485d5dd21461088457806348bb4067146108a95780634b3d81b6146108da5780634eee966f146108ff578063534439a31461099457806354f63105146109b95780635956b853146109de5780635d444ffb14610a115780635de4ccb014610a365780635df34ff214610a655780635f412d4f14610a92578063600440cb14610aa757806370a0823114610ad6578063718228fa14610b07578063740707cf14610b2c57806379ba509714610b415780638444b39114610b565780638526d09214610b8d578063867c285714610bc05780638da5cb5b14610bf35780638f7b7bce14610c22578063928e659214610c55578063936bbf9a14610c8657806393e5365f14610cab57806395d89b4114610cd05780639613252114610d5b57806396a8069914610d825780639738968c14610da95780639aaac86414610dd05780639bc8e9ee14610df7578063a222a52f14610e0f578063a293d1e814610e34578063a41ff1e514610e5f578063a5f2676014610e84578063a666190114610eae578063a9059cbb14610ed3578063b19b216214610f09578063b54d623814610f30578063b6033daf14610f48578063bef17ed014610f79578063c392f11814610f9e578063c4e41b2214610fd8578063c59513a414610ffd578063c752ff6214611024578063c96e83db14611049578063d05c78da1461106e578063d1f276d314611099578063d49dbb5c146110c8578063d4ee1d90146110ed578063d7e7088a1461111c578063d94fe8321461113d578063dd62ed3e1461116e578063df30e592146111a5578063e0faf0a8146111cf578063e6cb901314611236578063eb60764f14611261578063f2fde38b14611286578063ffeb7d75146112a7575b600080fd5b34156103c657600080fd5b6103df600160a060020a036004351660243515156112c8565b005b34156103ec57600080fd5b6103f4611329565b60405190815260200160405180910390f35b341561041157600080fd5b61041961132f565b604051901515815260200160405180910390f35b341561043857600080fd5b610440611338565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561047d5780820151818401525b602001610464565b50505050905090810190601f1680156104aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104c357600080fd5b610419600160a060020a03600435166024356113d6565b604051901515815260200160405180910390f35b34156104f957600080fd5b6103df600160a060020a036004351660243560443560643560843561147d565b005b341561052657600080fd5b6103f461154e565b60405190815260200160405180910390f35b341561054b57600080fd5b610419611554565b604051901515815260200160405180910390f35b341561057257600080fd5b6103f461155e565b60405190815260200160405180910390f35b341561059757600080fd5b6103f4611564565b60405190815260200160405180910390f35b34156105bc57600080fd5b6103f461156a565b60405190815260200160405180910390f35b34156105e157600080fd5b610419600160a060020a0360043581169060243516604435611570565b604051901515815260200160405180910390f35b341561061d57600080fd5b6103df600160a060020a03600435166116f7565b005b341561063e57600080fd5b61041961174e565b604051901515815260200160405180910390f35b341561066557600080fd5b61066d611858565b60405160ff909116815260200160405180910390f35b341561068e57600080fd5b6103df600160a060020a03600435166024356044356064351515611861565b005b34156106ba57600080fd5b6103f460043561193c565b60405190815260200160405180910390f35b34156106e257600080fd5b6103f460043561197b565b60405190815260200160405180910390f35b341561070a57600080fd5b610715600435611996565b6040518088600160a060020a0316600160a060020a0316815260200187815260200186815260200185815260200184815260200183815260200182600281111561075b57fe5b60ff16815260200197505050505050505060405180910390f35b341561078057600080fd5b6104196004356024356119e0565b604051901515815260200160405180910390f35b34156107ad57600080fd5b6103df600160a060020a0360043516602435611bf8565b005b34156107d157600080fd5b610419600160a060020a0360043516611ca7565b604051901515815260200160405180910390f35b341561080457600080fd5b6103df600160a060020a03600435166024351515611cbc565b005b341561082a57600080fd5b6103df600435611d5b565b005b341561084257600080fd5b6103f4600435611eb5565b60405190815260200160405180910390f35b341561086a57600080fd5b6103f4611f23565b60405190815260200160405180910390f35b341561088f57600080fd5b6103f4611f29565b60405190815260200160405180910390f35b34156108b457600080fd5b6103f4600160a060020a0360043516611f2f565b60405190815260200160405180910390f35b34156108e557600080fd5b6103f4611f41565b60405190815260200160405180910390f35b341561090a57600080fd5b6103df60046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528181529291906020840183838082843750949650611f4795505050505050565b005b341561099f57600080fd5b6103f46120b7565b60405190815260200160405180910390f35b34156109c457600080fd5b6103f46120bd565b60405190815260200160405180910390f35b34156109e957600080fd5b610419600160a060020a03600435166120c3565b604051901515815260200160405180910390f35b3415610a1c57600080fd5b6103f46120d8565b60405190815260200160405180910390f35b3415610a4157600080fd5b610a496120de565b604051600160a060020a03909116815260200160405180910390f35b3415610a7057600080fd5b6104196004356024356120ed565b604051901515815260200160405180910390f35b3415610a9d57600080fd5b6103df61232d565b005b3415610ab257600080fd5b610a49612372565b604051600160a060020a03909116815260200160405180910390f35b3415610ae157600080fd5b6103f4600160a060020a0360043516612381565b60405190815260200160405180910390f35b3415610b1257600080fd5b6103f46123d7565b60405190815260200160405180910390f35b3415610b3757600080fd5b6103df6123dd565b005b3415610b4c57600080fd5b6103df61247b565b005b3415610b6157600080fd5b610b696124fa565b60405180826004811115610b7957fe5b60ff16815260200191505060405180910390f35b3415610b9857600080fd5b610419600160a060020a036004351661254b565b604051901515815260200160405180910390f35b3415610bcb57600080fd5b610419600160a060020a0360043516612575565b604051901515815260200160405180910390f35b3415610bfe57600080fd5b610a4961258a565b604051600160a060020a03909116815260200160405180910390f35b3415610c2d57600080fd5b610419600160a060020a0360043516612599565b604051901515815260200160405180910390f35b3415610c6057600080fd5b6103f4600160a060020a03600435166125e9565b60405190815260200160405180910390f35b3415610c9157600080fd5b6103f46125fb565b60405190815260200160405180910390f35b3415610cb657600080fd5b6103f4612601565b60405190815260200160405180910390f35b3415610cdb57600080fd5b610440612607565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561047d5780820151818401525b602001610464565b50505050905090810190601f1680156104aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d6657600080fd5b6104196126a5565b604051901515815260200160405180910390f35b3415610d8d57600080fd5b6103df600160a060020a03600435166024356044356126b5565b005b3415610db457600080fd5b61041961279a565b604051901515815260200160405180910390f35b3415610ddb57600080fd5b6104196127c0565b604051901515815260200160405180910390f35b3415610e0257600080fd5b6103df6004356127c9565b005b3415610e1a57600080fd5b6103f46127fe565b60405190815260200160405180910390f35b3415610e3f57600080fd5b6103f4600435602435612804565b60405190815260200160405180910390f35b3415610e6a57600080fd5b6103f461281b565b60405190815260200160405180910390f35b3415610e8f57600080fd5b610419600435612821565b604051901515815260200160405180910390f35b3415610eb957600080fd5b6103f4612847565b60405190815260200160405180910390f35b3415610ede57600080fd5b610419600160a060020a036004351660243561284d565b604051901515815260200160405180910390f35b3415610f1457600080fd5b610419612980565b604051901515815260200160405180910390f35b3415610f3b57600080fd5b6103df600435612b5a565b005b3415610f5357600080fd5b6103f4600160a060020a0360043516612ba2565b60405190815260200160405180910390f35b3415610f8457600080fd5b6103f4612bcc565b60405190815260200160405180910390f35b3415610fa957600080fd5b610fb4600435612bd2565b60405180826002811115610b7957fe5b60ff16815260200191505060405180910390f35b3415610fe357600080fd5b6103f4612c31565b60405190815260200160405180910390f35b341561100857600080fd5b610419612c38565b604051901515815260200160405180910390f35b341561102f57600080fd5b6103f4612c75565b60405190815260200160405180910390f35b341561105457600080fd5b6103f4612c7b565b60405190815260200160405180910390f35b341561107957600080fd5b6103f4600435602435612c81565b60405190815260200160405180910390f35b34156110a457600080fd5b610a49612cb0565b604051600160a060020a03909116815260200160405180910390f35b34156110d357600080fd5b6103f4612cbf565b60405190815260200160405180910390f35b34156110f857600080fd5b610a49612cc5565b604051600160a060020a03909116815260200160405180910390f35b341561112757600080fd5b6103df600160a060020a0360043516612cd4565b005b341561114857600080fd5b6103f4600160a060020a0360043516612e80565b60405190815260200160405180910390f35b341561117957600080fd5b6103f4600160a060020a0360043581169060243516612e92565b60405190815260200160405180910390f35b34156111b057600080fd5b610419600435612ebf565b604051901515815260200160405180910390f35b34156111da57600080fd5b6111e2612f2b565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156112225780820151818401525b602001611209565b505050509050019250505060405180910390f35b341561124157600080fd5b6103f4600435602435612ffc565b60405190815260200160405180910390f35b341561126c57600080fd5b6103f4613016565b60405190815260200160405180910390f35b341561129157600080fd5b6103df600160a060020a036004351661303e565b005b34156112b257600080fd5b6103df600160a060020a0360043516613079565b005b60035433600160a060020a039081169116146112e357600080fd5b60055460009060a060020a900460ff16156112fd57600080fd5b600160a060020a0383166000908152600660205260409020805460ff19168315151790555b5b505b5050565b60145481565b60075460ff1681565b60258054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ce5780601f106113a3576101008083540402835291602001916113ce565b820191906000526020600020905b8154815290600101906020018083116113b157829003601f168201915b505050505081565b60008115806114085750600160a060020a03338116600090815260026020908152604080832093871683529290522054155b151561141357600080fd5b600160a060020a03338116600081815260026020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60035433600160a060020a0390811691161461149857600080fd5b60125483101580156114ac57506013548311155b15156114b757600080fd5b601354601454106114c757600080fd5b6114d28386846130c8565b6014805460010190556114e58583611bf8565b7f6bd11c91e66ab57411c3d72828f939eac4446988c1c1f5862442bf7fa9884e238582848787604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a15b5b5050505050565b60235481565b601f544210155b90565b60155481565b60005481565b601a5481565b60008061157b611554565b151561158657600080fd5b61158f85612599565b151561159a57600080fd5b50600160a060020a03808516600081815260026020908152604080832033909516835293815283822054928252600d905291909120546115d9906131fb565b50826115e486612381565b101580156115f157508215155b80156115fd5750808311155b151561160857600080fd5b600160a060020a0384166000908152600d602052604090205461162a906131fb565b506116358184612804565b600160a060020a0380871660008181526002602090815260408083203390951683529381528382209490945590815260019092529020546116769084612804565b600160a060020a0380871660009081526001602052604080822093909355908616815220546116a59084612ffc565b600160a060020a03808616600081815260016020526040908190209390935591908716906000805160206137058339815191529086905190815260200160405180910390a3600191505b509392505050565b60035433600160a060020a0390811691161461171257600080fd5b60055460009060a060020a900460ff161561172c57600080fd5b60058054600160a060020a031916600160a060020a0384161790555b5b505b50565b600160a060020a033316600090815260106020526040812054819060ff16151560011461177a57600080fd5b600160a060020a0333166000908152601060209081526040808320805460ff191690556022546011909252909120546117b39190612ffc565b600160a060020a0330166000908152600160205260409020549091506117d99082612804565b600160a060020a033081166000908152600160205260408082209390935533909116815220546118099082612ffc565b600160a060020a0333811660008181526001602052604090819020939093559130909116906000805160206137058339815191529084905190815260200160405180910390a3600191505b5090565b60275460ff1681565b60035433600160a060020a0390811691161461187c57600080fd5b601554831015801561189357506016546015540183105b151561189e57600080fd5b601654601754106118ae57600080fd5b6118ba838560006130c8565b6017805460010190558015156118e657600160a060020a0384166000908152600f602052604090204290555b6118f08483611bf8565b7fe79fec6463e59273a1da7bc924872b8b35b64c591ce527b6329f0db8d6be71fd8484604051600160a060020a03909216825260208201526040908101905180910390a15b5b50505050565b6000600161195061194b613016565b61197b565b6000848152600e602052604090206003015491900360020a9081151561197257fe5b0490505b919050565b6000601e548281151561198a57fe5b0460010190505b919050565b600e602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154600160a060020a039095169593949293919290919060ff1687565b6000806119eb611554565b15156119f657600080fd5b438311611a0257600080fd5b611a0b33612599565b1515611a1657600080fd5b50600160a060020a0333166000908152600d6020526040812054905b6000828152600e602052604090206006015460ff166002811115611a5257fe5b14611a5c57600080fd5b611a65816131fb565b50602254600160a060020a0333166000908152600160205260409020541015611a8d57600080fd5b6000818152600e60205260409020600581018590556004810184905560060180546002919060ff19166001835b0217905550600160a060020a033316600090815260016020526040902054602254611ae59190612804565b600160a060020a03338116600090815260016020526040808220939093553090911681522054602254611b189190612ffc565b6001600030600160a060020a0316600160a060020a031681526020019081526020016000208190555030600160a060020a031633600160a060020a031660008051602061370583398151915260225460405190815260200160405180910390a36000818152600e60205260409081902060058101546004909101547f789864ab03bca8d309c9bec6804307cfc416db24eab7873ba7f3df79797b09179284923392909151938452600160a060020a03909216602084015260408084019190915260608301919091526080909101905180910390a1600191505b5092915050565b600160a060020a03331660009081526008602052604090205460ff161515611c1f57600080fd5b60075460ff1615611c2f57600080fd5b611c3b60005482612ffc565b6000908155600160a060020a038316815260016020526040902054611c609082612ffc565b600160a060020a0383166000818152600160205260408082209390935590916000805160206137058339815191529084905190815260200160405180910390a35b5b5b5050565b60086020526000908152604090205460ff1681565b60035433600160a060020a03908116911614611cd757600080fd5b60075460ff1615611ce757600080fd5b600160a060020a03821660009081526008602052604090819020805460ff19168315151790557f4b0adf6c802794c7dde28a08a4e07131abcff3bf9603cd71f14f90bec7865efa908390839051600160a060020a039092168252151560208201526040908101905180910390a15b5b5b5050565b6000611d656124fa565b905060035b816004811115611d7657fe5b1480611d8e575060045b816004811115611d8c57fe5b145b1515611d9957600080fd5b811515611da557600080fd5b600160a060020a033316600090815260016020526040902054611dc89083612804565b600160a060020a03331660009081526001602052604081209190915554611def9083612804565b600055600b54611dff9083612ffc565b600b55600a54600160a060020a031663753e88e5338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611e5857600080fd5b6102c65a03f11515611e6957600080fd5b5050600a54600160a060020a03908116915033167f7e5c344a8141a805725cb476f76c6953b842222b967edd1f78ddb6e8b3f397ac8460405190815260200160405180910390a35b5050565b6000818152600e6020526040812054600160a060020a0316611ed5611554565b15611f0057611ee383612ebf565b15611f0057611ef983611ef4613016565b613321565b9150611f1d565b5b600160a060020a03811660009081526001602052604090205491505b50919050565b601e5481565b60245481565b600f6020526000908152604090205481565b601f5481565b60035433600160a060020a03908116911614611f6257600080fd5b6025828051611f75929160200190613652565b506026818051611f89929160200190613652565b507fd131ab1e6f279deea74e13a18477e13e2107deb6dc8ae955648948be5841fb466025602660405160408082528354600260001961010060018416150201909116049082018190528190602082019060608301908690801561202d5780601f106120025761010080835404028352916020019161202d565b820191906000526020600020905b81548152906001019060200180831161201057829003601f168201915b50508381038252845460026000196101006001841615020190911604808252602090910190859080156120a15780601f10612076576101008083540402835291602001916120a1565b820191906000526020600020905b81548152906001019060200180831161208457829003601f168201915b505094505050505060405180910390a15b5b5050565b60215481565b601d5481565b60106020526000908152604090205460ff1681565b601c5481565b600a54600160a060020a031681565b60008060025b6000858152600e602052604090206006015460ff16600281111561211357fe5b14801561213057506000848152600e602052604090206004015443115b15612159576000848152600e6020526040902060060180546001919060ff191682805b02179055505b506000838152600e6020526040902054600160a060020a031660025b6000858152600e602052604090206006015460ff16600281111561219557fe5b1461219f57600080fd5b6000848152600e60205260409020600501548310156121bd57600080fd5b6000848152600e60205260408120600601805460ff19166001835b0217905550600160a060020a0333166000908152600160205260409020546122009084612804565b600160a060020a033381166000908152600160205260408082209390935530909116815220546122309084612ffc565b600160a060020a0330811660008181526001602052604090819020939093559133909116906000805160206137058339815191529086905190815260200160405180910390a36000848152600e602052604090205461229890600160a060020a031633613420565b1561232157600160a060020a0381166000908152601160209081526040808320869055601090915290819020805460ff191660011790557f72760e46b3824807567c13ec75882de5d9c789a91517ae7b474d2e6b62d3771e9085903390869051928352600160a060020a0390911660208301526040808301919091526060909101905180910390a15b600191505b5092915050565b60035433600160a060020a0390811691161461234857600080fd5b60205460ff16151561235957600080fd5b6007805460ff1916600117905561236e613574565b5b5b565b600954600160a060020a031681565b600160a060020a0381166000908152600d602052604081205480156123b057611ef981611eb5565b9150611f1d565b600160a060020a0383166000908152600160205260409020549150611f1d565b5b50919050565b60175481565b600160a060020a0333166000908152600d60205260408120546123ff81612ebf565b151561240a57600080fd5b600160a060020a0333166000908152600d6020526040902054915060025b6000838152600e602052604090206006015460ff16600281111561244857fe5b1461245257600080fd5b6000828152600e6020526040902060060180546001919060ff191682805b02179055505b5b5050565b60045433600160a060020a0390811691161461249657600080fd5b600454600354600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360045460038054600160a060020a031916600160a060020a039092169190911790555b565b600061250461279a565b15156125125750600161155b565b600a54600160a060020a0316151561252c5750600261155b565b600b54151561253d5750600361155b565b50600461155b565b5b5b5b90565b600160a060020a0381166000908152600d602052604081205461256d90612ebf565b90505b919050565b60066020526000908152604090205460ff1681565b600354600160a060020a031681565b600160a060020a0381166000908152600f60205260409020546001901561197657602354600160a060020a0383166000908152600f602052604090205442031015611976575060005b5b5b919050565b60116020526000908152604090205481565b60195481565b601b5481565b60268054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ce5780601f106113a3576101008083540402835291602001916113ce565b820191906000526020600020905b8154815290600101906020018083116113b157829003601f168201915b505050505081565b60055460a060020a900460ff1681565b60035433600160a060020a039081169116146126d057600080fd5b60185481101580156126e757506019546018540181105b15156126f257600080fd5b601954601a541061270257600080fd5b60055460a060020a900460ff16151560011461271d57600080fd5b612729818460006130c8565b601a805460010190557f5da87a24d5db985862dc335ff32e322d9588ae9b4a971bd1526a58051c8cbaa4836000808585604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a15b5b505050565b60055460009060a060020a900460ff1680156127b957506127b96135b7565b5b90505b90565b60205460ff1681565b60035433600160a060020a039081169116146127e457600080fd5b60205460ff16156127f457600080fd5b60218190555b5b50565b60185481565b60008282111561281057fe5b508082035b92915050565b600c5481565b600061282b611554565b151561283657600080fd5b61256d826131fb565b90505b919050565b60135481565b6000612857611554565b151561286257600080fd5b61286b33612599565b151561287657600080fd5b600160a060020a0333166000908152600d6020526040902054612898906131fb565b50816128a333612381565b101580156128b057508115155b15156128bb57600080fd5b600160a060020a0383166000908152600d60205260409020546128dd906131fb565b50600160a060020a0333166000908152600160205260409020546129019083612804565b600160a060020a0333811660009081526001602052604080822093909355908516815220546129309083612ffc565b600160a060020a0380851660008181526001602052604090819020939093559133909116906000805160206137058339815191529085905190815260200160405180910390a35060015b92915050565b600160a060020a0333166000908152600d602052604081205481906129a481612ebf565b15156129af57600080fd5b600160a060020a0333166000908152600d6020908152604080832054808452600e9092529091206004015490925043118015612a0b575060025b6000838152600e602052604090206006015460ff166002811115612a0957fe5b145b15612a34576000828152600e6020526040902060060180546001919060ff191682805b02179055505b60015b6000838152600e602052604090206006015460ff166002811115612a5757fe5b14612a6157600080fd5b6000828152600e60205260408120600601805460ff19166001835b0217905550600160a060020a033016600090815260016020526040902054602254612aa79190612804565b600160a060020a033016600090815260016020526040902055612ac9826131fb565b50600160a060020a033316600090815260016020526040902054602254612af09190612ffc565b600160a060020a03338116600081815260016020908152604080832095909555868252600e905283812060058101829055600401556022549092309092169160008051602061370583398151915291905190815260200160405180910390a3600192505b5b505090565b60035433600160a060020a03908116911614612b7557600080fd5b60055460a060020a900460ff1615612b8c57600080fd5b612b95816135bd565b61174b61232d565b5b5b50565b600160a060020a0381166000908152600d602052604081205461256d9061193c565b90505b919050565b60165481565b6000612bdd82612ebf565b1515612be857600080fd5b506000818152600e60205260409020600681015460049091015460ff9091169043118015612c22575060025b816002811115612c2057fe5b145b15611976575060015b5b919050565b6000545b90565b6000612c42611554565b1515612c4d57600080fd5b600160a060020a0333166000908152600d60205260409020546127b9906131fb565b90505b90565b600b5481565b60125481565b6000828202831580612c9d5750828482811515612c9a57fe5b04145b1515612ca557fe5b8091505b5092915050565b600554600160a060020a031681565b60225481565b600454600160a060020a031681565b612cdc61279a565b1515612ce757600080fd5b600160a060020a0381161515612cfc57600080fd5b60095433600160a060020a03908116911614612d1757600080fd5b60045b612d226124fa565b6004811115612d2d57fe5b1415612d3857600080fd5b600a8054600160a060020a031916600160a060020a038381169190911791829055166361d3d7a66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612d9657600080fd5b6102c65a03f11515612da757600080fd5b505050604051805190501515612dbc57600080fd5b60008054600a549091600160a060020a0390911690634b2ba0dd90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612e0c57600080fd5b6102c65a03f11515612e1d57600080fd5b50505060405180519050141515612e3357600080fd5b600a547f7845d5aa74cc410e35571258d954f23b82276e160fe8c188fa80566580f279cc90600160a060020a0316604051600160a060020a03909116815260200160405180910390a15b50565b600d6020526000908152604090205481565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b60008082118015612ed25750601b548211155b8015612ef457506000828152600e6020526040902054600160a060020a031615155b801561256d57506000828152600e6020908152604080832054600160a060020a03168352600d90915290205482145b90505b919050565b612f336136d1565b612f3b6136d1565b600080601b54604051805910612f4e5750595b908082528060200260200182016040525b50925060009150600190505b601b548111612ff257612f7d81612ebf565b8015612f9a57506000818152600e60205260409020600401544311155b8015612fc6575060025b6000828152600e602052604090206006015460ff166002811115612fc457fe5b145b15612fe95780838381518110612fd857fe5b602090810290910101526001909101905b5b600101612f6b565b8293505b50505090565b600082820183811015612ca557fe5b8091505b5092915050565b6000613020611554565b1561155b57602454601f54420381151561303657fe5b0490505b5b90565b60035433600160a060020a0390811691161461305957600080fd5b60048054600160a060020a031916600160a060020a0383161790555b5b50565b600160a060020a038116151561308e57600080fd5b60095433600160a060020a039081169116146130a957600080fd5b60098054600160a060020a031916600160a060020a0383161790555b50565b60035433600160a060020a039081169116146130e357600080fd5b601b548311156130f257600080fd5b6130fb8261254b565b1561310557600080fd5b61310e83612ebf565b1561311857600080fd5b6000838152600e602090815260408083208054600160a060020a031916600160a060020a0387169081179091558352600d909152902083905561315a836135ff565b6000838152600e60205260409020600101819055613176613016565b600e6000858152602001908152602001600020600201819055507f5fd6d0b7e707fe344bd2a1887f9d0eeea8bfcac6f339ba4200e74f0647f101c08284604051600160a060020a03909216825260208201526040908101905180910390a16000838152600e60205260408120600601805460ff19166001835b02179055505b5b505050565b600080600080600061320c86612ebf565b1561331257613219613016565b6000878152600e6020526040902060020154909450841480159061324f5750600c546000878152600e6020526040902060020154105b15613312576000868152600e6020908152604080832054600160a060020a03168084526001909252822054915490945090925061328c9083612804565b6000556132998685613321565b600160a060020a0384166000908152600160205260408120829055549091506132c29082612ffc565b6000908155868152600e6020526040808220600201869055600160a060020a038516919060008051602061370583398151915290858503905190815260200160405180910390a360019450613318565b5b600094505b50505050919050565b6000828152600e6020908152604080832054600160a060020a031683526001909152812054600c54829081908190819081908190891061336357600c54613365565b885b60008b8152600e602052604090206002015490965060010194505b85851161340f576133908561197b565b601e5460008c8152600e602052604090206003015491955060001990860281019450850160020a908115156133c157fe5b0491508490505b8281111580156133d85750858111155b15613407576133fc87602154600201600a0a8985028115156133f657fe5b04612ffc565b96505b6001016133c8565b809450613380565b8697505b5050505050505092915050565b600160a060020a0382166000908152600d6020526040812054819061344481612ebf565b151561344f57600080fd5b613457611554565b151561346257600080fd5b61346b8461254b565b1561347557600080fd5b600160a060020a0385166000908152600d60205260409020549150613499826131fb565b506000828152600e602081815260408084208054600160a060020a031916600160a060020a038a81169182178355908652600d84528286208890558a168552908420849055858452919052600101556134f0613016565b6000838152600e60205260408082206002810193909355600483018290556005909201557ffb7aaa2ec871044b8cde9fee0cd727b02c8d6caf7aeb7f5fa2e02ffdfe1643349083908790879051928352600160a060020a039182166020840152166040808301919091526060909101905180910390a1600192505b5b505092915050565b60055433600160a060020a0390811691161461358f57600080fd5b6005805474ff0000000000000000000000000000000000000000191660a060020a1790555b5b565b60015b90565b60035433600160a060020a039081169116146135d857600080fd5b60205460ff16156135e857600080fd5b6020805460ff19166001179055601f8190555b5b50565b8061360981612ebf565b151561361457600080fd5b6001601b5403601c54601d5403600184030281151561362f57fe5b601d546000858152600e602052604090209290910490036003909101555b5b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061369357805160ff19168380011785556136c0565b828001600101855582156136c0579182015b828111156136c05782518255916020019190600101906136a5565b5b506118549291506136e3565b5090565b60206040519081016040526000815290565b61155b91905b8082111561185457600081556001016136e9565b5090565b905600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a723058203c8e25f14894b4155b24701de30f025078d8ed7672c303ae840676a0ea8b273f002900000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000d050000000000000000000000000000000000000000000000000000000000000c9c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000006f05b59d3b200000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000001e1d1c72d5b97e0000000000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000001e133800000000000000000000000000000000000000000000000000000000000000003444159000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034441590000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x606060405236156103b65763ffffffff60e060020a60003504166302f652a381146103bb57806304d41474146103e157806305d2035b1461040657806306fdde031461042d578063095ea7b3146104b85780630a402742146104ee5780630c58062b1461051b57806310f1726d14610540578063128e37611461056757806318160ddd1461058c5780631bf2a90a146105b157806323b872dd146105d657806329ff4f53146106125780632f83f78114610633578063313ce5671461065a578063331c55b414610683578063335494a4146106af57806335995022146106d75780633cb5d100146106ff5780633ed66d3d1461077557806340c10f19146107a257806342c1867b146107c657806343214675146107f957806345977d031461081f5780634778dfb8146108375780634813e3e51461085f578063485d5dd21461088457806348bb4067146108a95780634b3d81b6146108da5780634eee966f146108ff578063534439a31461099457806354f63105146109b95780635956b853146109de5780635d444ffb14610a115780635de4ccb014610a365780635df34ff214610a655780635f412d4f14610a92578063600440cb14610aa757806370a0823114610ad6578063718228fa14610b07578063740707cf14610b2c57806379ba509714610b415780638444b39114610b565780638526d09214610b8d578063867c285714610bc05780638da5cb5b14610bf35780638f7b7bce14610c22578063928e659214610c55578063936bbf9a14610c8657806393e5365f14610cab57806395d89b4114610cd05780639613252114610d5b57806396a8069914610d825780639738968c14610da95780639aaac86414610dd05780639bc8e9ee14610df7578063a222a52f14610e0f578063a293d1e814610e34578063a41ff1e514610e5f578063a5f2676014610e84578063a666190114610eae578063a9059cbb14610ed3578063b19b216214610f09578063b54d623814610f30578063b6033daf14610f48578063bef17ed014610f79578063c392f11814610f9e578063c4e41b2214610fd8578063c59513a414610ffd578063c752ff6214611024578063c96e83db14611049578063d05c78da1461106e578063d1f276d314611099578063d49dbb5c146110c8578063d4ee1d90146110ed578063d7e7088a1461111c578063d94fe8321461113d578063dd62ed3e1461116e578063df30e592146111a5578063e0faf0a8146111cf578063e6cb901314611236578063eb60764f14611261578063f2fde38b14611286578063ffeb7d75146112a7575b600080fd5b34156103c657600080fd5b6103df600160a060020a036004351660243515156112c8565b005b34156103ec57600080fd5b6103f4611329565b60405190815260200160405180910390f35b341561041157600080fd5b61041961132f565b604051901515815260200160405180910390f35b341561043857600080fd5b610440611338565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561047d5780820151818401525b602001610464565b50505050905090810190601f1680156104aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104c357600080fd5b610419600160a060020a03600435166024356113d6565b604051901515815260200160405180910390f35b34156104f957600080fd5b6103df600160a060020a036004351660243560443560643560843561147d565b005b341561052657600080fd5b6103f461154e565b60405190815260200160405180910390f35b341561054b57600080fd5b610419611554565b604051901515815260200160405180910390f35b341561057257600080fd5b6103f461155e565b60405190815260200160405180910390f35b341561059757600080fd5b6103f4611564565b60405190815260200160405180910390f35b34156105bc57600080fd5b6103f461156a565b60405190815260200160405180910390f35b34156105e157600080fd5b610419600160a060020a0360043581169060243516604435611570565b604051901515815260200160405180910390f35b341561061d57600080fd5b6103df600160a060020a03600435166116f7565b005b341561063e57600080fd5b61041961174e565b604051901515815260200160405180910390f35b341561066557600080fd5b61066d611858565b60405160ff909116815260200160405180910390f35b341561068e57600080fd5b6103df600160a060020a03600435166024356044356064351515611861565b005b34156106ba57600080fd5b6103f460043561193c565b60405190815260200160405180910390f35b34156106e257600080fd5b6103f460043561197b565b60405190815260200160405180910390f35b341561070a57600080fd5b610715600435611996565b6040518088600160a060020a0316600160a060020a0316815260200187815260200186815260200185815260200184815260200183815260200182600281111561075b57fe5b60ff16815260200197505050505050505060405180910390f35b341561078057600080fd5b6104196004356024356119e0565b604051901515815260200160405180910390f35b34156107ad57600080fd5b6103df600160a060020a0360043516602435611bf8565b005b34156107d157600080fd5b610419600160a060020a0360043516611ca7565b604051901515815260200160405180910390f35b341561080457600080fd5b6103df600160a060020a03600435166024351515611cbc565b005b341561082a57600080fd5b6103df600435611d5b565b005b341561084257600080fd5b6103f4600435611eb5565b60405190815260200160405180910390f35b341561086a57600080fd5b6103f4611f23565b60405190815260200160405180910390f35b341561088f57600080fd5b6103f4611f29565b60405190815260200160405180910390f35b34156108b457600080fd5b6103f4600160a060020a0360043516611f2f565b60405190815260200160405180910390f35b34156108e557600080fd5b6103f4611f41565b60405190815260200160405180910390f35b341561090a57600080fd5b6103df60046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528181529291906020840183838082843750949650611f4795505050505050565b005b341561099f57600080fd5b6103f46120b7565b60405190815260200160405180910390f35b34156109c457600080fd5b6103f46120bd565b60405190815260200160405180910390f35b34156109e957600080fd5b610419600160a060020a03600435166120c3565b604051901515815260200160405180910390f35b3415610a1c57600080fd5b6103f46120d8565b60405190815260200160405180910390f35b3415610a4157600080fd5b610a496120de565b604051600160a060020a03909116815260200160405180910390f35b3415610a7057600080fd5b6104196004356024356120ed565b604051901515815260200160405180910390f35b3415610a9d57600080fd5b6103df61232d565b005b3415610ab257600080fd5b610a49612372565b604051600160a060020a03909116815260200160405180910390f35b3415610ae157600080fd5b6103f4600160a060020a0360043516612381565b60405190815260200160405180910390f35b3415610b1257600080fd5b6103f46123d7565b60405190815260200160405180910390f35b3415610b3757600080fd5b6103df6123dd565b005b3415610b4c57600080fd5b6103df61247b565b005b3415610b6157600080fd5b610b696124fa565b60405180826004811115610b7957fe5b60ff16815260200191505060405180910390f35b3415610b9857600080fd5b610419600160a060020a036004351661254b565b604051901515815260200160405180910390f35b3415610bcb57600080fd5b610419600160a060020a0360043516612575565b604051901515815260200160405180910390f35b3415610bfe57600080fd5b610a4961258a565b604051600160a060020a03909116815260200160405180910390f35b3415610c2d57600080fd5b610419600160a060020a0360043516612599565b604051901515815260200160405180910390f35b3415610c6057600080fd5b6103f4600160a060020a03600435166125e9565b60405190815260200160405180910390f35b3415610c9157600080fd5b6103f46125fb565b60405190815260200160405180910390f35b3415610cb657600080fd5b6103f4612601565b60405190815260200160405180910390f35b3415610cdb57600080fd5b610440612607565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561047d5780820151818401525b602001610464565b50505050905090810190601f1680156104aa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d6657600080fd5b6104196126a5565b604051901515815260200160405180910390f35b3415610d8d57600080fd5b6103df600160a060020a03600435166024356044356126b5565b005b3415610db457600080fd5b61041961279a565b604051901515815260200160405180910390f35b3415610ddb57600080fd5b6104196127c0565b604051901515815260200160405180910390f35b3415610e0257600080fd5b6103df6004356127c9565b005b3415610e1a57600080fd5b6103f46127fe565b60405190815260200160405180910390f35b3415610e3f57600080fd5b6103f4600435602435612804565b60405190815260200160405180910390f35b3415610e6a57600080fd5b6103f461281b565b60405190815260200160405180910390f35b3415610e8f57600080fd5b610419600435612821565b604051901515815260200160405180910390f35b3415610eb957600080fd5b6103f4612847565b60405190815260200160405180910390f35b3415610ede57600080fd5b610419600160a060020a036004351660243561284d565b604051901515815260200160405180910390f35b3415610f1457600080fd5b610419612980565b604051901515815260200160405180910390f35b3415610f3b57600080fd5b6103df600435612b5a565b005b3415610f5357600080fd5b6103f4600160a060020a0360043516612ba2565b60405190815260200160405180910390f35b3415610f8457600080fd5b6103f4612bcc565b60405190815260200160405180910390f35b3415610fa957600080fd5b610fb4600435612bd2565b60405180826002811115610b7957fe5b60ff16815260200191505060405180910390f35b3415610fe357600080fd5b6103f4612c31565b60405190815260200160405180910390f35b341561100857600080fd5b610419612c38565b604051901515815260200160405180910390f35b341561102f57600080fd5b6103f4612c75565b60405190815260200160405180910390f35b341561105457600080fd5b6103f4612c7b565b60405190815260200160405180910390f35b341561107957600080fd5b6103f4600435602435612c81565b60405190815260200160405180910390f35b34156110a457600080fd5b610a49612cb0565b604051600160a060020a03909116815260200160405180910390f35b34156110d357600080fd5b6103f4612cbf565b60405190815260200160405180910390f35b34156110f857600080fd5b610a49612cc5565b604051600160a060020a03909116815260200160405180910390f35b341561112757600080fd5b6103df600160a060020a0360043516612cd4565b005b341561114857600080fd5b6103f4600160a060020a0360043516612e80565b60405190815260200160405180910390f35b341561117957600080fd5b6103f4600160a060020a0360043581169060243516612e92565b60405190815260200160405180910390f35b34156111b057600080fd5b610419600435612ebf565b604051901515815260200160405180910390f35b34156111da57600080fd5b6111e2612f2b565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156112225780820151818401525b602001611209565b505050509050019250505060405180910390f35b341561124157600080fd5b6103f4600435602435612ffc565b60405190815260200160405180910390f35b341561126c57600080fd5b6103f4613016565b60405190815260200160405180910390f35b341561129157600080fd5b6103df600160a060020a036004351661303e565b005b34156112b257600080fd5b6103df600160a060020a0360043516613079565b005b60035433600160a060020a039081169116146112e357600080fd5b60055460009060a060020a900460ff16156112fd57600080fd5b600160a060020a0383166000908152600660205260409020805460ff19168315151790555b5b505b5050565b60145481565b60075460ff1681565b60258054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ce5780601f106113a3576101008083540402835291602001916113ce565b820191906000526020600020905b8154815290600101906020018083116113b157829003601f168201915b505050505081565b60008115806114085750600160a060020a03338116600090815260026020908152604080832093871683529290522054155b151561141357600080fd5b600160a060020a03338116600081815260026020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60035433600160a060020a0390811691161461149857600080fd5b60125483101580156114ac57506013548311155b15156114b757600080fd5b601354601454106114c757600080fd5b6114d28386846130c8565b6014805460010190556114e58583611bf8565b7f6bd11c91e66ab57411c3d72828f939eac4446988c1c1f5862442bf7fa9884e238582848787604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a15b5b5050505050565b60235481565b601f544210155b90565b60155481565b60005481565b601a5481565b60008061157b611554565b151561158657600080fd5b61158f85612599565b151561159a57600080fd5b50600160a060020a03808516600081815260026020908152604080832033909516835293815283822054928252600d905291909120546115d9906131fb565b50826115e486612381565b101580156115f157508215155b80156115fd5750808311155b151561160857600080fd5b600160a060020a0384166000908152600d602052604090205461162a906131fb565b506116358184612804565b600160a060020a0380871660008181526002602090815260408083203390951683529381528382209490945590815260019092529020546116769084612804565b600160a060020a0380871660009081526001602052604080822093909355908616815220546116a59084612ffc565b600160a060020a03808616600081815260016020526040908190209390935591908716906000805160206137058339815191529086905190815260200160405180910390a3600191505b509392505050565b60035433600160a060020a0390811691161461171257600080fd5b60055460009060a060020a900460ff161561172c57600080fd5b60058054600160a060020a031916600160a060020a0384161790555b5b505b50565b600160a060020a033316600090815260106020526040812054819060ff16151560011461177a57600080fd5b600160a060020a0333166000908152601060209081526040808320805460ff191690556022546011909252909120546117b39190612ffc565b600160a060020a0330166000908152600160205260409020549091506117d99082612804565b600160a060020a033081166000908152600160205260408082209390935533909116815220546118099082612ffc565b600160a060020a0333811660008181526001602052604090819020939093559130909116906000805160206137058339815191529084905190815260200160405180910390a3600191505b5090565b60275460ff1681565b60035433600160a060020a0390811691161461187c57600080fd5b601554831015801561189357506016546015540183105b151561189e57600080fd5b601654601754106118ae57600080fd5b6118ba838560006130c8565b6017805460010190558015156118e657600160a060020a0384166000908152600f602052604090204290555b6118f08483611bf8565b7fe79fec6463e59273a1da7bc924872b8b35b64c591ce527b6329f0db8d6be71fd8484604051600160a060020a03909216825260208201526040908101905180910390a15b5b50505050565b6000600161195061194b613016565b61197b565b6000848152600e602052604090206003015491900360020a9081151561197257fe5b0490505b919050565b6000601e548281151561198a57fe5b0460010190505b919050565b600e602052600090815260409020805460018201546002830154600384015460048501546005860154600690960154600160a060020a039095169593949293919290919060ff1687565b6000806119eb611554565b15156119f657600080fd5b438311611a0257600080fd5b611a0b33612599565b1515611a1657600080fd5b50600160a060020a0333166000908152600d6020526040812054905b6000828152600e602052604090206006015460ff166002811115611a5257fe5b14611a5c57600080fd5b611a65816131fb565b50602254600160a060020a0333166000908152600160205260409020541015611a8d57600080fd5b6000818152600e60205260409020600581018590556004810184905560060180546002919060ff19166001835b0217905550600160a060020a033316600090815260016020526040902054602254611ae59190612804565b600160a060020a03338116600090815260016020526040808220939093553090911681522054602254611b189190612ffc565b6001600030600160a060020a0316600160a060020a031681526020019081526020016000208190555030600160a060020a031633600160a060020a031660008051602061370583398151915260225460405190815260200160405180910390a36000818152600e60205260409081902060058101546004909101547f789864ab03bca8d309c9bec6804307cfc416db24eab7873ba7f3df79797b09179284923392909151938452600160a060020a03909216602084015260408084019190915260608301919091526080909101905180910390a1600191505b5092915050565b600160a060020a03331660009081526008602052604090205460ff161515611c1f57600080fd5b60075460ff1615611c2f57600080fd5b611c3b60005482612ffc565b6000908155600160a060020a038316815260016020526040902054611c609082612ffc565b600160a060020a0383166000818152600160205260408082209390935590916000805160206137058339815191529084905190815260200160405180910390a35b5b5b5050565b60086020526000908152604090205460ff1681565b60035433600160a060020a03908116911614611cd757600080fd5b60075460ff1615611ce757600080fd5b600160a060020a03821660009081526008602052604090819020805460ff19168315151790557f4b0adf6c802794c7dde28a08a4e07131abcff3bf9603cd71f14f90bec7865efa908390839051600160a060020a039092168252151560208201526040908101905180910390a15b5b5b5050565b6000611d656124fa565b905060035b816004811115611d7657fe5b1480611d8e575060045b816004811115611d8c57fe5b145b1515611d9957600080fd5b811515611da557600080fd5b600160a060020a033316600090815260016020526040902054611dc89083612804565b600160a060020a03331660009081526001602052604081209190915554611def9083612804565b600055600b54611dff9083612ffc565b600b55600a54600160a060020a031663753e88e5338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611e5857600080fd5b6102c65a03f11515611e6957600080fd5b5050600a54600160a060020a03908116915033167f7e5c344a8141a805725cb476f76c6953b842222b967edd1f78ddb6e8b3f397ac8460405190815260200160405180910390a35b5050565b6000818152600e6020526040812054600160a060020a0316611ed5611554565b15611f0057611ee383612ebf565b15611f0057611ef983611ef4613016565b613321565b9150611f1d565b5b600160a060020a03811660009081526001602052604090205491505b50919050565b601e5481565b60245481565b600f6020526000908152604090205481565b601f5481565b60035433600160a060020a03908116911614611f6257600080fd5b6025828051611f75929160200190613652565b506026818051611f89929160200190613652565b507fd131ab1e6f279deea74e13a18477e13e2107deb6dc8ae955648948be5841fb466025602660405160408082528354600260001961010060018416150201909116049082018190528190602082019060608301908690801561202d5780601f106120025761010080835404028352916020019161202d565b820191906000526020600020905b81548152906001019060200180831161201057829003601f168201915b50508381038252845460026000196101006001841615020190911604808252602090910190859080156120a15780601f10612076576101008083540402835291602001916120a1565b820191906000526020600020905b81548152906001019060200180831161208457829003601f168201915b505094505050505060405180910390a15b5b5050565b60215481565b601d5481565b60106020526000908152604090205460ff1681565b601c5481565b600a54600160a060020a031681565b60008060025b6000858152600e602052604090206006015460ff16600281111561211357fe5b14801561213057506000848152600e602052604090206004015443115b15612159576000848152600e6020526040902060060180546001919060ff191682805b02179055505b506000838152600e6020526040902054600160a060020a031660025b6000858152600e602052604090206006015460ff16600281111561219557fe5b1461219f57600080fd5b6000848152600e60205260409020600501548310156121bd57600080fd5b6000848152600e60205260408120600601805460ff19166001835b0217905550600160a060020a0333166000908152600160205260409020546122009084612804565b600160a060020a033381166000908152600160205260408082209390935530909116815220546122309084612ffc565b600160a060020a0330811660008181526001602052604090819020939093559133909116906000805160206137058339815191529086905190815260200160405180910390a36000848152600e602052604090205461229890600160a060020a031633613420565b1561232157600160a060020a0381166000908152601160209081526040808320869055601090915290819020805460ff191660011790557f72760e46b3824807567c13ec75882de5d9c789a91517ae7b474d2e6b62d3771e9085903390869051928352600160a060020a0390911660208301526040808301919091526060909101905180910390a15b600191505b5092915050565b60035433600160a060020a0390811691161461234857600080fd5b60205460ff16151561235957600080fd5b6007805460ff1916600117905561236e613574565b5b5b565b600954600160a060020a031681565b600160a060020a0381166000908152600d602052604081205480156123b057611ef981611eb5565b9150611f1d565b600160a060020a0383166000908152600160205260409020549150611f1d565b5b50919050565b60175481565b600160a060020a0333166000908152600d60205260408120546123ff81612ebf565b151561240a57600080fd5b600160a060020a0333166000908152600d6020526040902054915060025b6000838152600e602052604090206006015460ff16600281111561244857fe5b1461245257600080fd5b6000828152600e6020526040902060060180546001919060ff191682805b02179055505b5b5050565b60045433600160a060020a0390811691161461249657600080fd5b600454600354600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360045460038054600160a060020a031916600160a060020a039092169190911790555b565b600061250461279a565b15156125125750600161155b565b600a54600160a060020a0316151561252c5750600261155b565b600b54151561253d5750600361155b565b50600461155b565b5b5b5b90565b600160a060020a0381166000908152600d602052604081205461256d90612ebf565b90505b919050565b60066020526000908152604090205460ff1681565b600354600160a060020a031681565b600160a060020a0381166000908152600f60205260409020546001901561197657602354600160a060020a0383166000908152600f602052604090205442031015611976575060005b5b5b919050565b60116020526000908152604090205481565b60195481565b601b5481565b60268054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ce5780601f106113a3576101008083540402835291602001916113ce565b820191906000526020600020905b8154815290600101906020018083116113b157829003601f168201915b505050505081565b60055460a060020a900460ff1681565b60035433600160a060020a039081169116146126d057600080fd5b60185481101580156126e757506019546018540181105b15156126f257600080fd5b601954601a541061270257600080fd5b60055460a060020a900460ff16151560011461271d57600080fd5b612729818460006130c8565b601a805460010190557f5da87a24d5db985862dc335ff32e322d9588ae9b4a971bd1526a58051c8cbaa4836000808585604051600160a060020a03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a15b5b505050565b60055460009060a060020a900460ff1680156127b957506127b96135b7565b5b90505b90565b60205460ff1681565b60035433600160a060020a039081169116146127e457600080fd5b60205460ff16156127f457600080fd5b60218190555b5b50565b60185481565b60008282111561281057fe5b508082035b92915050565b600c5481565b600061282b611554565b151561283657600080fd5b61256d826131fb565b90505b919050565b60135481565b6000612857611554565b151561286257600080fd5b61286b33612599565b151561287657600080fd5b600160a060020a0333166000908152600d6020526040902054612898906131fb565b50816128a333612381565b101580156128b057508115155b15156128bb57600080fd5b600160a060020a0383166000908152600d60205260409020546128dd906131fb565b50600160a060020a0333166000908152600160205260409020546129019083612804565b600160a060020a0333811660009081526001602052604080822093909355908516815220546129309083612ffc565b600160a060020a0380851660008181526001602052604090819020939093559133909116906000805160206137058339815191529085905190815260200160405180910390a35060015b92915050565b600160a060020a0333166000908152600d602052604081205481906129a481612ebf565b15156129af57600080fd5b600160a060020a0333166000908152600d6020908152604080832054808452600e9092529091206004015490925043118015612a0b575060025b6000838152600e602052604090206006015460ff166002811115612a0957fe5b145b15612a34576000828152600e6020526040902060060180546001919060ff191682805b02179055505b60015b6000838152600e602052604090206006015460ff166002811115612a5757fe5b14612a6157600080fd5b6000828152600e60205260408120600601805460ff19166001835b0217905550600160a060020a033016600090815260016020526040902054602254612aa79190612804565b600160a060020a033016600090815260016020526040902055612ac9826131fb565b50600160a060020a033316600090815260016020526040902054602254612af09190612ffc565b600160a060020a03338116600081815260016020908152604080832095909555868252600e905283812060058101829055600401556022549092309092169160008051602061370583398151915291905190815260200160405180910390a3600192505b5b505090565b60035433600160a060020a03908116911614612b7557600080fd5b60055460a060020a900460ff1615612b8c57600080fd5b612b95816135bd565b61174b61232d565b5b5b50565b600160a060020a0381166000908152600d602052604081205461256d9061193c565b90505b919050565b60165481565b6000612bdd82612ebf565b1515612be857600080fd5b506000818152600e60205260409020600681015460049091015460ff9091169043118015612c22575060025b816002811115612c2057fe5b145b15611976575060015b5b919050565b6000545b90565b6000612c42611554565b1515612c4d57600080fd5b600160a060020a0333166000908152600d60205260409020546127b9906131fb565b90505b90565b600b5481565b60125481565b6000828202831580612c9d5750828482811515612c9a57fe5b04145b1515612ca557fe5b8091505b5092915050565b600554600160a060020a031681565b60225481565b600454600160a060020a031681565b612cdc61279a565b1515612ce757600080fd5b600160a060020a0381161515612cfc57600080fd5b60095433600160a060020a03908116911614612d1757600080fd5b60045b612d226124fa565b6004811115612d2d57fe5b1415612d3857600080fd5b600a8054600160a060020a031916600160a060020a038381169190911791829055166361d3d7a66000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612d9657600080fd5b6102c65a03f11515612da757600080fd5b505050604051805190501515612dbc57600080fd5b60008054600a549091600160a060020a0390911690634b2ba0dd90604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515612e0c57600080fd5b6102c65a03f11515612e1d57600080fd5b50505060405180519050141515612e3357600080fd5b600a547f7845d5aa74cc410e35571258d954f23b82276e160fe8c188fa80566580f279cc90600160a060020a0316604051600160a060020a03909116815260200160405180910390a15b50565b600d6020526000908152604090205481565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b60008082118015612ed25750601b548211155b8015612ef457506000828152600e6020526040902054600160a060020a031615155b801561256d57506000828152600e6020908152604080832054600160a060020a03168352600d90915290205482145b90505b919050565b612f336136d1565b612f3b6136d1565b600080601b54604051805910612f4e5750595b908082528060200260200182016040525b50925060009150600190505b601b548111612ff257612f7d81612ebf565b8015612f9a57506000818152600e60205260409020600401544311155b8015612fc6575060025b6000828152600e602052604090206006015460ff166002811115612fc457fe5b145b15612fe95780838381518110612fd857fe5b602090810290910101526001909101905b5b600101612f6b565b8293505b50505090565b600082820183811015612ca557fe5b8091505b5092915050565b6000613020611554565b1561155b57602454601f54420381151561303657fe5b0490505b5b90565b60035433600160a060020a0390811691161461305957600080fd5b60048054600160a060020a031916600160a060020a0383161790555b5b50565b600160a060020a038116151561308e57600080fd5b60095433600160a060020a039081169116146130a957600080fd5b60098054600160a060020a031916600160a060020a0383161790555b50565b60035433600160a060020a039081169116146130e357600080fd5b601b548311156130f257600080fd5b6130fb8261254b565b1561310557600080fd5b61310e83612ebf565b1561311857600080fd5b6000838152600e602090815260408083208054600160a060020a031916600160a060020a0387169081179091558352600d909152902083905561315a836135ff565b6000838152600e60205260409020600101819055613176613016565b600e6000858152602001908152602001600020600201819055507f5fd6d0b7e707fe344bd2a1887f9d0eeea8bfcac6f339ba4200e74f0647f101c08284604051600160a060020a03909216825260208201526040908101905180910390a16000838152600e60205260408120600601805460ff19166001835b02179055505b5b505050565b600080600080600061320c86612ebf565b1561331257613219613016565b6000878152600e6020526040902060020154909450841480159061324f5750600c546000878152600e6020526040902060020154105b15613312576000868152600e6020908152604080832054600160a060020a03168084526001909252822054915490945090925061328c9083612804565b6000556132998685613321565b600160a060020a0384166000908152600160205260408120829055549091506132c29082612ffc565b6000908155868152600e6020526040808220600201869055600160a060020a038516919060008051602061370583398151915290858503905190815260200160405180910390a360019450613318565b5b600094505b50505050919050565b6000828152600e6020908152604080832054600160a060020a031683526001909152812054600c54829081908190819081908190891061336357600c54613365565b885b60008b8152600e602052604090206002015490965060010194505b85851161340f576133908561197b565b601e5460008c8152600e602052604090206003015491955060001990860281019450850160020a908115156133c157fe5b0491508490505b8281111580156133d85750858111155b15613407576133fc87602154600201600a0a8985028115156133f657fe5b04612ffc565b96505b6001016133c8565b809450613380565b8697505b5050505050505092915050565b600160a060020a0382166000908152600d6020526040812054819061344481612ebf565b151561344f57600080fd5b613457611554565b151561346257600080fd5b61346b8461254b565b1561347557600080fd5b600160a060020a0385166000908152600d60205260409020549150613499826131fb565b506000828152600e602081815260408084208054600160a060020a031916600160a060020a038a81169182178355908652600d84528286208890558a168552908420849055858452919052600101556134f0613016565b6000838152600e60205260408082206002810193909355600483018290556005909201557ffb7aaa2ec871044b8cde9fee0cd727b02c8d6caf7aeb7f5fa2e02ffdfe1643349083908790879051928352600160a060020a039182166020840152166040808301919091526060909101905180910390a1600192505b5b505092915050565b60055433600160a060020a0390811691161461358f57600080fd5b6005805474ff0000000000000000000000000000000000000000191660a060020a1790555b5b565b60015b90565b60035433600160a060020a039081169116146135d857600080fd5b60205460ff16156135e857600080fd5b6020805460ff19166001179055601f8190555b5b50565b8061360981612ebf565b151561361457600080fd5b6001601b5403601c54601d5403600184030281151561362f57fe5b601d546000858152600e602052604090209290910490036003909101555b5b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061369357805160ff19168380011785556136c0565b828001600101855582156136c0579182015b828111156136c05782518255916020019190600101906136a5565b5b506118549291506136e3565b5090565b60206040519081016040526000815290565b61155b91905b8082111561185457600081556001016136e9565b5090565b905600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a723058203c8e25f14894b4155b24701de30f025078d8ed7672c303ae840676a0ea8b273f0029

Swarm Source

bzzr://3c8e25f14894b4155b24701de30f025078d8ed7672c303ae840676a0ea8b273f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.