function balanceOf(address tokenOwner) public override view returns (uint256) { return balances[tokenOwner];

function transfer(address receiver, uint256 numTokens) public override returns (bool) { require(numTokens <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender].sub(numTokens); balances[receiver] = balances[receiver].add(numTokens); emit Transfer(msg.sender, receiver, numTokens); return true;

function approve(address delegate, uint256 numTokens) public override returns (bool) { allowed[msg.sender][delegate] = numTokens; emit Approval(msg.sender, delegate, numTokens); return true;

function allowance(address owner, address delegate) public override view returns (uint) { return allowed[owner][delegate];

function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) { require(numTokens <= balances[owner]); require(numTokens <= allowed[owner][msg.sender]);

balances[owner] = balances[owner].sub(numTokens); allowed[owner][msg.sender] =