function winnerDecided(uint _hGame, address _winner, uint _winnerBal) public
	{

		if (!validArb(msg.sender, ArbTokFromHGame(_hGame))) {
			StatEvent("Invalid Arb");	
			return; 
		}

		var (valid, pidx) = validPlayer(_hGame, _winner);
		if (!valid) {
			StatEvent("Invalid Player");	
			return;
		}

		arbiter xarb = arbiters[msg.sender];
		gameInstance xgame = games[_hGame];

		uint totalPot = 0;

		if (xgame.playerPots[pidx] < _winnerBal) {
		    abortGame(msg.sender, _hGame, EndReason.erCancel);
  		    return;
		}

		for (uint i = 0; i < xgame.numPlayers; i++) {
			totalPot += xgame.playerPots[i];
		}
		
		uint nportion;
		uint nremnant;
		if (totalPot > 0) {
		 	nportion = totalPot/50; 
			nremnant = totalPot-nportion;
		} else {
			nportion = 0;
			nremnant = 0;
		}
		

		xgame.lastMoved = now;
		xgame.active = false;
		xgame.reasonEnded = EndReason.erWinner;
		xgame.winner = _winner;
		xgame.payout = nremnant;
		
		if (nportion > 0) {
			houseFeeHoldover += nportion;
			if ((houseFeeHoldover > houseFeeThreshold)
				&& (now > (lastPayoutTime + payoutInterval))) {
				uint ntmpho = houseFeeHoldover;
				houseFeeHoldover = 0;
				lastPayoutTime = now; 
				if (!tokenPartner.call.gas(feeGas).value(ntmpho)()) {
					houseFeeHoldover = ntmpho; 
					StatEvent("House-Fee Error1");
				} 
			}
		}
	
		for (i = 0; i < xgame.numPlayers; i++) {
			xgame.playerPots[i] = 0;
		}

		xarb.gamesCompleted++;
		numGamesCompleted++;
		if (nremnant > 0) {
			if (!_winner.call.gas(wpGas).value(uint(nremnant))()) {
				
			        throw; 
			} else {
				StatEventI("Winner Paid", _hGame);		
			}
		}
	}