contract Token is ERC20, ERC20Detailed, ERC20Mintable, ERC20Pausable, Ownable, Reclaimable {

    constructor (string memory name, string memory symbol, uint8 decimals) 
        ERC20Detailed(name, symbol, decimals) public {}

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     * Also transfers Minter and Pauser roles to the new owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
        _addMinter(newOwner);
        _removeMinter(msg.sender);
        _addPauser(newOwner);
        _removePauser(msg.sender);
    }

    /**
     * @dev Bulk mint
     * @param accounts Array of accounts to receive tokens
     * @param amounts Array of amounts to send
     */
    function mint(address[] calldata accounts, uint256[] calldata amounts) external onlyMinter returns (bool) {
        require(accounts.length == amounts.length, "Accounts and amounts should have same length");
        for(uint256 i=0; i < accounts.length; i++){
            _mint(accounts[i], amounts[i]);
        }
        return true;
    }

}
function transferOwnership(address newOwner) public onlyOwner {
    _transferOwnership(newOwner);
    _addMinter(newOwner);
    _removeMinter(msg.sender);
    _addPauser(newOwner);
    _removePauser(msg.sender);
}

/**
 * @dev Transfers ownership of the contract to a new account (`newOwner`).
 * Can only be called by the current owner.
 * Also transfers Minter and Pauser roles to the new owner.
 */