diff --git a/css/videolayout_default.css b/css/videolayout_default.css
index b6d0c3c86..f298d05be 100644
--- a/css/videolayout_default.css
+++ b/css/videolayout_default.css
@@ -157,16 +157,6 @@
text-align: center;
}
-#remoteVideos .nick {
- display: none; /* enable when you want nicks to be shown */
- position: absolute;
- left: 0px;
- bottom: -20px;
- z-index: 0;
- width: 100%;
- font-size: 10pt;
-}
-
.videocontainer>span.displayname,
.videocontainer>input.displayname {
display: none;
diff --git a/index.html b/index.html
index 1e6099e4c..7e76891e7 100644
--- a/index.html
+++ b/index.html
@@ -179,7 +179,6 @@
-
@@ -221,7 +220,6 @@
-
diff --git a/interface_config.js b/interface_config.js
index 1509f40b4..aae97d279 100644
--- a/interface_config.js
+++ b/interface_config.js
@@ -29,5 +29,6 @@ var interfaceConfig = {
*/
filmStripOnly: false,
RANDOM_AVATAR_URL_PREFIX: false,
- RANDOM_AVATAR_URL_SUFFIX: false
+ RANDOM_AVATAR_URL_SUFFIX: false,
+ FILM_STRIP_MAX_HEIGHT: 160
};
diff --git a/modules/UI/UI.js b/modules/UI/UI.js
index ff803bf02..601dc7aba 100644
--- a/modules/UI/UI.js
+++ b/modules/UI/UI.js
@@ -16,6 +16,7 @@ import PreziManager from './prezi/Prezi';
import EtherpadManager from './etherpad/Etherpad';
import VideoLayout from "./videolayout/VideoLayout";
+import FilmStrip from "./videolayout/FilmStrip";
import SettingsMenu from "./side_pannels/settings/SettingsMenu";
import Settings from "./../settings/Settings";
import { reload } from '../util/helpers';
@@ -225,11 +226,6 @@ UI.changeDisplayName = function (id, displayName) {
UI.initConference = function () {
let id = APP.conference.localId;
Toolbar.updateRoomUrl(window.location.href);
- let meHTML = APP.translation.generateTranslationHTML("me");
-
- let email = Settings.getEmail();
- let uid = Settings.getUserId();
- $("#localNick").html(email || `${uid} (${meHTML})`);
// Add myself to the contact list.
ContactList.addContact(id);
@@ -244,7 +240,7 @@ UI.initConference = function () {
}
// Make sure we configure our avatar id, before creating avatar for us
- UI.setUserAvatar(id, email);
+ UI.setUserAvatar(id, Settings.getEmail());
Toolbar.checkAutoEnableDesktopSharing();
if(!interfaceConfig.filmStripOnly) {
@@ -293,7 +289,7 @@ function registerListeners() {
function bindEvents() {
function onResize() {
PanelToggler.resizeChat();
- VideoLayout.resizeLargeVideoContainer(PanelToggler.isVisible());
+ VideoLayout.resizeVideoArea(PanelToggler.isVisible());
}
// Resize and reposition videos in full screen mode.
@@ -334,12 +330,13 @@ UI.start = function () {
registerListeners();
BottomToolbar.init();
+ FilmStrip.init();
VideoLayout.init(eventEmitter);
if (!interfaceConfig.filmStripOnly) {
VideoLayout.initLargeVideo(PanelToggler.isVisible());
}
- VideoLayout.resizeLargeVideoContainer(PanelToggler.isVisible(), true);
+ VideoLayout.resizeVideoArea(PanelToggler.isVisible(), true, true);
ContactList.init(eventEmitter);
@@ -367,9 +364,9 @@ UI.start = function () {
});
} else {
$("#header").css("display", "none");
- $("#bottomToolbar").css("display", "none");
$("#downloadlog").css("display", "none");
- BottomToolbar.setupFilmStripOnly();
+ BottomToolbar.hide();
+ FilmStrip.setupFilmStripOnly();
messageHandler.disableNotifications();
$('body').popover("disable");
JitsiPopover.enabled = false;
@@ -586,19 +583,11 @@ UI.toggleSmileys = function () {
Chat.toggleSmileys();
};
-/**
- * Get current settings.
- * @returns {object} settings
- */
-UI.getSettings = function () {
- return Settings.getSettings();
-};
-
/**
* Toggles film strip.
*/
UI.toggleFilmStrip = function () {
- BottomToolbar.toggleFilmStrip();
+ FilmStrip.toggleFilmStrip();
};
/**
diff --git a/modules/UI/audio_levels/AudioLevels.js b/modules/UI/audio_levels/AudioLevels.js
index 437216501..7e1bc68dd 100644
--- a/modules/UI/audio_levels/AudioLevels.js
+++ b/modules/UI/audio_levels/AudioLevels.js
@@ -2,7 +2,7 @@
/* jshint -W101 */
import CanvasUtil from './CanvasUtils';
-import BottomToolbar from '../toolbars/BottomToolbar';
+import FilmStrip from '../videolayout/FilmStrip';
const LOCAL_LEVEL = 'local';
@@ -228,7 +228,7 @@ const AudioLevels = {
let canvasWidth = thumbWidth + interfaceConfig.CANVAS_EXTRA;
let canvasHeight = thumbHeight + interfaceConfig.CANVAS_EXTRA;
- BottomToolbar.getThumbs().children('canvas').each(function () {
+ FilmStrip.getThumbs().children('canvas').each(function () {
$(this).attr('width', canvasWidth);
$(this).attr('height', canvasHeight);
});
diff --git a/modules/UI/etherpad/Etherpad.js b/modules/UI/etherpad/Etherpad.js
index 1ae49289f..f5f58f921 100644
--- a/modules/UI/etherpad/Etherpad.js
+++ b/modules/UI/etherpad/Etherpad.js
@@ -4,7 +4,7 @@ import VideoLayout from "../videolayout/VideoLayout";
import LargeContainer from '../videolayout/LargeContainer';
import UIUtil from "../util/UIUtil";
import SidePanelToggler from "../side_pannels/SidePanelToggler";
-import BottomToolbar from '../toolbars/BottomToolbar';
+import FilmStrip from '../videolayout/FilmStrip';
/**
* Etherpad options.
@@ -101,7 +101,7 @@ class Etherpad extends LargeContainer {
}
resize (containerWidth, containerHeight, animate) {
- let height = containerHeight - BottomToolbar.getFilmStripHeight();
+ let height = containerHeight - FilmStrip.getFilmStripHeight();
let width = containerWidth;
$(this.iframe).width(width).height(height);
diff --git a/modules/UI/prezi/Prezi.js b/modules/UI/prezi/Prezi.js
index c9526b891..da2b41cb5 100644
--- a/modules/UI/prezi/Prezi.js
+++ b/modules/UI/prezi/Prezi.js
@@ -9,7 +9,7 @@ import UIEvents from '../../../service/UI/UIEvents';
import messageHandler from '../util/MessageHandler';
import ToolbarToggler from "../toolbars/ToolbarToggler";
import SidePanelToggler from "../side_pannels/SidePanelToggler";
-import BottomToolbar from '../toolbars/BottomToolbar';
+import FilmStrip from '../videolayout/FilmStrip';
/**
* Example of Prezi link.
@@ -287,7 +287,7 @@ class PreziContainer extends LargeContainer {
}
resize (containerWidth, containerHeight) {
- let height = containerHeight - BottomToolbar.getFilmStripHeight();
+ let height = containerHeight - FilmStrip.getFilmStripHeight();
let width = containerWidth;
diff --git a/modules/UI/side_pannels/SidePanelToggler.js b/modules/UI/side_pannels/SidePanelToggler.js
index 55836556c..bf925daba 100644
--- a/modules/UI/side_pannels/SidePanelToggler.js
+++ b/modules/UI/side_pannels/SidePanelToggler.js
@@ -22,11 +22,16 @@ var currentlyOpen = null;
* @param onOpenComplete function to be called when the panel is opened
* @param onOpen function to be called if the window is going to be opened
* @param onClose function to be called if the window is going to be closed
+ * @param onVideoResizeComplete function to be called after the video area
+ * is resized
*/
-function toggle (object, selector, onOpenComplete, onOpen, onClose) {
+function toggle (object, selector, onOpenComplete,
+ onOpen, onClose, onVideoResizeComplete) {
+ let isSideBarVisible = object.isVisible();
+
UIUtil.buttonClick(buttons[selector], "active");
- if (object.isVisible()) {
+ if (isSideBarVisible) {
$("#toast-container").animate({
right: 5
}, {
@@ -38,12 +43,17 @@ function toggle (object, selector, onOpenComplete, onOpen, onClose) {
queue: false,
duration: 500
});
+
+ resizeVideoArea(isSideBarVisible, onVideoResizeComplete);
+
if(typeof onClose === "function") {
onClose();
}
currentlyOpen = null;
} else {
+ resizeVideoArea(isSideBarVisible, onVideoResizeComplete);
+
// Undock the toolbar when the chat is shown and if we're in a
// video mode.
if (VideoLayout.isLargeVideoVisible()) {
@@ -80,6 +90,13 @@ function toggle (object, selector, onOpenComplete, onOpen, onClose) {
}
}
+function resizeVideoArea(isSidePanelVisible, completeFunction) {
+ VideoLayout.resizeVideoArea(!isSidePanelVisible,
+ false,
+ true,
+ completeFunction);
+}
+
/**
* Toggler for the chat, contact list, settings menu, etc..
*/
@@ -96,11 +113,9 @@ var PanelToggler = {
$('#chatspace').trigger('shown');
};
- VideoLayout.resizeVideoArea(!Chat.isVisible(), chatCompleteFunction);
-
- toggle(Chat,
- '#chatspace',
- function () {
+ toggle(Chat, //Object
+ '#chatspace', // Selector
+ function () { //onOpenComplete
// Request the focus in the nickname field or the chat input
// field.
if ($('#nickname').css('visibility') === 'visible') {
@@ -109,9 +124,9 @@ var PanelToggler = {
$('#usermsg').focus();
}
},
+ () => this.resizeChat(), //OnOpen
null,
- () => this.resizeChat(),
- null);
+ chatCompleteFunction); //OnClose
},
resizeChat () {
@@ -128,7 +143,6 @@ var PanelToggler = {
: function () {
$('#contactlist').trigger('shown');
};
- VideoLayout.resizeVideoArea(!ContactList.isVisible(), completeFunction);
toggle(ContactList,
'#contactlist',
@@ -136,14 +150,14 @@ var PanelToggler = {
function() {
ContactList.setVisualNotification(false);
},
- null);
+ null,
+ completeFunction);
},
/**
* Opens / closes the settings menu
*/
toggleSettingsMenu () {
- VideoLayout.resizeVideoArea(!SettingsMenu.isVisible(), function (){});
toggle(SettingsMenu,
'#settingsmenu',
null,
diff --git a/modules/UI/toolbars/BottomToolbar.js b/modules/UI/toolbars/BottomToolbar.js
index eff37614b..eae97444a 100644
--- a/modules/UI/toolbars/BottomToolbar.js
+++ b/modules/UI/toolbars/BottomToolbar.js
@@ -1,4 +1,4 @@
-/* global $ */
+/* global $, APP, interfaceConfig*/
import UIUtil from '../util/UIUtil';
import UIEvents from '../../../service/UI/UIEvents';
import AnalyticsAdapter from '../../statistics/AnalyticsAdapter';
@@ -11,7 +11,6 @@ const defaultBottomToolbarButtons = {
const BottomToolbar = {
init () {
- this.filmStrip = $('#remoteVideos');
this.toolbar = $('#bottomToolbar');
},
@@ -38,71 +37,43 @@ const BottomToolbar = {
);
},
- toggleFilmStrip () {
- this.filmStrip.toggleClass("hidden");
- },
-
- isFilmStripVisible () {
- return !this.filmStrip.hasClass('hidden');
- },
-
- setupFilmStripOnly () {
- this.filmStrip.css({
- padding: "0px 0px 18px 0px",
- right: 0
- });
- },
-
- getFilmStripHeight () {
- if (this.isFilmStripVisible()) {
- return this.filmStrip.outerHeight();
- } else {
- return 0;
- }
- },
-
- getFilmStripWidth () {
- return this.filmStrip.width();
- },
-
- resizeThumbnails (thumbWidth, thumbHeight,
- animate = false, forceUpdate = false) {
- return new Promise(resolve => {
- this.filmStrip.animate({
- // adds 2 px because of small video 1px border
- height: thumbHeight + 2
- }, {
- queue: false,
- duration: animate ? 500 : 0
- });
-
- this.getThumbs(!forceUpdate).animate({
- height: thumbHeight,
- width: thumbWidth
- }, {
- queue: false,
- duration: animate ? 500 : 0,
- complete: resolve
- });
-
- if (!animate) {
- resolve();
- }
- });
- },
-
resizeToolbar (thumbWidth, thumbHeight) {
let bottom = (thumbHeight - this.toolbar.outerHeight())/2 + 18;
this.toolbar.css({bottom});
},
- getThumbs (only_visible = false) {
- let selector = 'span';
- if (only_visible) {
- selector += ':visible';
- }
+ /**
+ * Returns true if this toolbar is currently visible, or false otherwise.
+ * @return true if currently visible, false - otherwise
+ */
+ isVisible() {
+ return this.toolbar.is(":visible");
+ },
- return this.filmStrip.children(selector);
+ /**
+ * Hides the bottom toolbar with animation or not depending on the animate
+ * parameter.
+ * @param animate true to hide the bottom toolbar with animation,
+ * false or nothing to hide it without animation.
+ */
+ hide(animate) {
+ if (animate)
+ this.toolbar.hide("slide", {direction: "right", duration: 300});
+ else
+ this.toolbar.css("display", "none");
+ },
+
+ /**
+ * Shows the bottom toolbar with animation or not depending on the animate
+ * parameter.
+ * @param animate true to show the bottom toolbar with animation,
+ * false or nothing to show it without animation.
+ */
+ show(animate) {
+ if (animate)
+ this.toolbar.show("slide", {direction: "right", duration: 300});
+ else
+ this.toolbar.css("display", "block");
}
};
diff --git a/modules/UI/toolbars/ToolbarToggler.js b/modules/UI/toolbars/ToolbarToggler.js
index 16c6bb94e..698aef269 100644
--- a/modules/UI/toolbars/ToolbarToggler.js
+++ b/modules/UI/toolbars/ToolbarToggler.js
@@ -2,6 +2,7 @@
import UIUtil from '../util/UIUtil';
import BottomToolbar from './BottomToolbar';
+import FilmStrip from '../videolayout/FilmStrip.js';
let toolbarTimeoutObject;
let toolbarTimeout = interfaceConfig.INITIAL_TOOLBAR_TIMEOUT;
@@ -28,7 +29,6 @@ function hideToolbar() {
}
let header = $("#header");
- let bottomToolbar = $("#bottomToolbar");
let isToolbarHover = false;
header.find('*').each(function () {
let id = $(this).attr('id');
@@ -48,10 +48,8 @@ function hideToolbar() {
} else {
header.hide("slide", { direction: "up", duration: 300});
$('#subject').animate({top: "-=40"}, 300);
- if (!BottomToolbar.isFilmStripVisible()) {
- bottomToolbar.hide(
- "slide", {direction: "right", duration: 300}
- );
+ if (!FilmStrip.isFilmStripVisible()) {
+ BottomToolbar.hide(true);
}
}
}
@@ -65,14 +63,11 @@ const ToolbarToggler = {
return;
}
let header = $("#header");
- let bottomToolbar = $("#bottomToolbar");
- if (!header.is(':visible') || !bottomToolbar.is(":visible")) {
+ if (!header.is(':visible') || !BottomToolbar.isVisible()) {
header.show("slide", { direction: "up", duration: 300});
$('#subject').animate({top: "+=40"}, 300);
- if (!bottomToolbar.is(":visible")) {
- bottomToolbar.show(
- "slide", {direction: "right", duration: 300}
- );
+ if (!BottomToolbar.isVisible()) {
+ BottomToolbar.show(true);
}
if (toolbarTimeoutObject) {
diff --git a/modules/UI/util/UIUtil.js b/modules/UI/util/UIUtil.js
index 50d9f85fa..b31589e7b 100644
--- a/modules/UI/util/UIUtil.js
+++ b/modules/UI/util/UIUtil.js
@@ -32,6 +32,7 @@
return window.innerWidth - rightPanelWidth;
},
+
/**
* Changes the style class of the element given by id.
*/
diff --git a/modules/UI/videolayout/FilmStrip.js b/modules/UI/videolayout/FilmStrip.js
new file mode 100644
index 000000000..2e0a8ce50
--- /dev/null
+++ b/modules/UI/videolayout/FilmStrip.js
@@ -0,0 +1,138 @@
+/* global $, APP, interfaceConfig, config*/
+
+import UIUtil from "../util/UIUtil";
+
+const thumbAspectRatio = 16.0 / 9.0;
+
+const FilmStrip = {
+ init () {
+ this.filmStrip = $('#remoteVideos');
+ },
+
+ toggleFilmStrip () {
+ this.filmStrip.toggleClass("hidden");
+ },
+
+ isFilmStripVisible () {
+ return !this.filmStrip.hasClass('hidden');
+ },
+
+ setupFilmStripOnly () {
+ this.filmStrip.css({
+ padding: "0px 0px 18px 0px",
+ right: 0
+ });
+ },
+
+ getFilmStripHeight () {
+ if (this.isFilmStripVisible()) {
+ return this.filmStrip.outerHeight();
+ } else {
+ return 0;
+ }
+ },
+
+ getFilmStripWidth () {
+ return this.filmStrip.innerWidth()
+ - parseInt(this.filmStrip.css('paddingLeft'), 10)
+ - parseInt(this.filmStrip.css('paddingRight'), 10);
+ },
+
+ /**
+ * Calculates the thumbnail size.
+ * @param videoAreaAvailableWidth the currently available video area width
+ * that we want to take into account when calculating the film strip width.
+ */
+ calculateThumbnailSize (isSideBarVisible) {
+ // Calculate the available height, which is the inner window height
+ // minus 39px for the header minus 2px for the delimiter lines on the
+ // top and bottom of the large video, minus the 36px space inside the
+ // remoteVideos container used for highlighting shadow.
+ let availableHeight = 100;
+
+ let numvids = this.getThumbs(true).length;
+
+ let localVideoContainer = $("#localVideoContainer");
+
+ /**
+ * If the videoAreaAvailableWidth is set we use this one to calculate
+ * the filmStrip width, because we're probably in a state where the
+ * film strip size hasn't been updated yet, but it will be.
+ */
+ let videoAreaAvailableWidth
+ = UIUtil.getAvailableVideoWidth(isSideBarVisible)
+ - parseInt(this.filmStrip.css('right'), 10)
+ - parseInt(this.filmStrip.css('paddingLeft'), 10)
+ - parseInt(this.filmStrip.css('paddingRight'), 10)
+ - parseInt(this.filmStrip.css('borderLeftWidth'), 10)
+ - parseInt(this.filmStrip.css('borderRightWidth'), 10) - 5;
+
+ let availableWidth = Math.floor(
+ (videoAreaAvailableWidth - numvids * (
+ parseInt(localVideoContainer.css('borderLeftWidth'), 10)
+ + parseInt(localVideoContainer.css('borderRightWidth'), 10)
+ + parseInt(localVideoContainer.css('paddingLeft'), 10)
+ + parseInt(localVideoContainer.css('paddingRight'), 10)
+ + parseInt(localVideoContainer.css('marginLeft'), 10)
+ + parseInt(localVideoContainer.css('marginRight'), 10)))
+ / numvids);
+
+ let maxHeight
+ // If the MAX_HEIGHT property hasn't been specified
+ // we have the static value.
+ = Math.min( interfaceConfig.FILM_STRIP_MAX_HEIGHT || 160,
+ availableHeight);
+
+ availableHeight
+ = Math.min( maxHeight,
+ availableWidth / thumbAspectRatio,
+ window.innerHeight - 18);
+
+ if (availableHeight < availableWidth / thumbAspectRatio) {
+ availableWidth = Math.floor(availableHeight * thumbAspectRatio);
+ }
+
+ return {
+ thumbWidth: availableWidth,
+ thumbHeight: availableHeight
+ };
+ },
+
+ resizeThumbnails (thumbWidth, thumbHeight,
+ animate = false, forceUpdate = false) {
+
+ return new Promise(resolve => {
+ this.getThumbs(!forceUpdate).animate({
+ height: thumbHeight,
+ width: thumbWidth
+ }, {
+ queue: false,
+ duration: animate ? 500 : 0,
+ complete: resolve
+ });
+
+ this.filmStrip.animate({
+ // adds 2 px because of small video 1px border
+ height: thumbHeight + 2
+ }, {
+ queue: false,
+ duration: animate ? 500 : 0
+ });
+
+ if (!animate) {
+ resolve();
+ }
+ });
+ },
+
+ getThumbs (only_visible = false) {
+ let selector = 'span';
+ if (only_visible) {
+ selector += ':visible';
+ }
+
+ return this.filmStrip.children(selector);
+ }
+};
+
+export default FilmStrip;
diff --git a/modules/UI/videolayout/LargeVideo.js b/modules/UI/videolayout/LargeVideo.js
index 40148449c..9f27bb8b2 100644
--- a/modules/UI/videolayout/LargeVideo.js
+++ b/modules/UI/videolayout/LargeVideo.js
@@ -4,7 +4,7 @@
import UIUtil from "../util/UIUtil";
import UIEvents from "../../../service/UI/UIEvents";
import LargeContainer from './LargeContainer';
-import BottomToolbar from '../toolbars/BottomToolbar';
+import FilmStrip from './FilmStrip';
import Avatar from "../avatar/Avatar";
import {createDeferred} from '../../util/helpers';
@@ -43,7 +43,7 @@ function getDesktopVideoSize(videoWidth,
let availableWidth = Math.max(videoWidth, videoSpaceWidth);
let availableHeight = Math.max(videoHeight, videoSpaceHeight);
- videoSpaceHeight -= BottomToolbar.getFilmStripHeight();
+ videoSpaceHeight -= FilmStrip.getFilmStripHeight();
if (availableWidth / aspectRatio >= videoSpaceHeight) {
availableHeight = videoSpaceHeight;
diff --git a/modules/UI/videolayout/RemoteVideo.js b/modules/UI/videolayout/RemoteVideo.js
index f0bb32155..d9f4dae10 100644
--- a/modules/UI/videolayout/RemoteVideo.js
+++ b/modules/UI/videolayout/RemoteVideo.js
@@ -15,10 +15,6 @@ function RemoteVideo(id, VideoLayout, emitter) {
this.addRemoteVideoContainer();
this.connectionIndicator = new ConnectionIndicator(this, id);
this.setDisplayName();
- var nickfield = document.createElement('span');
- nickfield.className = "nick";
- nickfield.appendChild(document.createTextNode(id));
- this.container.appendChild(nickfield);
this.bindHoverHandler();
this.flipX = false;
this.isLocal = false;
@@ -33,7 +29,7 @@ RemoteVideo.prototype.addRemoteVideoContainer = function() {
if (APP.conference.isModerator) {
this.addRemoteVideoMenu();
}
- let {thumbWidth, thumbHeight} = this.VideoLayout.calculateThumbnailSize();
+ let {thumbWidth, thumbHeight} = this.VideoLayout.resizeThumbnails();
AudioLevels.updateAudioLevelCanvas(this.id, thumbWidth, thumbHeight);
return this.container;
@@ -46,7 +42,6 @@ RemoteVideo.prototype.addRemoteVideoContainer = function() {
* @param id the id indicating the video for which we're adding a menu.
* @param parentElement the parent element where this menu will be added
*/
-
if (!interfaceConfig.filmStripOnly) {
RemoteVideo.prototype.addRemoteVideoMenu = function () {
var spanElement = document.createElement('span');
diff --git a/modules/UI/videolayout/VideoLayout.js b/modules/UI/videolayout/VideoLayout.js
index b7f20e1e2..730a55dc3 100644
--- a/modules/UI/videolayout/VideoLayout.js
+++ b/modules/UI/videolayout/VideoLayout.js
@@ -4,7 +4,7 @@
import AudioLevels from "../audio_levels/AudioLevels";
import Avatar from "../avatar/Avatar";
import BottomToolbar from "../toolbars/BottomToolbar";
-
+import FilmStrip from "./FilmStrip";
import UIEvents from "../../../service/UI/UIEvents";
import UIUtil from "../util/UIUtil";
@@ -12,6 +12,7 @@ import RemoteVideo from "./RemoteVideo";
import LargeVideoManager, {VideoContainerType} from "./LargeVideo";
import {PreziContainerType} from '../prezi/Prezi';
import LocalVideo from "./LocalVideo";
+import PanelToggler from "../side_pannels/SidePanelToggler";
const RTCUIUtil = JitsiMeetJS.util.RTCUIHelper;
@@ -20,7 +21,6 @@ var remoteVideoTypes = {};
var localVideoThumbnail = null;
var currentDominantSpeaker = null;
-var lastNCount = config.channelLastN;
var localLastNCount = config.channelLastN;
var localLastNSet = [];
var lastNEndpointsCache = [];
@@ -34,8 +34,6 @@ var eventEmitter = null;
*/
var focusedVideoResourceJid = null;
-const thumbAspectRatio = 16.0 / 9.0;
-
/**
* On contact list item clicked.
*/
@@ -98,6 +96,7 @@ var VideoLayout = {
localVideoThumbnail = new LocalVideo(VideoLayout, emitter);
emitter.addListener(UIEvents.CONTACT_CLICKED, onContactClicked);
+ this.lastNCount = config.channelLastN;
},
initLargeVideo (isSideBarVisible) {
@@ -116,9 +115,9 @@ var VideoLayout = {
},
isInLastN (resource) {
- return lastNCount < 0 || // lastN is disabled
+ return this.lastNCount < 0 || // lastN is disabled
// lastNEndpoints cache not built yet
- (lastNCount > 0 && !lastNEndpointsCache.length) ||
+ (this.lastNCount > 0 && !lastNEndpointsCache.length) ||
(lastNEndpointsCache &&
lastNEndpointsCache.indexOf(resource) !== -1);
},
@@ -149,9 +148,8 @@ var VideoLayout = {
let localId = APP.conference.localId;
this.onVideoTypeChanged(localId, stream.videoType);
- let {thumbWidth, thumbHeight} = this.calculateThumbnailSize();
- AudioLevels.updateAudioLevelCanvas(
- null, thumbWidth, thumbHeight);
+ let {thumbWidth, thumbHeight} = this.resizeThumbnails(false, true);
+ AudioLevels.updateAudioLevelCanvas(null, thumbWidth, thumbHeight);
if (!stream.isMuted()) {
localVideoThumbnail.changeVideo(stream);
@@ -221,7 +219,7 @@ var VideoLayout = {
electLastVisibleVideo () {
// pick the last visible video in the row
// if nobody else is left, this picks the local video
- let thumbs = BottomToolbar.getThumbs(true).filter('[id!="mixedstream"]');
+ let thumbs = FilmStrip.getThumbs(true).filter('[id!="mixedstream"]');
let lastVisible = thumbs.filter(':visible:last');
if (lastVisible.length) {
@@ -235,7 +233,7 @@ var VideoLayout = {
}
console.info("Last visible video no longer exists");
- thumbs = BottomToolbar.getThumbs();
+ thumbs = FilmStrip.getThumbs();
if (thumbs.length) {
let id = getPeerContainerResourceId(thumbs[0]);
if (remoteVideos[id]) {
@@ -271,7 +269,10 @@ var VideoLayout = {
onRemoteStreamRemoved (stream) {
let id = stream.getParticipantId();
- remoteVideos[id].removeRemoteStreamElement(stream);
+ let remoteVideo = remoteVideos[id];
+ if (remoteVideo) { // remote stream may be removed after participant left the conference
+ remoteVideo.removeRemoteStreamElement(stream);
+ }
},
/**
@@ -345,7 +346,7 @@ var VideoLayout = {
// In case this is not currently in the last n we don't show it.
if (localLastNCount && localLastNCount > 0 &&
- BottomToolbar.getThumbs().length >= localLastNCount + 2) {
+ FilmStrip.getThumbs().length >= localLastNCount + 2) {
remoteVideo.showPeerContainer('hide');
} else {
VideoLayout.resizeThumbnails(false, true);
@@ -356,8 +357,8 @@ var VideoLayout = {
console.info(resourceJid + " video is now active", videoelem);
- $(videoelem).show();
- VideoLayout.resizeThumbnails();
+ VideoLayout.resizeThumbnails(
+ false, false, false, function() {$(videoelem).show();});
// Update the large video to the last added video only if there's no
// current dominant, focused speaker or prezi playing or update it to
@@ -411,74 +412,33 @@ var VideoLayout = {
localVideoThumbnail.showAudioIndicator(isMuted);
},
- /**
- * Resizes the large video container.
- */
- resizeLargeVideoContainer (isSideBarVisible, forceUpdate) {
- let animate = false;
- if (largeVideo) {
- largeVideo.updateContainerSize(isSideBarVisible);
- largeVideo.resize(animate);
- }
- this.resizeVideoSpace(animate, isSideBarVisible);
- this.resizeThumbnails(false, forceUpdate);
- },
-
/**
* Resizes thumbnails.
*/
- resizeThumbnails (animate = false, forceUpdate = false) {
- let {thumbWidth, thumbHeight} = this.calculateThumbnailSize();
+ resizeThumbnails ( animate = false,
+ forceUpdate = false,
+ isSideBarVisible = null,
+ onComplete = null) {
+ isSideBarVisible
+ = (isSideBarVisible !== null)
+ ? isSideBarVisible : PanelToggler.isVisible();
+
+ let {thumbWidth, thumbHeight}
+ = FilmStrip.calculateThumbnailSize(isSideBarVisible);
$('.userAvatar').css('left', (thumbWidth - thumbHeight) / 2);
- BottomToolbar.resizeThumbnails(thumbWidth, thumbHeight,
+ FilmStrip.resizeThumbnails(thumbWidth, thumbHeight,
animate, forceUpdate)
.then(function () {
BottomToolbar.resizeToolbar(thumbWidth, thumbHeight);
AudioLevels.updateCanvasSize(thumbWidth, thumbHeight);
+ if (onComplete && typeof onComplete === "function")
+ onComplete();
});
+ return {thumbWidth, thumbHeight};
},
- /**
- * Calculates the thumbnail size.
- *
- */
- calculateThumbnailSize () {
- let videoSpaceWidth = BottomToolbar.getFilmStripWidth();
- // Calculate the available height, which is the inner window height
- // minus 39px for the header minus 2px for the delimiter lines on the
- // top and bottom of the large video, minus the 36px space inside the
- // remoteVideos container used for highlighting shadow.
- let availableHeight = 100;
-
- let numvids = BottomToolbar.getThumbs().length;
- if (localLastNCount && localLastNCount > 0) {
- numvids = Math.min(localLastNCount + 1, numvids);
- }
-
- // Remove the 3px borders arround videos and border around the remote
- // videos area and the 4 pixels between the local video and the others
- //TODO: Find out where the 4 pixels come from and remove them
- let availableWinWidth = videoSpaceWidth - 2 * 3 * numvids - 70 - 4;
-
- let availableWidth = availableWinWidth / numvids;
- let maxHeight = Math.min(160, availableHeight);
- availableHeight
- = Math.min( maxHeight,
- availableWidth / thumbAspectRatio,
- window.innerHeight - 18);
-
- if (availableHeight < availableWidth / thumbAspectRatio) {
- availableWidth = Math.floor(availableHeight * thumbAspectRatio);
- }
-
- return {
- thumbWidth: availableWidth,
- thumbHeight: availableHeight
- };
- },
-
/**
* On audio muted event.
*/
@@ -575,8 +535,8 @@ var VideoLayout = {
* endpoints
*/
onLastNEndpointsChanged (lastNEndpoints, endpointsEnteringLastN) {
- if (lastNCount !== lastNEndpoints.length)
- lastNCount = lastNEndpoints.length;
+ if (this.lastNCount !== lastNEndpoints.length)
+ this.lastNCount = lastNEndpoints.length;
lastNEndpointsCache = lastNEndpoints;
@@ -591,8 +551,8 @@ var VideoLayout = {
// enters E's local LastN ejecting C.
// Increase the local LastN set size, if necessary.
- if (lastNCount > localLastNCount) {
- localLastNCount = lastNCount;
+ if (this.lastNCount > localLastNCount) {
+ localLastNCount = this.lastNCount;
}
// Update the local LastN set preserving the order in which the
@@ -613,7 +573,7 @@ var VideoLayout = {
var updateLargeVideo = false;
// Handle LastN/local LastN changes.
- BottomToolbar.getThumbs().each(( index, element ) => {
+ FilmStrip.getThumbs().each(( index, element ) => {
var resourceJid = getPeerContainerResourceId(element);
var smallVideo = remoteVideos[resourceJid];
@@ -667,7 +627,8 @@ var VideoLayout = {
endpointsEnteringLastN.forEach(function (resourceJid) {
var remoteVideo = remoteVideos[resourceJid];
- remoteVideo.showPeerContainer('show');
+ if (remoteVideo)
+ remoteVideo.showPeerContainer('show');
if (!remoteVideo.isVisible()) {
console.log("Add to last N", resourceJid);
@@ -840,40 +801,31 @@ var VideoLayout = {
* Resizes the video area.
*
* @param isSideBarVisible indicates if the side bar is currently visible
- * @param callback a function to be called when the video space is
+ * @param forceUpdate indicates that hidden thumbnails will be shown
+ * @param completeFunction a function to be called when the video area is
* resized.
- */
- resizeVideoArea (isSideBarVisible, callback) {
- let animate = true;
+ */resizeVideoArea (isSideBarVisible,
+ forceUpdate = false,
+ animate = false,
+ completeFunction = null) {
if (largeVideo) {
largeVideo.updateContainerSize(isSideBarVisible);
largeVideo.resize(animate);
- this.resizeVideoSpace(animate, isSideBarVisible, callback);
}
- VideoLayout.resizeThumbnails(animate);
- },
-
- /**
- * Resizes the #videospace html element
- * @param animate boolean property that indicates whether the resize should
- * be animated or not.
- * @param isChatVisible boolean property that indicates whether the chat
- * area is displayed or not.
- * If that parameter is null the method will check the chat panel
- * visibility.
- * @param completeFunction a function to be called when the video space
- * is resized.
- */
- resizeVideoSpace (animate, isChatVisible, completeFunction) {
+ // Calculate available width and height.
let availableHeight = window.innerHeight;
- let availableWidth = UIUtil.getAvailableVideoWidth(isChatVisible);
+ let availableWidth = UIUtil.getAvailableVideoWidth(isSideBarVisible);
if (availableWidth < 0 || availableHeight < 0) {
return;
}
+ // Resize the thumbnails first.
+ this.resizeThumbnails(false, forceUpdate, isSideBarVisible);
+
+ // Resize the video area element.
$('#videospace').animate({
right: window.innerWidth - availableWidth,
width: availableWidth,
diff --git a/modules/keyboardshortcut/keyboardshortcut.js b/modules/keyboardshortcut/keyboardshortcut.js
index c43e8c43d..4f48af97d 100644
--- a/modules/keyboardshortcut/keyboardshortcut.js
+++ b/modules/keyboardshortcut/keyboardshortcut.js
@@ -47,7 +47,6 @@ function initShortcutHandlers() {
};
}
-
var KeyboardShortcut = {
init: function () {
initShortcutHandlers();
diff --git a/modules/settings/Settings.js b/modules/settings/Settings.js
index 3b4deb369..8b9a545f7 100644
--- a/modules/settings/Settings.js
+++ b/modules/settings/Settings.js
@@ -1,9 +1,7 @@
-import {generateUsername} from '../util/UsernameGenerator';
import UIUtil from '../UI/util/UIUtil';
let email = '';
let displayName = '';
-let userId;
let language = null;
let cameraDeviceId = '';
let micDeviceId = '';
@@ -32,7 +30,6 @@ if (supportsLocalStorage()) {
console.log("generated id", window.localStorage.jitsiMeetId);
}
- userId = window.localStorage.jitsiMeetId || '';
email = window.localStorage.email || '';
displayName = UIUtil.unescapeHtml(window.localStorage.displayname || '');
language = window.localStorage.language;
@@ -43,7 +40,6 @@ if (supportsLocalStorage()) {
);
} else {
console.log("local storage is not supported");
- userId = generateUniqueId();
}
export default {
@@ -67,31 +63,23 @@ export default {
},
/**
- * Returns id of the user.
- * @returns {string} user id
+ * Sets new email for local user and saves it to the local storage.
+ * @param {string} newEmail new email for the local user
*/
- getUserId () {
- return userId;
- },
-
setEmail: function (newEmail) {
email = newEmail;
window.localStorage.email = newEmail;
return email;
},
+ /**
+ * Returns email address of the local user.
+ * @returns {string} email
+ */
getEmail: function () {
return email;
},
- getSettings: function () {
- return {
- email: email,
- displayName: displayName,
- uid: userId,
- language: language
- };
- },
getLanguage () {
return language;
},
diff --git a/modules/util/UsernameGenerator.js b/modules/util/UsernameGenerator.js
deleted file mode 100644
index f894f57ff..000000000
--- a/modules/util/UsernameGenerator.js
+++ /dev/null
@@ -1,425 +0,0 @@
-import RandomUtil from './RandomUtil';
-
-/**
- * from faker.js - Copyright (c) 2014-2015 Matthew Bergman & Marak Squires
- * MIT License
- * http://github.com/marak/faker.js/
- *
- * @const
- */
-var names = [
- "Aaliyah", "Aaron", "Abagail", "Abbey", "Abbie", "Abbigail",
- "Abby", "Abdiel", "Abdul", "Abdullah", "Abe", "Abel", "Abelardo", "Abigail",
- "Abigale", "Abigayle", "Abner", "Abraham", "Ada", "Adah", "Adalberto",
- "Adaline", "Adam", "Adan", "Addie", "Addison", "Adela", "Adelbert", "Adele",
- "Adelia", "Adeline", "Adell", "Adella", "Adelle", "Aditya", "Adolf", "Adolfo",
- "Adolph", "Adolphus", "Adonis", "Adrain", "Adrian", "Adriana", "Adrianna",
- "Adriel", "Adrien", "Adrienne", "Afton", "Aglae", "Agnes", "Agustin",
- "Agustina", "Ahmad", "Ahmed", "Aida", "Aidan", "Aiden", "Aileen", "Aimee",
- "Aisha", "Aiyana", "Akeem", "Al", "Alaina", "Alan", "Alana", "Alanis",
- "Alanna", "Alayna", "Alba", "Albert", "Alberta", "Albertha", "Alberto",
- "Albin", "Albina", "Alda", "Alden", "Alec", "Aleen", "Alejandra",
- "Alejandrin", "Alek", "Alena", "Alene", "Alessandra", "Alessandro", "Alessia",
- "Aletha", "Alex", "Alexa", "Alexander", "Alexandra", "Alexandre",
- "Alexandrea", "Alexandria", "Alexandrine", "Alexandro", "Alexane", "Alexanne",
- "Alexie", "Alexis", "Alexys", "Alexzander", "Alf", "Alfonso", "Alfonzo",
- "Alford", "Alfred", "Alfreda", "Alfredo", "Ali", "Alia", "Alice", "Alicia",
- "Alisa", "Alisha", "Alison", "Alivia", "Aliya", "Aliyah", "Aliza", "Alize",
- "Allan", "Allen", "Allene", "Allie", "Allison", "Ally", "Alphonso", "Alta",
- "Althea", "Alva", "Alvah", "Alvena", "Alvera", "Alverta", "Alvina", "Alvis",
- "Alyce", "Alycia", "Alysa", "Alysha", "Alyson", "Alysson", "Amalia", "Amanda",
- "Amani", "Amara", "Amari", "Amaya", "Amber", "Ambrose", "Amelia", "Amelie",
- "Amely", "America", "Americo", "Amie", "Amina", "Amir", "Amira", "Amiya",
- "Amos", "Amparo", "Amy", "Amya", "Ana", "Anabel", "Anabelle", "Anahi",
- "Anais", "Anastacio", "Anastasia", "Anderson", "Andre", "Andreane",
- "Andreanne", "Andres", "Andrew", "Andy", "Angel", "Angela", "Angelica",
- "Angelina", "Angeline", "Angelita", "Angelo", "Angie", "Angus", "Anibal",
- "Anika", "Anissa", "Anita", "Aniya", "Aniyah", "Anjali", "Anna", "Annabel",
- "Annabell", "Annabelle", "Annalise", "Annamae", "Annamarie", "Anne",
- "Annetta", "Annette", "Annie", "Ansel", "Ansley", "Anthony", "Antoinette",
- "Antone", "Antonetta", "Antonette", "Antonia", "Antonietta", "Antonina",
- "Antonio", "Antwan", "Antwon", "Anya", "April", "Ara", "Araceli", "Aracely",
- "Arch", "Archibald", "Ardella", "Arden", "Ardith", "Arely", "Ari", "Ariane",
- "Arianna", "Aric", "Ariel", "Arielle", "Arjun", "Arlene", "Arlie", "Arlo",
- "Armand", "Armando", "Armani", "Arnaldo", "Arne", "Arno", "Arnold", "Arnoldo",
- "Arnulfo", "Aron", "Art", "Arthur", "Arturo", "Arvel", "Arvid", "Arvilla",
- "Aryanna", "Asa", "Asha", "Ashlee", "Ashleigh", "Ashley", "Ashly", "Ashlynn",
- "Ashton", "Ashtyn", "Asia", "Assunta", "Astrid", "Athena", "Aubree", "Aubrey",
- "Audie", "Audra", "Audreanne", "Audrey", "August", "Augusta", "Augustine",
- "Augustus", "Aurelia", "Aurelie", "Aurelio", "Aurore", "Austen", "Austin",
- "Austyn", "Autumn", "Ava", "Avery", "Avis", "Axel", "Ayana", "Ayden", "Ayla",
- "Aylin", "Baby", "Bailee", "Bailey", "Barbara", "Barney", "Baron", "Barrett",
- "Barry", "Bart", "Bartholome", "Barton", "Baylee", "Beatrice", "Beau",
- "Beaulah", "Bell", "Bella", "Belle", "Ben", "Benedict", "Benjamin", "Bennett",
- "Bennie", "Benny", "Benton", "Berenice", "Bernadette", "Bernadine", "Bernard",
- "Bernardo", "Berneice", "Bernhard", "Bernice", "Bernie", "Berniece",
- "Bernita", "Berry", "Bert", "Berta", "Bertha", "Bertram", "Bertrand", "Beryl",
- "Bessie", "Beth", "Bethany", "Bethel", "Betsy", "Bette", "Bettie", "Betty",
- "Bettye", "Beulah", "Beverly", "Bianka", "Bill", "Billie", "Billy", "Birdie",
- "Blair", "Blaise", "Blake", "Blanca", "Blanche", "Blaze", "Bo", "Bobbie",
- "Bobby", "Bonita", "Bonnie", "Boris", "Boyd", "Brad", "Braden", "Bradford",
- "Bradley", "Bradly", "Brady", "Braeden", "Brain", "Brandi", "Brando",
- "Brandon", "Brandt", "Brandy", "Brandyn", "Brannon", "Branson", "Brant",
- "Braulio", "Braxton", "Brayan", "Breana", "Breanna", "Breanne", "Brenda",
- "Brendan", "Brenden", "Brendon", "Brenna", "Brennan", "Brennon", "Brent",
- "Bret", "Brett", "Bria", "Brian", "Briana", "Brianne", "Brice", "Bridget",
- "Bridgette", "Bridie", "Brielle", "Brigitte", "Brionna", "Brisa", "Britney",
- "Brittany", "Brock", "Broderick", "Brody", "Brook", "Brooke", "Brooklyn",
- "Brooks", "Brown", "Bruce", "Bryana", "Bryce", "Brycen", "Bryon", "Buck",
- "Bud", "Buddy", "Buford", "Bulah", "Burdette", "Burley", "Burnice", "Buster",
- "Cade", "Caden", "Caesar", "Caitlyn", "Cale", "Caleb", "Caleigh", "Cali",
- "Calista", "Callie", "Camden", "Cameron", "Camila", "Camilla", "Camille",
- "Camren", "Camron", "Camryn", "Camylle", "Candace", "Candelario", "Candice",
- "Candida", "Candido", "Cara", "Carey", "Carissa", "Carlee", "Carleton",
- "Carley", "Carli", "Carlie", "Carlo", "Carlos", "Carlotta", "Carmel",
- "Carmela", "Carmella", "Carmelo", "Carmen", "Carmine", "Carol", "Carolanne",
- "Carole", "Carolina", "Caroline", "Carolyn", "Carolyne", "Carrie", "Carroll",
- "Carson", "Carter", "Cary", "Casandra", "Casey", "Casimer", "Casimir",
- "Casper", "Cassandra", "Cassandre", "Cassidy", "Cassie", "Catalina",
- "Caterina", "Catharine", "Catherine", "Cathrine", "Cathryn", "Cathy", "Cayla",
- "Ceasar", "Cecelia", "Cecil", "Cecile", "Cecilia", "Cedrick", "Celestine",
- "Celestino", "Celia", "Celine", "Cesar", "Chad", "Chadd", "Chadrick", "Chaim",
- "Chance", "Chandler", "Chanel", "Chanelle", "Charity", "Charlene", "Charles",
- "Charley", "Charlie", "Charlotte", "Chase", "Chasity", "Chauncey", "Chaya",
- "Chaz", "Chelsea", "Chelsey", "Chelsie", "Chesley", "Chester", "Chet",
- "Cheyanne", "Cheyenne", "Chloe", "Chris", "Christ", "Christa", "Christelle",
- "Christian", "Christiana", "Christina", "Christine", "Christop", "Christophe",
- "Christopher", "Christy", "Chyna", "Ciara", "Cicero", "Cielo", "Cierra",
- "Cindy", "Citlalli", "Clair", "Claire", "Clara", "Clarabelle", "Clare",
- "Clarissa", "Clark", "Claud", "Claude", "Claudia", "Claudie", "Claudine",
- "Clay", "Clemens", "Clement", "Clementina", "Clementine", "Clemmie", "Cleo",
- "Cleora", "Cleta", "Cletus", "Cleve", "Cleveland", "Clifford", "Clifton",
- "Clint", "Clinton", "Clotilde", "Clovis", "Cloyd", "Clyde", "Coby", "Cody",
- "Colby", "Cole", "Coleman", "Colin", "Colleen", "Collin", "Colt", "Colten",
- "Colton", "Columbus", "Concepcion", "Conner", "Connie", "Connor", "Conor",
- "Conrad", "Constance", "Constantin", "Consuelo", "Cooper", "Cora", "Coralie",
- "Corbin", "Cordelia", "Cordell", "Cordia", "Cordie", "Corene", "Corine",
- "Cornelius", "Cornell", "Corrine", "Cortez", "Cortney", "Cory", "Coty",
- "Courtney", "Coy", "Craig", "Crawford", "Creola", "Cristal", "Cristian",
- "Cristina", "Cristobal", "Cristopher", "Cruz", "Crystal", "Crystel", "Cullen",
- "Curt", "Curtis", "Cydney", "Cynthia", "Cyril", "Cyrus", "Dagmar", "Dahlia",
- "Daija", "Daisha", "Daisy", "Dakota", "Dale", "Dallas", "Dallin", "Dalton",
- "Damaris", "Dameon", "Damian", "Damien", "Damion", "Damon", "Dan", "Dana",
- "Dandre", "Dane", "D'angelo", "Dangelo", "Danial", "Daniela", "Daniella",
- "Danielle", "Danika", "Dannie", "Danny", "Dante", "Danyka", "Daphne",
- "Daphnee", "Daphney", "Darby", "Daren", "Darian", "Dariana", "Darien",
- "Dario", "Darion", "Darius", "Darlene", "Daron", "Darrel", "Darrell",
- "Darren", "Darrick", "Darrin", "Darrion", "Darron", "Darryl", "Darwin",
- "Daryl", "Dashawn", "Dasia", "Dave", "David", "Davin", "Davion", "Davon",
- "Davonte", "Dawn", "Dawson", "Dax", "Dayana", "Dayna", "Dayne", "Dayton",
- "Dean", "Deangelo", "Deanna", "Deborah", "Declan", "Dedric", "Dedrick", "Dee",
- "Deion", "Deja", "Dejah", "Dejon", "Dejuan", "Delaney", "Delbert", "Delfina",
- "Delia", "Delilah", "Dell", "Della", "Delmer", "Delores", "Delpha", "Delphia",
- "Delphine", "Delta", "Demarco", "Demarcus", "Demario", "Demetris",
- "Demetrius", "Demond", "Dena", "Denis", "Dennis", "Deon", "Deondre",
- "Deontae", "Deonte", "Dereck", "Derek", "Derick", "Deron", "Derrick",
- "Deshaun", "Deshawn", "Desiree", "Desmond", "Dessie", "Destany", "Destin",
- "Destinee", "Destiney", "Destini", "Destiny", "Devan", "Devante", "Deven",
- "Devin", "Devon", "Devonte", "Devyn", "Dewayne", "Dewitt", "Dexter",
- "Diamond", "Diana", "Dianna", "Diego", "Dillan", "Dillon", "Dimitri", "Dina",
- "Dino", "Dion", "Dixie", "Dock", "Dolly", "Dolores", "Domenic", "Domenica",
- "Domenick", "Domenico", "Domingo", "Dominic", "Dominique", "Don", "Donald",
- "Donato", "Donavon", "Donna", "Donnell", "Donnie", "Donny", "Dora", "Dorcas",
- "Dorian", "Doris", "Dorothea", "Dorothy", "Dorris", "Dortha", "Dorthy",
- "Doug", "Douglas", "Dovie", "Doyle", "Drake", "Drew", "Duane", "Dudley",
- "Dulce", "Duncan", "Durward", "Dustin", "Dusty", "Dwight", "Dylan", "Earl",
- "Earlene", "Earline", "Earnest", "Earnestine", "Easter", "Easton", "Ebba",
- "Ebony", "Ed", "Eda", "Edd", "Eddie", "Eden", "Edgar", "Edgardo", "Edison",
- "Edmond", "Edmund", "Edna", "Eduardo", "Edward", "Edwardo", "Edwin", "Edwina",
- "Edyth", "Edythe", "Effie", "Efrain", "Efren", "Eileen", "Einar", "Eino",
- "Eladio", "Elaina", "Elbert", "Elda", "Eldon", "Eldora", "Eldred", "Eldridge",
- "Eleanora", "Eleanore", "Eleazar", "Electa", "Elena", "Elenor", "Elenora",
- "Eleonore", "Elfrieda", "Eli", "Elian", "Eliane", "Elias", "Eliezer",
- "Elijah", "Elinor", "Elinore", "Elisa", "Elisabeth", "Elise", "Eliseo",
- "Elisha", "Elissa", "Eliza", "Elizabeth", "Ella", "Ellen", "Ellie", "Elliot",
- "Elliott", "Ellis", "Ellsworth", "Elmer", "Elmira", "Elmo", "Elmore", "Elna",
- "Elnora", "Elody", "Eloisa", "Eloise", "Elouise", "Eloy", "Elroy", "Elsa",
- "Else", "Elsie", "Elta", "Elton", "Elva", "Elvera", "Elvie", "Elvis", "Elwin",
- "Elwyn", "Elyse", "Elyssa", "Elza", "Emanuel", "Emelia", "Emelie", "Emely",
- "Emerald", "Emerson", "Emery", "Emie", "Emil", "Emile", "Emilia", "Emiliano",
- "Emilie", "Emilio", "Emily", "Emma", "Emmalee", "Emmanuel", "Emmanuelle",
- "Emmet", "Emmett", "Emmie", "Emmitt", "Emmy", "Emory", "Ena", "Enid", "Enoch",
- "Enola", "Enos", "Enrico", "Enrique", "Ephraim", "Era", "Eriberto", "Eric",
- "Erica", "Erich", "Erick", "Ericka", "Erik", "Erika", "Erin", "Erling",
- "Erna", "Ernest", "Ernestina", "Ernestine", "Ernesto", "Ernie", "Ervin",
- "Erwin", "Eryn", "Esmeralda", "Esperanza", "Esta", "Esteban", "Estefania",
- "Estel", "Estell", "Estella", "Estelle", "Estevan", "Esther", "Estrella",
- "Etha", "Ethan", "Ethel", "Ethelyn", "Ethyl", "Ettie", "Eudora", "Eugene",
- "Eugenia", "Eula", "Eulah", "Eulalia", "Euna", "Eunice", "Eusebio", "Eva",
- "Evalyn", "Evan", "Evangeline", "Evans", "Eve", "Eveline", "Evelyn",
- "Everardo", "Everett", "Everette", "Evert", "Evie", "Ewald", "Ewell",
- "Ezekiel", "Ezequiel", "Ezra", "Fabian", "Fabiola", "Fae", "Fannie", "Fanny",
- "Fatima", "Faustino", "Fausto", "Favian", "Fay", "Faye", "Federico",
- "Felicia", "Felicita", "Felicity", "Felipa", "Felipe", "Felix", "Felton",
- "Fermin", "Fern", "Fernando", "Ferne", "Fidel", "Filiberto", "Filomena",
- "Finn", "Fiona", "Flavie", "Flavio", "Fleta", "Fletcher", "Flo", "Florence",
- "Florencio", "Florian", "Florida", "Florine", "Flossie", "Floy", "Floyd",
- "Ford", "Forest", "Forrest", "Foster", "Frances", "Francesca", "Francesco",
- "Francis", "Francisca", "Francisco", "Franco", "Frank", "Frankie", "Franz",
- "Fred", "Freda", "Freddie", "Freddy", "Frederic", "Frederick", "Frederik",
- "Frederique", "Fredrick", "Fredy", "Freeda", "Freeman", "Freida", "Frida",
- "Frieda", "Friedrich", "Fritz", "Furman", "Gabe", "Gabriel", "Gabriella",
- "Gabrielle", "Gaetano", "Gage", "Gail", "Gardner", "Garett", "Garfield",
- "Garland", "Garnet", "Garnett", "Garret", "Garrett", "Garrick", "Garrison",
- "Garry", "Garth", "Gaston", "Gavin", "Gay", "Gayle", "Gaylord", "Gene",
- "General", "Genesis", "Genevieve", "Gennaro", "Genoveva", "Geo", "Geoffrey",
- "George", "Georgette", "Georgiana", "Georgianna", "Geovanni", "Geovanny",
- "Geovany", "Gerald", "Geraldine", "Gerard", "Gerardo", "Gerda", "Gerhard",
- "Germaine", "German", "Gerry", "Gerson", "Gertrude", "Gia", "Gianni",
- "Gideon", "Gilbert", "Gilberto", "Gilda", "Giles", "Gillian", "Gina", "Gino",
- "Giovani", "Giovanna", "Giovanni", "Giovanny", "Gisselle", "Giuseppe",
- "Gladyce", "Gladys", "Glen", "Glenda", "Glenna", "Glennie", "Gloria",
- "Godfrey", "Golda", "Golden", "Gonzalo", "Gordon", "Grace", "Gracie",
- "Graciela", "Grady", "Graham", "Grant", "Granville", "Grayce", "Grayson",
- "Green", "Greg", "Gregg", "Gregoria", "Gregorio", "Gregory", "Greta",
- "Gretchen", "Greyson", "Griffin", "Grover", "Guadalupe", "Gudrun", "Guido",
- "Guillermo", "Guiseppe", "Gunnar", "Gunner", "Gus", "Gussie", "Gust",
- "Gustave", "Guy", "Gwen", "Gwendolyn", "Hadley", "Hailee", "Hailey", "Hailie",
- "Hal", "Haleigh", "Haley", "Halie", "Halle", "Hallie", "Hank", "Hanna",
- "Hannah", "Hans", "Hardy", "Harley", "Harmon", "Harmony", "Harold",
- "Harrison", "Harry", "Harvey", "Haskell", "Hassan", "Hassie", "Hattie",
- "Haven", "Hayden", "Haylee", "Hayley", "Haylie", "Hazel", "Hazle", "Heath",
- "Heather", "Heaven", "Heber", "Hector", "Heidi", "Helen", "Helena", "Helene",
- "Helga", "Hellen", "Helmer", "Heloise", "Henderson", "Henri", "Henriette",
- "Henry", "Herbert", "Herman", "Hermann", "Hermina", "Herminia", "Herminio",
- "Hershel", "Herta", "Hertha", "Hester", "Hettie", "Hilario", "Hilbert",
- "Hilda", "Hildegard", "Hillard", "Hillary", "Hilma", "Hilton", "Hipolito",
- "Hiram", "Hobart", "Holden", "Hollie", "Hollis", "Holly", "Hope", "Horace",
- "Horacio", "Hortense", "Hosea", "Houston", "Howard", "Howell", "Hoyt",
- "Hubert", "Hudson", "Hugh", "Hulda", "Humberto", "Hunter", "Hyman", "Ian",
- "Ibrahim", "Icie", "Ida", "Idell", "Idella", "Ignacio", "Ignatius", "Ike",
- "Ila", "Ilene", "Iliana", "Ima", "Imani", "Imelda", "Immanuel", "Imogene",
- "Ines", "Irma", "Irving", "Irwin", "Isaac", "Isabel", "Isabell", "Isabella",
- "Isabelle", "Isac", "Isadore", "Isai", "Isaiah", "Isaias", "Isidro", "Ismael",
- "Isobel", "Isom", "Israel", "Issac", "Itzel", "Iva", "Ivah", "Ivory", "Ivy",
- "Izabella", "Izaiah", "Jabari", "Jace", "Jacey", "Jacinthe", "Jacinto",
- "Jack", "Jackeline", "Jackie", "Jacklyn", "Jackson", "Jacky", "Jaclyn",
- "Jacquelyn", "Jacques", "Jacynthe", "Jada", "Jade", "Jaden", "Jadon", "Jadyn",
- "Jaeden", "Jaida", "Jaiden", "Jailyn", "Jaime", "Jairo", "Jakayla", "Jake",
- "Jakob", "Jaleel", "Jalen", "Jalon", "Jalyn", "Jamaal", "Jamal", "Jamar",
- "Jamarcus", "Jamel", "Jameson", "Jamey", "Jamie", "Jamil", "Jamir", "Jamison",
- "Jammie", "Jan", "Jana", "Janae", "Jane", "Janelle", "Janessa", "Janet",
- "Janice", "Janick", "Janie", "Janis", "Janiya", "Jannie", "Jany", "Jaquan",
- "Jaquelin", "Jaqueline", "Jared", "Jaren", "Jarod", "Jaron", "Jarred",
- "Jarrell", "Jarret", "Jarrett", "Jarrod", "Jarvis", "Jasen", "Jasmin",
- "Jason", "Jasper", "Jaunita", "Javier", "Javon", "Javonte", "Jay", "Jayce",
- "Jaycee", "Jayda", "Jayde", "Jayden", "Jaydon", "Jaylan", "Jaylen", "Jaylin",
- "Jaylon", "Jayme", "Jayne", "Jayson", "Jazlyn", "Jazmin", "Jazmyn", "Jazmyne",
- "Jean", "Jeanette", "Jeanie", "Jeanne", "Jed", "Jedediah", "Jedidiah", "Jeff",
- "Jefferey", "Jeffery", "Jeffrey", "Jeffry", "Jena", "Jenifer", "Jennie",
- "Jennifer", "Jennings", "Jennyfer", "Jensen", "Jerad", "Jerald", "Jeramie",
- "Jeramy", "Jerel", "Jeremie", "Jeremy", "Jermain", "Jermaine", "Jermey",
- "Jerod", "Jerome", "Jeromy", "Jerrell", "Jerrod", "Jerrold", "Jerry", "Jess",
- "Jesse", "Jessica", "Jessie", "Jessika", "Jessy", "Jessyca", "Jesus", "Jett",
- "Jettie", "Jevon", "Jewel", "Jewell", "Jillian", "Jimmie", "Jimmy", "Jo",
- "Joan", "Joana", "Joanie", "Joanne", "Joannie", "Joanny", "Joany", "Joaquin",
- "Jocelyn", "Jodie", "Jody", "Joe", "Joel", "Joelle", "Joesph", "Joey",
- "Johan", "Johann", "Johanna", "Johathan", "John", "Johnathan", "Johnathon",
- "Johnnie", "Johnny", "Johnpaul", "Johnson", "Jolie", "Jon", "Jonas",
- "Jonatan", "Jonathan", "Jonathon", "Jordan", "Jordane", "Jordi", "Jordon",
- "Jordy", "Jordyn", "Jorge", "Jose", "Josefa", "Josefina", "Joseph",
- "Josephine", "Josh", "Joshua", "Joshuah", "Josiah", "Josiane", "Josianne",
- "Josie", "Josue", "Jovan", "Jovani", "Jovanny", "Jovany", "Joy", "Joyce",
- "Juana", "Juanita", "Judah", "Judd", "Jude", "Judge", "Judson", "Judy",
- "Jules", "Julia", "Julian", "Juliana", "Julianne", "Julie", "Julien",
- "Juliet", "Julio", "Julius", "June", "Junior", "Junius", "Justen", "Justice",
- "Justina", "Justine", "Juston", "Justus", "Justyn", "Juvenal", "Juwan",
- "Kacey", "Kaci", "Kacie", "Kade", "Kaden", "Kadin", "Kaela", "Kaelyn", "Kaia",
- "Kailee", "Kailey", "Kailyn", "Kaitlin", "Kaitlyn", "Kale", "Kaleb",
- "Kaleigh", "Kaley", "Kali", "Kallie", "Kameron", "Kamille", "Kamren",
- "Kamron", "Kamryn", "Kane", "Kara", "Kareem", "Karelle", "Karen", "Kari",
- "Kariane", "Karianne", "Karina", "Karine", "Karl", "Karlee", "Karley",
- "Karli", "Karlie", "Karolann", "Karson", "Kasandra", "Kasey", "Kassandra",
- "Katarina", "Katelin", "Katelyn", "Katelynn", "Katharina", "Katherine",
- "Katheryn", "Kathleen", "Kathlyn", "Kathryn", "Kathryne", "Katlyn", "Katlynn",
- "Katrina", "Katrine", "Kattie", "Kavon", "Kay", "Kaya", "Kaycee", "Kayden",
- "Kayla", "Kaylah", "Kaylee", "Kayleigh", "Kayley", "Kayli", "Kaylie",
- "Kaylin", "Keagan", "Keanu", "Keara", "Keaton", "Keegan", "Keeley", "Keely",
- "Keenan", "Keira", "Keith", "Kellen", "Kelley", "Kelli", "Kellie", "Kelly",
- "Kelsi", "Kelsie", "Kelton", "Kelvin", "Ken", "Kendall", "Kendra", "Kendrick",
- "Kenna", "Kennedi", "Kennedy", "Kenneth", "Kennith", "Kenny", "Kenton",
- "Kenya", "Kenyatta", "Kenyon", "Keon", "Keshaun", "Keshawn", "Keven", "Kevin",
- "Kevon", "Keyon", "Keyshawn", "Khalid", "Khalil", "Kian", "Kiana", "Kianna",
- "Kiara", "Kiarra", "Kiel", "Kiera", "Kieran", "Kiley", "Kim", "Kimberly",
- "King", "Kip", "Kira", "Kirk", "Kirsten", "Kirstin", "Kitty", "Kobe", "Koby",
- "Kody", "Kolby", "Kole", "Korbin", "Korey", "Kory", "Kraig", "Kris", "Krista",
- "Kristian", "Kristin", "Kristina", "Kristofer", "Kristoffer", "Kristopher",
- "Kristy", "Krystal", "Krystel", "Krystina", "Kurt", "Kurtis", "Kyla", "Kyle",
- "Kylee", "Kyleigh", "Kyler", "Kylie", "Kyra", "Lacey", "Lacy", "Ladarius",
- "Lafayette", "Laila", "Laisha", "Lamar", "Lambert", "Lamont", "Lance",
- "Landen", "Lane", "Laney", "Larissa", "Laron", "Larry", "Larue", "Laura",
- "Laurel", "Lauren", "Laurence", "Lauretta", "Lauriane", "Laurianne", "Laurie",
- "Laurine", "Laury", "Lauryn", "Lavada", "Lavern", "Laverna", "Laverne",
- "Lavina", "Lavinia", "Lavon", "Lavonne", "Lawrence", "Lawson", "Layla",
- "Layne", "Lazaro", "Lea", "Leann", "Leanna", "Leanne", "Leatha", "Leda",
- "Lee", "Leif", "Leila", "Leilani", "Lela", "Lelah", "Leland", "Lelia",
- "Lempi", "Lemuel", "Lenna", "Lennie", "Lenny", "Lenora", "Lenore", "Leo",
- "Leola", "Leon", "Leonard", "Leonardo", "Leone", "Leonel", "Leonie", "Leonor",
- "Leonora", "Leopold", "Leopoldo", "Leora", "Lera", "Lesley", "Leslie",
- "Lesly", "Lessie", "Lester", "Leta", "Letha", "Letitia", "Levi", "Lew",
- "Lewis", "Lexi", "Lexie", "Lexus", "Lia", "Liam", "Liana", "Libbie", "Libby",
- "Lila", "Lilian", "Liliana", "Liliane", "Lilla", "Lillian", "Lilliana",
- "Lillie", "Lilly", "Lily", "Lilyan", "Lina", "Lincoln", "Linda", "Lindsay",
- "Lindsey", "Linnea", "Linnie", "Linwood", "Lionel", "Lisa", "Lisandro",
- "Lisette", "Litzy", "Liza", "Lizeth", "Lizzie", "Llewellyn", "Lloyd", "Logan",
- "Lois", "Lola", "Lolita", "Loma", "Lon", "London", "Lonie", "Lonnie", "Lonny",
- "Lonzo", "Lora", "Loraine", "Loren", "Lorena", "Lorenz", "Lorenza", "Lorenzo",
- "Lori", "Lorine", "Lorna", "Lottie", "Lou", "Louie", "Louisa", "Lourdes",
- "Louvenia", "Lowell", "Loy", "Loyal", "Loyce", "Lucas", "Luciano", "Lucie",
- "Lucienne", "Lucile", "Lucinda", "Lucio", "Lucious", "Lucius", "Lucy",
- "Ludie", "Ludwig", "Lue", "Luella", "Luigi", "Luis", "Luisa", "Lukas", "Lula",
- "Lulu", "Luna", "Lupe", "Lura", "Lurline", "Luther", "Luz", "Lyda", "Lydia",
- "Lyla", "Lynn", "Lyric", "Lysanne", "Mabel", "Mabelle", "Mable", "Mac",
- "Macey", "Maci", "Macie", "Mack", "Mackenzie", "Macy", "Madaline", "Madalyn",
- "Maddison", "Madeline", "Madelyn", "Madelynn", "Madge", "Madie", "Madilyn",
- "Madisen", "Madison", "Madisyn", "Madonna", "Madyson", "Mae", "Maegan",
- "Maeve", "Mafalda", "Magali", "Magdalen", "Magdalena", "Maggie", "Magnolia",
- "Magnus", "Maia", "Maida", "Maiya", "Major", "Makayla", "Makenna", "Makenzie",
- "Malachi", "Malcolm", "Malika", "Malinda", "Mallie", "Mallory", "Malvina",
- "Mandy", "Manley", "Manuel", "Manuela", "Mara", "Marc", "Marcel", "Marcelina",
- "Marcelino", "Marcella", "Marcelle", "Marcellus", "Marcelo", "Marcia",
- "Marco", "Marcos", "Marcus", "Margaret", "Margarete", "Margarett",
- "Margaretta", "Margarette", "Margarita", "Marge", "Margie", "Margot",
- "Margret", "Marguerite", "Maria", "Mariah", "Mariam", "Marian", "Mariana",
- "Mariane", "Marianna", "Marianne", "Mariano", "Maribel", "Marie", "Mariela",
- "Marielle", "Marietta", "Marilie", "Marilou", "Marilyne", "Marina", "Mario",
- "Marion", "Marisa", "Marisol", "Maritza", "Marjolaine", "Marjorie", "Marjory",
- "Mark", "Markus", "Marlee", "Marlen", "Marlene", "Marley", "Marlin", "Marlon",
- "Marques", "Marquis", "Marquise", "Marshall", "Marta", "Martin", "Martina",
- "Martine", "Marty", "Marvin", "Mary", "Maryam", "Maryjane", "Maryse", "Mason",
- "Mateo", "Mathew", "Mathias", "Mathilde", "Matilda", "Matilde", "Matt",
- "Matteo", "Mattie", "Maud", "Maude", "Maudie", "Maureen", "Maurice",
- "Mauricio", "Maurine", "Maverick", "Mavis", "Max", "Maxie", "Maxime",
- "Maximilian", "Maximillia", "Maximillian", "Maximo", "Maximus", "Maxine",
- "Maxwell", "May", "Maya", "Maybell", "Maybelle", "Maye", "Maymie", "Maynard",
- "Mayra", "Mazie", "Mckayla", "Mckenna", "Mckenzie", "Meagan", "Meaghan",
- "Meda", "Megane", "Meggie", "Meghan", "Mekhi", "Melany", "Melba", "Melisa",
- "Melissa", "Mellie", "Melody", "Melvin", "Melvina", "Melyna", "Melyssa",
- "Mercedes", "Meredith", "Merl", "Merle", "Merlin", "Merritt", "Mertie",
- "Mervin", "Meta", "Mia", "Micaela", "Micah", "Michael", "Michaela", "Michale",
- "Micheal", "Michel", "Michele", "Michelle", "Miguel", "Mikayla", "Mike",
- "Mikel", "Milan", "Miles", "Milford", "Miller", "Millie", "Milo", "Milton",
- "Mina", "Minerva", "Minnie", "Miracle", "Mireille", "Mireya", "Misael",
- "Missouri", "Misty", "Mitchel", "Mitchell", "Mittie", "Modesta", "Modesto",
- "Mohamed", "Mohammad", "Mohammed", "Moises", "Mollie", "Molly", "Mona",
- "Monica", "Monique", "Monroe", "Monserrat", "Monserrate", "Montana", "Monte",
- "Monty", "Morgan", "Moriah", "Morris", "Mortimer", "Morton", "Mose", "Moses",
- "Moshe", "Mossie", "Mozell", "Mozelle", "Muhammad", "Muriel", "Murl",
- "Murphy", "Murray", "Mustafa", "Mya", "Myah", "Mylene", "Myles", "Myra",
- "Myriam", "Myrl", "Myrna", "Myron", "Myrtice", "Myrtie", "Myrtis", "Myrtle",
- "Nadia", "Nakia", "Name", "Nannie", "Naomi", "Naomie", "Napoleon", "Narciso",
- "Nash", "Nasir", "Nat", "Natalia", "Natalie", "Natasha", "Nathan",
- "Nathanael", "Nathanial", "Nathaniel", "Nathen", "Nayeli", "Neal", "Ned",
- "Nedra", "Neha", "Neil", "Nelda", "Nella", "Nelle", "Nellie", "Nels",
- "Nelson", "Neoma", "Nestor", "Nettie", "Neva", "Newell", "Newton", "Nia",
- "Nicholas", "Nicholaus", "Nichole", "Nick", "Nicklaus", "Nickolas", "Nico",
- "Nicola", "Nicolas", "Nicole", "Nicolette", "Nigel", "Nikita", "Nikki",
- "Nikko", "Niko", "Nikolas", "Nils", "Nina", "Noah", "Noble", "Noe", "Noel",
- "Noelia", "Noemi", "Noemie", "Noemy", "Nola", "Nolan", "Nona", "Nora",
- "Norbert", "Norberto", "Norene", "Norma", "Norris", "Norval", "Norwood",
- "Nova", "Novella", "Nya", "Nyah", "Nyasia", "Obie", "Oceane", "Ocie",
- "Octavia", "Oda", "Odell", "Odessa", "Odie", "Ofelia", "Okey", "Ola", "Olaf",
- "Ole", "Olen", "Oleta", "Olga", "Olin", "Oliver", "Ollie", "Oma", "Omari",
- "Omer", "Ona", "Onie", "Opal", "Ophelia", "Ora", "Oral", "Oran", "Oren",
- "Orie", "Orin", "Orion", "Orland", "Orlando", "Orlo", "Orpha", "Orrin",
- "Orval", "Orville", "Osbaldo", "Osborne", "Oscar", "Osvaldo", "Oswald",
- "Oswaldo", "Otha", "Otho", "Otilia", "Otis", "Ottilie", "Ottis", "Otto",
- "Ova", "Owen", "Ozella", "Pablo", "Paige", "Palma", "Pamela", "Pansy",
- "Paolo", "Paris", "Parker", "Pascale", "Pasquale", "Pat", "Patience",
- "Patricia", "Patrick", "Patsy", "Pattie", "Paul", "Paula", "Pauline",
- "Paxton", "Payton", "Pearl", "Pearlie", "Pearline", "Pedro", "Peggie",
- "Penelope", "Percival", "Percy", "Perry", "Pete", "Peter", "Petra", "Peyton",
- "Philip", "Phoebe", "Phyllis", "Pierce", "Pierre", "Pietro", "Pink", "Pinkie",
- "Piper", "Polly", "Porter", "Precious", "Presley", "Preston", "Price",
- "Prince", "Princess", "Priscilla", "Providenci", "Prudence", "Queen",
- "Queenie", "Quentin", "Quincy", "Quinn", "Quinten", "Quinton", "Rachael",
- "Rachel", "Rachelle", "Rae", "Raegan", "Rafael", "Rafaela", "Raheem",
- "Rahsaan", "Rahul", "Raina", "Raleigh", "Ralph", "Ramiro", "Ramon", "Ramona",
- "Randal", "Randall", "Randi", "Randy", "Ransom", "Raoul", "Raphael",
- "Raphaelle", "Raquel", "Rashad", "Rashawn", "Rasheed", "Raul", "Raven", "Ray",
- "Raymond", "Raymundo", "Reagan", "Reanna", "Reba", "Rebeca", "Rebecca",
- "Rebeka", "Rebekah", "Reece", "Reed", "Reese", "Regan", "Reggie", "Reginald",
- "Reid", "Reilly", "Reina", "Reinhold", "Remington", "Rene", "Renee", "Ressie",
- "Reta", "Retha", "Retta", "Reuben", "Reva", "Rex", "Rey", "Reyes", "Reymundo",
- "Reyna", "Reynold", "Rhea", "Rhett", "Rhianna", "Rhiannon", "Rhoda",
- "Ricardo", "Richard", "Richie", "Richmond", "Rick", "Rickey", "Rickie",
- "Ricky", "Rico", "Rigoberto", "Riley", "Rita", "River", "Robb", "Robbie",
- "Robert", "Roberta", "Roberto", "Robin", "Robyn", "Rocio", "Rocky", "Rod",
- "Roderick", "Rodger", "Rodolfo", "Rodrick", "Rodrigo", "Roel", "Rogelio",
- "Roger", "Rogers", "Rolando", "Rollin", "Roma", "Romaine", "Roman", "Ron",
- "Ronaldo", "Ronny", "Roosevelt", "Rory", "Rosa", "Rosalee", "Rosalia",
- "Rosalind", "Rosalinda", "Rosalyn", "Rosamond", "Rosanna", "Rosario",
- "Roscoe", "Rose", "Rosella", "Roselyn", "Rosemarie", "Rosemary", "Rosendo",
- "Rosetta", "Rosie", "Rosina", "Roslyn", "Ross", "Rossie", "Rowan", "Rowena",
- "Rowland", "Roxane", "Roxanne", "Roy", "Royal", "Royce", "Rozella", "Ruben",
- "Rubie", "Ruby", "Rubye", "Rudolph", "Rudy", "Rupert", "Russ", "Russel",
- "Russell", "Rusty", "Ruth", "Ruthe", "Ruthie", "Ryan", "Ryann", "Ryder",
- "Rylan", "Rylee", "Ryleigh", "Ryley", "Sabina", "Sabrina", "Sabryna", "Sadie",
- "Sadye", "Sage", "Saige", "Sallie", "Sally", "Salma", "Salvador", "Salvatore",
- "Sam", "Samanta", "Samantha", "Samara", "Samir", "Sammie", "Sammy", "Samson",
- "Sandra", "Sandrine", "Sandy", "Sanford", "Santa", "Santiago", "Santina",
- "Santino", "Santos", "Sarah", "Sarai", "Sarina", "Sasha", "Saul", "Savanah",
- "Savanna", "Savannah", "Savion", "Scarlett", "Schuyler", "Scot", "Scottie",
- "Scotty", "Seamus", "Sean", "Sebastian", "Sedrick", "Selena", "Selina",
- "Selmer", "Serena", "Serenity", "Seth", "Shad", "Shaina", "Shakira", "Shana",
- "Shane", "Shanel", "Shanelle", "Shania", "Shanie", "Shaniya", "Shanna",
- "Shannon", "Shanny", "Shanon", "Shany", "Sharon", "Shaun", "Shawn", "Shawna",
- "Shaylee", "Shayna", "Shayne", "Shea", "Sheila", "Sheldon", "Shemar",
- "Sheridan", "Sherman", "Sherwood", "Shirley", "Shyann", "Shyanne", "Sibyl",
- "Sid", "Sidney", "Sienna", "Sierra", "Sigmund", "Sigrid", "Sigurd", "Silas",
- "Sim", "Simeon", "Simone", "Sincere", "Sister", "Skye", "Skyla", "Skylar",
- "Sofia", "Soledad", "Solon", "Sonia", "Sonny", "Sonya", "Sophia", "Sophie",
- "Spencer", "Stacey", "Stacy", "Stan", "Stanford", "Stanley", "Stanton",
- "Stefan", "Stefanie", "Stella", "Stephan", "Stephania", "Stephanie",
- "Stephany", "Stephen", "Stephon", "Sterling", "Steve", "Stevie", "Stewart",
- "Stone", "Stuart", "Summer", "Sunny", "Susan", "Susana", "Susanna", "Susie",
- "Suzanne", "Sven", "Syble", "Sydnee", "Sydney", "Sydni", "Sydnie", "Sylvan",
- "Sylvester", "Sylvia", "Tabitha", "Tad", "Talia", "Talon", "Tamara", "Tamia",
- "Tania", "Tanner", "Tanya", "Tara", "Taryn", "Tate", "Tatum", "Tatyana",
- "Taurean", "Tavares", "Taya", "Taylor", "Teagan", "Ted", "Telly", "Terence",
- "Teresa", "Terrance", "Terrell", "Terrence", "Terrill", "Terry", "Tess",
- "Tessie", "Tevin", "Thad", "Thaddeus", "Thalia", "Thea", "Thelma", "Theo",
- "Theodora", "Theodore", "Theresa", "Therese", "Theresia", "Theron", "Thomas",
- "Thora", "Thurman", "Tia", "Tiana", "Tianna", "Tiara", "Tierra", "Tiffany",
- "Tillman", "Timmothy", "Timmy", "Timothy", "Tina", "Tito", "Titus", "Tobin",
- "Toby", "Tod", "Tom", "Tomas", "Tomasa", "Tommie", "Toney", "Toni", "Tony",
- "Torey", "Torrance", "Torrey", "Toy", "Trace", "Tracey", "Tracy", "Travis",
- "Travon", "Tre", "Tremaine", "Tremayne", "Trent", "Trenton", "Tressa",
- "Tressie", "Treva", "Trever", "Trevion", "Trevor", "Trey", "Trinity",
- "Trisha", "Tristian", "Tristin", "Triston", "Troy", "Trudie", "Trycia",
- "Trystan", "Turner", "Twila", "Tyler", "Tyra", "Tyree", "Tyreek", "Tyrel",
- "Tyrell", "Tyrese", "Tyrique", "Tyshawn", "Tyson", "Ubaldo", "Ulices",
- "Ulises", "Una", "Unique", "Urban", "Uriah", "Uriel", "Ursula", "Vada",
- "Valentin", "Valentina", "Valentine", "Valerie", "Vallie", "Van", "Vance",
- "Vanessa", "Vaughn", "Veda", "Velda", "Vella", "Velma", "Velva", "Vena",
- "Verda", "Verdie", "Vergie", "Verla", "Verlie", "Vern", "Verna", "Verner",
- "Vernice", "Vernie", "Vernon", "Verona", "Veronica", "Vesta", "Vicenta",
- "Vicente", "Vickie", "Vicky", "Victor", "Victoria", "Vida", "Vidal", "Vilma",
- "Vince", "Vincent", "Vincenza", "Vincenzo", "Vinnie", "Viola", "Violet",
- "Violette", "Virgie", "Virgil", "Virginia", "Virginie", "Vita", "Vito",
- "Viva", "Vivian", "Viviane", "Vivianne", "Vivien", "Vivienne", "Vladimir",
- "Wade", "Waino", "Waldo", "Walker", "Wallace", "Walter", "Walton", "Wanda",
- "Ward", "Warren", "Watson", "Wava", "Waylon", "Wayne", "Webster", "Weldon",
- "Wellington", "Wendell", "Wendy", "Werner", "Westley", "Weston", "Whitney",
- "Wilber", "Wilbert", "Wilburn", "Wiley", "Wilford", "Wilfred", "Wilfredo",
- "Wilfrid", "Wilhelm", "Wilhelmine", "Will", "Willa", "Willard", "William",
- "Willie", "Willis", "Willow", "Willy", "Wilma", "Wilmer", "Wilson", "Wilton",
- "Winfield", "Winifred", "Winnifred", "Winona", "Winston", "Woodrow", "Wyatt",
- "Wyman", "Xander", "Xavier", "Xzavier", "Yadira", "Yasmeen", "Yasmin",
- "Yasmine", "Yazmin", "Yesenia", "Yessenia", "Yolanda", "Yoshiko", "Yvette",
- "Yvonne", "Zachariah", "Zachary", "Zachery", "Zack", "Zackary", "Zackery",
- "Zakary", "Zander", "Zane", "Zaria", "Zechariah", "Zelda", "Zella", "Zelma",
- "Zena", "Zetta", "Zion", "Zita", "Zoe", "Zoey", "Zoie", "Zoila", "Zola",
- "Zora", "Zula"
-];
-
-/**
- * Generate random username.
- * @returns {string} random username
- */
-export function generateUsername () {
- var name = RandomUtil.randomElement(names);
- var suffix = RandomUtil.randomAlphanumStr(3);
-
- return name + '-' + suffix;
-}