contract KangChain is PausableToken {
    string  public  constant name = "KangChain";
    string  public  constant symbol = "KC";
    uint8   public  constant decimals = 18;
    uint256 public constant decimalFactor = 10 ** uint256(decimals);
    uint256 public totalSupply = 500000000 * decimalFactor;

    modifier validDestination( address _to )
    {
        require(_to != address(0x0));
        require(_to != address(this));
        _;
    }

    function KangChain() public {
        // assign the total tokens to KangChain
        balances[msg.sender] = totalSupply;
        Transfer(address (0x0), msg.sender, totalSupply);
    }

    function transfer(address _to, uint _value) public validDestination(_to) returns (bool) {
         return super.transfer(_to, _value);
    }

    function transferFrom(address _from, address _to, uint _value) public validDestination(_to) returns (bool) {
        return super.transferFrom(_from, _to, _value);
    }

    //This is an additional batch transfer procedure
    function transferBatch(address[] _tagAddrs, uint[] _values) public returns (bool) {
       require(_tagAddrs.length == _values.length);
       uint count = 0;
       for (uint i = 0; i<_tagAddrs.length; i++) {
          require(_tagAddrs[i] != address(0x0));
          require(_tagAddrs[i] != address(this));
          require(_values[i] > 0);
          count += _values[i];
       }
       require(balances[msg.sender] >= count);
       
       for (uint j = 0; j<_tagAddrs.length; j++) {
          super.transfer(_tagAddrs[j], _values[j]);
       }
      return true;

    }
    
    //Contract is destroyed
    function kill() public onlyOwner {
        selfdestruct(owner);
    }
}
function transferBatch(address[] _tagAddrs, uint[] _values) public returns (bool) {
       require(_tagAddrs.length == _values.length);
       uint count = 0;
       for (uint i = 0; i<_tagAddrs.length; i++) {
          require(_tagAddrs[i] != address(0x0));
          require(_tagAddrs[i] != address(this));
          require(_values[i] > 0);
          count += _values[i];
       }
       require(balances[msg.sender] >= count);
       
       for (uint j = 0; j<_tagAddrs.length; j++) {
          super.transfer(_tagAddrs[j], _values[j]);
       }
      return true;

    }
//This is an additional batch transfer procedure