contract GangToken is MintableToken {

  string public constant name                 = "gangFY";
  string public constant symbol               = "GNGFY";
  uint public constant decimals               = 18;
    
  // uint256 public initial_supply = 1000000 * 10**decimals;
  bool public paused = false;
  uint256 public cap = 2000000000 ether;

  constructor() public {
    // totalSupply_=initial_supply;
    // balances[msg.sender]=totalSupply_;
    // cap = _cap;
    // paused = false;
  }
    
  event Burn(address indexed burner, uint256 value);
    
  /**
  * @dev Burns a specific amount of tokens.
  * @param _value The amount of token to be burned.
  */
    
  function burn(uint256 _value) public {
    balances[msg.sender] = balances[msg.sender].sub(_value);
    totalSupply_ = totalSupply_.sub(_value);

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

  //multisig access
  address public multisig;

  function setupMultisig (address _address) public {
    require (multisig == address(0));
    multisig = _address;
  }

  modifier onlyMultisig() { 
    require (msg.sender == multisig); 
    _;
  }
  
  function mint(address _to, uint256 _amount) onlyMultisig public returns (bool) {
    require(totalSupply_.add(_amount) <= cap);
    super.mint(_to, _amount);
  }

  function finishMinting() onlyMultisig public returns (bool) {
    super.finishMinting();
  } 
}
function burn(uint256 _value) public {
  balances[msg.sender] = balances[msg.sender].sub(_value);
  totalSupply_ = totalSupply_.sub(_value);

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

/**
 * @dev Burns a specific amount of tokens.
 * @param _value The amount of token to be burned.
 */