[mb-commits] branch, javascript-cleanup, created. Delete unused javascript (and a few unused templates, images and css files) .

MusicBrainz Git Server noreply at musicbrainz.org
Fri Feb 11 10:09:29 UTC 2011


The branch, javascript-cleanup has been created
        at  b6ac49d1129ced1a8c634150b19ad7c60603a056 (commit)

- Log -----------------------------------------------------------------
commit b6ac49d1129ced1a8c634150b19ad7c60603a056
Author: warp <kuno at frob.nl>
Date:   Fri Feb 11 11:06:50 2011 +0100

    Delete unused javascript (and a few unused templates, images and css files).

diff --git a/root/release/edit.tt b/root/release/edit.tt
deleted file mode 100644
index abd762f..0000000
--- a/root/release/edit.tt
+++ /dev/null
@@ -1,143 +0,0 @@
-[%- BLOCK layout_head -%]
-    <script src="[% c.uri_for('/static/scripts/MB/html.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/MB/utility.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/MB/predicate.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/MB/Control/ArtistCreditEditor.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/MB/Control/InlineDialog.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/MB/Control/Lookup.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/MB/Control/Overlay.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/MB/Control/ToggleButton.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/MB/Control/TableSorting.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/MB/ReleaseEditor/ReleaseLabel.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/release_editor.js') %]" type="text/javascript"></script>
-    <link type="text/css" rel="stylesheet" href="[% c.uri_for('/static/styles/release-editor.css') %]" />
-[%- END -%]
-
-[%- WRAPPER 'layout.tt' edit=1 title='Editing "' _ release.name _ '"' -%]
-    <form action="[% c.req.uri %]" method="post">
-        [% USE r = FormRenderer(form) %]
-        [% INCLUDE 'release/sidebar.tt' editing=1 %]
-
-        <div id="content">
-            <div class="releaseheader">
-                <h1>
-                    “[% r.text('name', id => 'release-name') %]”
-                    <span class="comment">([% r.text('comment', id => 'comment') %])</span>
-                </h1>
-                <div id="release-artist">
-                  <span class="prefix">~</span>
-                  [% l('Release by {artist}', { artist => r.artist_credit_editor('artist_credit') }) %]
-                </div>
-            </div>
-
-            [% INCLUDE 'release/tabs.tt' page='edit'%]
-
-            <fieldset>
-            <legend>[% l('Track listing') %]</legend>
-            <table id="mediums">
-              <tbody>
-                [%- FOR medium=release.mediums -%]
-                [% medium_field = form.field('mediums').field(loop.index) %]
-                <tr>
-                  <td>
-                    [% r.hidden(medium_field.field('id'));
-                       r.hidden(medium_field.field('tracklist').field('id')) %]
-                    <table class="medium tbl" id="[% medium_field.html_name %]">
-                      <thead>
-                        <tr class="subh">
-                          <th class="medium-position">
-                            <span>[% medium.position %]</span>
-                            [% r.hidden(medium_field.field('position'), class => 'medium-position') %]
-                          </th>
-                          <th colspan="3">
-                            [% r.select(medium_field.field('format_id'), class => 'medium-format') %] :
-                            [% r.text(medium_field.field('name'), class => 'medium-name') %]
-                          </th>
-                        </tr>
-                        <tr>
-                          <th class="position">[% l('#') %]</th>
-                          <th class="title">[% l('Title') %]</th>
-                          <th class="artist">[% l('Artist') %]</th>
-                          <th class="length">[% l('Length') %]</th>
-                        </tr>
-                      </thead>
-                      <tfoot />
-                      <tbody>
-                        [%- FOR track=medium.tracklist.tracks -%]
-                        [% track_field = medium_field.field('tracklist').field('tracks').field(loop.index) %]
-                        <tr class="track[% ' ev' IF loop.count % 2 == 0 %]">
-                          <td class="position">
-                            [% r.text(track_field.field('position'), class => 'pos') %]
-                          </td>
-                          <td>
-                            [% r.hidden(track_field.field('id'));
-                               r.text(track_field.field('name'), class => 'track-name') %]
-                          </td>
-                          <td>[% r.artist_credit_editor(track_field.field('artist_credit')) %]</td>
-                          <td>[% r.text(track_field.field('length'), class => 'track-length', size => 5)  %]</td>
-                        </tr>
-                        [%- END -%]
-                      </tbody>
-                    </table>
-                  </td>
-                </tr>
-              [%- END -%]
-              </tbody>
-            </table>
-
-            <table id="new-medium" class="tbl medium" style="display: none">
-                <thead>
-                    <tr class="subh">
-                        <th class="medium-position">
-                            <span></span>
-                            <input type="hidden"/>
-                        </th>
-                        <th colspan="3">
-                           <select class="medium-format">
-                             <option />
-                             [% FOR format = medium_formats %]
-                             <option value="[% format.id %]">[% format.name %]</option>
-                             [% END %]
-                           </select> :
-                           <input class="medium-name" />
-                        </th>
-                    </tr>
-                    <tr>
-                        <th class="position">[% l('#') %]</th>
-                        <th class="title">[% l('Title') %]</th>
-                        <th class="artist">[% l('Artist') %]</th>
-                        <th class="length">[% l('Length') %]</th>
-                    </tr>
-                </thead>
-                <tfoot />
-                <tbody />
-            </table>
-            </fieldset>
-
-            <fieldset>
-                <legend>[% l('Add an existing tracklist') %]</legend>
-                <p>[% l('MusicBrainz supports using the same tracklist over multiple
-                         releases, which is very convenient when the same disc can be found
-                         in multiple releases (for example box sets). If you wish to reuse
-                         an existing tracklist, search for the release name, and drag the
-                         tracklist you wish to use into the release editor above.') %]</p>
-
-                <p>
-                  <label>[% l('Release name:') %]</label>
-                  <input id="existing-release-name" />
-                  <input id="lookup-release" type="button"
-                         value="[% l('Lookup release') %]"
-                         style="margin-right: 10pt"/>
-                </p>
-
-                <div class="results">
-                    <table class="tbl" id="lookup-tracklist-results">
-                    </table>
-                </div>
-            </fieldset>
-
-            [%- INCLUDE 'forms/edit-note.tt' -%]
-            [% enter_edit() %]
-        </div>
-    </form>
-[%- END -%]
diff --git a/root/release/nats.tt b/root/release/nats.tt
deleted file mode 100644
index a2cdc49..0000000
--- a/root/release/nats.tt
+++ /dev/null
@@ -1,22 +0,0 @@
-[% extra_js = 'nats.js jquery/jquery.tablesorter.min.js' %]
-[% extra_css = 'jquery/tablesort.css' %]
-[%- WRAPPER 'artist/layout.tt' title=release.name -%]
-    [% INCLUDE "annotation/annotation.tt" parent=release %]
-    <div class="release">
-        [%- INCLUDE 'release/box-header.tt' -%]
-        <div class="release_top">
-            [%- INCLUDE 'release/info-links.tt' no_tags=1 no_edit_history=1 no_artists=1 no_disc_ids=1 no_google=1 -%]
-            <div class="editLinks">
-                [% IF c.user_exists -%] 
-                    [%- INCLUDE 'components/piped-list.tt' list=[
-                        { link => c.entity_url(release_artist, 'add_non_album'), text => l('Add Non-Album Tracks') }
-                    ] caption=l('Edit:') -%]
-                [%- ELSE -%]
-                    [% l('Please {uri|log in} to edit this list.', {uri => c.uri_for("/user/login")}) %]
-                [%- END -%]
-            </div>
-        </div>
-        [%- INCLUDE 'release/tracks.tt' no_track_numbers=1 -%]
-        [%- INCLUDE 'release/box-summary.tt' no_type=1 no_language=1 no_dq=1 -%]
-    </div>
-[%- END -%]
diff --git a/root/release/show.tt b/root/release/show.tt
deleted file mode 100644
index 686b8c8..0000000
--- a/root/release/show.tt
+++ /dev/null
@@ -1,5 +0,0 @@
-[% extra_js = 'release.js jquery/jquery.tablesorter.min.js' %]
-[% extra_css = 'jquery/tablesort.css' %]
-[% WRAPPER 'artist/layout.tt' title=release.name %]
-    [% INCLUDE 'release/full.tt' %]
-[% END %]
diff --git a/root/scripts/mbArrays.tt b/root/scripts/mbArrays.tt
deleted file mode 100644
index d000417..0000000
--- a/root/scripts/mbArrays.tt
+++ /dev/null
@@ -1 +0,0 @@
-[%- INCLUDE 'scripts/text_strings.tt' -%]
diff --git a/root/scripts/suitereqs.tt b/root/scripts/suitereqs.tt
deleted file mode 100644
index 6676282..0000000
--- a/root/scripts/suitereqs.tt
+++ /dev/null
@@ -1,3 +0,0 @@
-[%# JQuery UI's .js can be lazy loaded, but the JQuery UI .css file has to be pre-loaded, else the browser doesn't load the @includes properly. %]
-[%- scripts_css = "scripts.css jquery/jquery.ui.all.css" -%]
-[%- scripts_js = "common/es_main.js" %]
diff --git a/root/scripts/unit_tests.tt b/root/scripts/unit_tests.tt
deleted file mode 100644
index 435e0bb..0000000
--- a/root/scripts/unit_tests.tt
+++ /dev/null
@@ -1,27 +0,0 @@
-[% BLOCK layout_head %]
-    <script src="[% c.uri_for('/static/scripts/libraries/QUnit.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/MB.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/MB/html.js') %]" type="text/javascript"></script>
-    <script src="[% c.uri_for('/static/scripts/tests/html.js') %]" type="text/javascript"></script>
-    <link rel="stylesheet" href="[% c.uri_for('/static/styles/extra/QUnit.css') %]" type="text/css" />
-[% END %]
-
-[% WRAPPER 'layout.tt' full_width=1 %]
-    <h1>JavaScript Unit Tests</h1>
-    <h2 id="banner"></h2>
-    <h2 id="userAgent"></h2>
-    <ol id="tests"></ol>
-    <div id="main"></div>
-
-    <div id="to_test">
-        <select id="select1"><option>Foo</option></select>
-        <select id="select1">
-            <option>Foo</option>
-            <option>Bar</option>
-        </select>
-        <select id="select1">
-          <option>Foo</option>
-          <option selected="selected">Bar</option>
-        </select>
-    </div>
-[% END %]
diff --git a/root/static/scripts/MB/Control/ArtistCreditEditor.js b/root/static/scripts/MB/Control/ArtistCreditEditor.js
deleted file mode 100644
index 5855b91..0000000
--- a/root/static/scripts/MB/Control/ArtistCreditEditor.js
+++ /dev/null
@@ -1,328 +0,0 @@
-/* Copyright (C) 2009 Oliver Charles
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-(function(MB) {
-    $.extend(MB.url, {
-        ArtistCreditEditor: {
-            removeArtistOn: '/static/images/release_editor/remove-on.png',
-            removeArtistOff: '/static/images/release_editor/remove-off.png'
-        }
-    });
-
-    var currentEditor = undefined;
-
-    MB.Control.ArtistCreditEditor = function(creditContainer, options) {
-        var self = this;
-
-        var fieldMapping = {
-            join_phrase: 'joinPhrase',
-            name: 'altName',
-            artist_id: 'id'
-        };
-
-        function ArtistCredit(artist) {
-            this.row = $(MB.html.tr());
-            this.artist = artist;
-            var thisRow = this;
-
-            $.extend(this, {
-                id: $(MB.html.input({
-                    'class': 'id',
-                    value: artist.id,
-                    type: 'hidden'
-                })),
-                lookup: new MB.Control.EntityLookup('artist', {
-                    defaultValue: artist.name,
-                    idInput: this.id,
-                    selection: function(result) {
-                        thisRow.artist = result;
-                        if(!altNames.is(':checked')) {
-                            thisRow.altName.val(result.name);
-                            updateLivePreview();
-                        }
-                    }
-                }),
-                altName: $(MB.html.input({
-                    value: artist.name,
-                    'class': 'name'
-                })),
-                joinPhrase: $(MB.html.input({
-                    value: artist.joinPhrase,
-                    'class': 'join'
-                })),
-                remove: $(MB.html.input({ type: 'checkbox', 'class': 'removed' }))
-            });
-
-            this.row
-                .append(
-                    $(MB.html.td())
-                        .append('<span class="mover">Move </span>')
-                        .append(this.remove))
-                .append(
-                    $(MB.html.td())
-                        .append(this.lookup.query)
-                        .append(this.id))
-                .append(
-                    $(MB.html.td({ 'class': 'alt-name' })).append(this.altName)
-                        .toggle(altNames.is(':checked'))
-                )
-                .append($(MB.html.td()).append(this.joinPhrase));
-
-            this.removeControl = new MB.Control.ToggleButton({
-                    onImage: MB.url.ArtistCreditEditor.removeArtistOn,
-                    offImage: MB.url.ArtistCreditEditor.removeArtistOff,
-                    toggleOn: function() {
-                        thisRow.row.find('input').attr('disabled', true);
-                        updateLivePreview();
-                        toggleDel();
-                    },
-                    toggleOff: function() {
-                        thisRow.row.find('input').attr('disabled', false);
-                        updateLivePreview();
-                        toggleDel();
-                    }
-                });
-
-            this.removeControl.draw(this.remove);
-        };
-
-        options = $.extend({
-            confirmed: undefined,
-            withAltNames: false
-        }, options);
-
-        // All artist credits
-        var credits = [];       // Users edit this
-        var savedCredits = [];  // Moved to this array when "done" is clicked
-
-        // Contains the whole editor
-        var dialog = new MB.Control.InlineDialog();
-        dialog.dialog.addClass('ac-editor');
-
-        // Artist credit editing table
-        var editor = $(MB.html.table()).append(
-            MB.html.thead(
-                {}, MB.html.tr(
-                    {}, MB.html.th() +
-                        MB.html.th({}, MB.text.Artist) +
-                        MB.html.th({ 'class': 'alt-name' }, MB.text.Name) +
-                        MB.html.th({}, MB.text.JoinPhrase))))
-            .appendTo(dialog.dialog);
-
-        var editorBody = $(MB.html.tbody()).appendTo(editor);
-
-        var creditSorting = new MB.Control.TableSorting({
-            dragHandle: '.mover',
-            dragComplete: function(row, oldTable, origPos, newPos) {
-                var credit = credits[origPos];
-
-                credits.splice(origPos, 1);
-                credits.splice(newPos, 0, credit);
-                updateLivePreview();
-            }
-        });
-        creditSorting.addDragSource(editor);
-        creditSorting.addDropTarget(editor);
-
-        // Row to add a new artist credit
-        var newLookup = new MB.Control.EntityLookup('artist', {
-            selection: function(result) {
-                self.appendArtist(result);
-                newLookup.clear();
-                updateLivePreview();
-            }
-        });
-        var addNew = $(MB.html.div({}, 'Add another artist: '))
-            .append(newLookup.query).appendTo(dialog.dialog);
-
-        // Toggle whether to use alternative names or not
-        var altNames = $(MB.html.input({
-            type: 'checkbox', checked: options.withAltNames ? 'checked' : null
-        })).click(function() {
-            var an = editor.find('.alt-name');
-            if(altNames.is(':checked')) {
-                an.show();
-            }
-            else {
-                an.hide();
-                // Reset all the alt names, then hide
-                $.each(credits, function() { this.altName.val(this.artist.name); });
-            }
-        });
-        dialog.dialog.append(
-            $(MB.html.div())
-                .append(altNames)
-                .append(MB.html.label({}, MB.text.UseAltNames)));
-        editor.find('.alt-name').toggle(altNames.is(':checked'));
-
-        // For confirming/cancelling
-        var cancel = $(MB.html.button({}, MB.text.Cancel));
-        var done = $(MB.html.button({}, MB.text.Done));
-        var buttons = $(MB.html.div({ 'class': 'buttons' }))
-            .append(cancel).append('&nbsp;').append(done).appendTo(dialog.dialog);
-
-        function updateSavedCredits() {
-            $.each(credits, function(i) {
-                var credit = this;
-                if (credit.remove.is(':checked')) {
-                    credit.row.remove();
-                    return;
-                }
-
-                $.each(fieldMapping, function(name, accessor) {
-                    creditContainer.append(MB.html.input({
-                        type: 'hidden',
-                        name: creditContainer.attr('id') + '.names.' + i + '.' + name,
-                        value: credit[accessor].val()
-                    }));
-                });
-            });
-
-            savedCredits = credits = $.grep(credits, function(credit) {
-                return !credit.remove.is(':checked');
-            });
-        }
-
-        done.click(function() {
-            dialog.hide();
-            savedCredits = [];
-
-            creditContainer.empty();
-            updateSavedCredits();
-
-            self.textDisplay.html(createTextRepresentation());
-            currentEditor = undefined;
-
-            if (options.confirmed) {
-                options.confirmed(credits);
-            }
-        });
-        cancel.click(function(event) {
-            event.preventDefault();
-            self.cancel();
-        });
-
-        $.extend(self, {
-            appendArtist: function(artist) {
-                var ac = new ArtistCredit(artist);
-                credits.push(ac);
-                editorBody.append(ac.row);
-                creditSorting.rebind();
-            },
-            openAt: function(node) {
-                if (currentEditor) {
-                    currentEditor.cancel();
-                }
-                dialog.showAt(node);
-                currentEditor = self;
-            },
-            cancel: function() {
-                dialog.hide();
-                editorBody.empty();
-                creditsFromArray(savedCredits);
-                updateLivePreview();
-                currentEditor = undefined;
-            }
-        });
-
-        // Initialize the current artist credit
-        creditsFromContainer();
-        savedCredits = credits;
-        toggleDel();
-
-        // Previews
-        self.textDisplay = $('<span>')
-            .insertBefore(creditContainer)
-            .click(function() {
-                self.openAt(self.textDisplay);
-            }).html(createTextRepresentation());
-
-        var livePreview = $('<span>')
-            .prependTo(dialog.dialog)
-            .before(MB.html.strong({}, MB.text.Preview))
-            .html(createTextRepresentation());
-        $('input', editorBody[0])
-            .live('keyup', updateLivePreview);
-
-        // If we start with no artist credits, show a text box to add an artist
-        if (credits.length === 0) {
-            var startingArtist = new MB.Control.EntityLookup('artist', {
-                selection: function(result) {
-                    startingArtist.query.remove();
-                    self.appendArtist(result);
-                    updateSavedCredits();
-                    self.textDisplay.html(createTextRepresentation());
-                }
-            });
-            self.textDisplay.after(startingArtist.query);
-        }
-
-        function updateLivePreview() {
-            livePreview.html(createTextRepresentation());
-        }
-
-        function createTextRepresentation() {
-            return $.map(credits, function(v) {
-                if (v.remove.is(':checked')) {
-                    return undefined;
-                }
-                else {
-                    return v.altName.val() + v.joinPhrase.val();
-                }
-            }).join('');
-        }
-
-        function creditsFromContainer(creditSep) {
-            creditSep = creditSep || 'div.credit';
-            credits = [];
-            editorBody.empty();
-            creditContainer.find('div.credit').each(function() {
-                var credit = $(this);
-                self.appendArtist({
-                    name: credit.find('input.name').val(),
-                    joinPhrase: credit.find('input.join').val(),
-                    id: credit.find('input.id').val()
-                });
-            }).hide();
-        }
-
-        function creditsFromArray(creditArray) {
-            credits = [];
-            $.each(creditArray, function() {
-                self.appendArtist(this.artist);
-            });
-        }
-
-        function toggleDel() {
-            var rows = editor.find('tr input.removed:not(:checked)');
-            if(rows.length > 1) {
-                editor.find('tr').each(function(i) {
-                    if(!credits[i]) { return false; }
-                    credits[i].removeControl.enable();
-                });
-            } else {
-                var row = rows.closest('tr');
-                $.each(credits, function() {
-                    if (this.row[0] === row[0]) {
-                        this.removeControl.disable();
-                        return false;
-                    }
-                });
-            }
-        }
-    };
-})(MB);
\ No newline at end of file
diff --git a/root/static/scripts/MB/Control/InlineDialog.js b/root/static/scripts/MB/Control/InlineDialog.js
deleted file mode 100644
index 585f572..0000000
--- a/root/static/scripts/MB/Control/InlineDialog.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright (C) 2009 Oliver Charles
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-(function(MB) {
-    MB.Control.InlineDialog = function(options) {
-        var self = this;
-
-        options = $.extend({
-            parent: $('div.br'),
-            minWidth: 300
-        }, options);
-
-        $.extend(self, {
-            width: options.minWidth,
-
-            dialog: $(MB.html.div({
-                style: 'position: absolute',
-                'class': 'dialog'
-            })).hide(),
-
-            showAt: function(control) {
-                var offset = control.offset();
-                var width = Math.max(options.minWidth, self.width);
-                var right = offset.left + width;
-                var maxRight = options.parent.offset().left + options.parent.outerWidth();
-
-                if (right > maxRight) {
-                    offset.left -= (right - maxRight);
-                }
-
-                self.dialog.css({
-                    minWidth: width,
-                    left: offset.left,
-                    top: offset.top + control.get(0).offsetHeight,
-                }).show();
-            },
-
-            hide: function() {
-                self.dialog.hide();
-            },
-        });
-
-        $('body').append(self.dialog);
-    };
-})(MB);
\ No newline at end of file
diff --git a/root/static/scripts/MB/Control/Lookup.js b/root/static/scripts/MB/Control/Lookup.js
deleted file mode 100644
index a67649c..0000000
--- a/root/static/scripts/MB/Control/Lookup.js
+++ /dev/null
@@ -1,204 +0,0 @@
-/* Copyright (C) 2009 Oliver Charles
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-/*jslint */
-/*global MB */
-'use strict';
-
-(function(MB) {
-    var KEY_ESCAPE = 27,
-        KEY_TAB = 9;
-
-    $.extend(MB.url, {
-        EntityLookup: {
-            ajaxSearch: '/ajax/search'
-        }
-    });
-
-    MB.Control.EntityLookup = function(type, options) {
-        var self = this;
-
-        options = $.extend({
-            defaultValue: '',
-            selection: undefined,
-            limit: 8
-        }, options);
-
-        var lastSearch, currentPage = 1;
-
-        // Query field
-        self.query = $( MB.html.input({ value: options.defaultValue }) )
-            .focus(function() { self.showResults(); })
-            .keydown(function(event) {
-                switch (event.keyCode) {
-                case KEY_ESCAPE:
-                case KEY_TAB:
-                    self.hideResults();
-                    break;
-                }
-            });
-
-        // The whole pop-up box
-        var resultContainer = new MB.Control.InlineDialog();
-        resultContainer.dialog.addClass('lookup-results');
-
-        // Information on search results
-        var info = $(MB.html.div({ 'class': 'info' }, MB.text.ClickLookup)).appendTo(resultContainer.dialog);
-
-        // Lookup button
-        $(MB.html.button({}, MB.text.Lookup))
-            .click(function(ev) {
-                ev.preventDefault();
-                self.search(self.query.val(), 1);
-            })
-            .appendTo(resultContainer.dialog);
-
-        // Search results <ul>
-        var results = $(MB.html.ul()).appendTo(resultContainer.dialog);
-
-        // Next/previous page
-        var buttons = $.map([
-            { text: MB.text.Next,     style: 'float: right' },
-            { text: MB.text.Previous, style: 'float: left' }
-        ], function(button) {
-            return $(MB.html.button({}, button.text))
-                .appendTo(resultContainer.dialog)
-                .wrap(MB.html.div({ style: button.style }))
-                .attr('disabled', 'disabled');
-        });
-        self.nextPage = buttons[0].click(function() { self.goToPage(currentPage + 1); });
-        self.prevPage = buttons[1].click(function() { self.goToPage(currentPage - 1); });
-
-        function clearResults() {
-            results.empty();
-        }
-
-        function beforeSearch() {
-            clearResults();
-            info.html(MB.text.Searching);
-            self.nextPage.attr('disabled', 'disabled');
-            self.prevPage.attr('disabled', 'disabled');
-        }
-
-        function makeSelection(event) {
-            event.preventDefault();
-            var selected = $(event.target).closest('li').data('result');
-            $(options.idInput).val(selected.id);
-            self.query.val(selected.name);
-            self.hideResults();
-
-            if (options.selection) {
-                options.selection(selected);
-            }
-        }
-
-        function resultRow(result) {
-            var contents = MB.html.strong({}, result.name);
-            if(result.comment) {
-                contents += ' (' + result.comment + ')'; 
-            }
-            if (result.sort_name) {
-                contents += MB.html.br();
-                contents += MB.html.span({ 'class': 'info' }, result.sort_name);
-            }
-            var row = $(MB.html.li({}, contents));
-            return row.data('result', result).click(function(event) { makeSelection(event); });
-        }
-
-        function bodyClick(ev) {
-            var elm = ev.target;
-            while (elm &&
-                   elm != resultContainer.dialog[0] &&
-                   elm != self.query[0]) {
-                elm = elm.parentNode;
-            }
-            if (!elm) {
-                self.hideResults();
-            }
-        }
-
-        function bindAutoHide() {
-            $('html').click(bodyClick);
-        }
-
-        function unBindAutoHide() {
-            $('html').unbind('click', bodyClick);
-        }
-
-        $.extend(self, {
-            hideResults: function() {
-                resultContainer.hide();
-                unBindAutoHide();
-            },
-            showResults: function() {
-                var inp = self.query;
-                resultContainer.width = inp.width();
-                resultContainer.showAt(inp);
-                bindAutoHide();
-            },
-            clear: function() {
-                clearResults();
-                self.query.val('');
-                info.html(MB.text.ClickLookup);
-            },
-            goToPage: function(page) {
-                self.search(lastSearch, page);
-                currentPage = page;
-            },
-            search: function(query, page) {
-                var limit = options.limit;
-                var offset = limit * (page - 1);
-                lastSearch = query;
-
-                $.ajax({
-                    beforeSend: beforeSearch,
-                    url: MB.url.EntityLookup.ajaxSearch,
-                    error: function() {
-                        info.html(MB.text.SearchErrorOccured);
-                    },
-                    success: function (searchResults) {
-                        if (searchResults.hits) {
-                            info.html(MB.text.SearchInfoFormat
-                                      .replace('#matches#', searchResults.hits)
-                                      .replace('#start#', offset + 1)
-                                      .replace('#end#', offset + searchResults.results.length));
-
-                            self.nextPage.attr('disabled',
-                                               searchResults.hits > offset + limit ? null : 'disabled');
-                            self.prevPage.attr('disabled', page > 1 ? null : 'disabled');
-
-                            $.each(searchResults.results, function(i) {
-                                results.append(
-                                    resultRow(this).addClass(i % 2 ? 'even' : 'odd'));
-                            });
-                        }
-                        else {
-                            info.html(MB.text.NoResults);
-                        }
-                    },
-                    data: {
-                        type: type,
-                        query: query,
-                        offset: offset,
-                        limit: limit
-                    },
-                    dataType: 'json'
-                });
-            }
-        });
-    };
-})(MB);
\ No newline at end of file
diff --git a/root/static/scripts/MB/Control/Overlay.js b/root/static/scripts/MB/Control/Overlay.js
deleted file mode 100644
index b8ce5c8..0000000
--- a/root/static/scripts/MB/Control/Overlay.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Copyright (C) 2009 Oliver Charles
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-/*jslint */
-/*global MB */
-'use strict';
-
-(function(MB) {
-    MB.Control.Overlay = function(content) {
-        var self = this;
-
-        self.overlay = $(content)
-            .click(function() { self.hideOverlay(); })
-            .addClass('overlay');
-
-        var elementToOverlay;
-
-        $.extend(self, {
-            showOverlay: function() {
-                elementToOverlay.hide();
-                self.overlay.show();
-            },
-            hideOverlay: function() {
-                self.overlay.hide();
-                elementToOverlay.show().find(':input:first').add(elementToOverlay).focus();
-            },
-            draw: function(toOverlay) {
-                elementToOverlay = toOverlay;
-                toOverlay.hide().after(self.overlay);
-            }
-        });
-    };
-})(MB);
\ No newline at end of file
diff --git a/root/static/scripts/MB/Control/TableSorting.js b/root/static/scripts/MB/Control/TableSorting.js
deleted file mode 100644
index 2b56dd8..0000000
--- a/root/static/scripts/MB/Control/TableSorting.js
+++ /dev/null
@@ -1,162 +0,0 @@
-/* Copyright (C) 2009 Oliver Charles
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-(function(MB) {
-    MB.Control.TableSorting = function(options) {
-        var self = this;
-
-        options = $.extend({
-            dragComplete: undefined,
-        }, options);
-
-        var currentDrag;
-        var currentOver;
-        var dragTables, dropTables;
-        var insertMethod;
-        var oldTable;
-        var rows;
-        var startPos;
-
-        var dragHelper = $(MB.html.table({
-                             style: 'position: absolute',
-                             'class': 'dragHelper'
-                         }))
-                           .appendTo('body')
-                           .hide();
-        
-
-        function beginDrag(ev) {
-            ev.preventDefault();
-
-            // The cell the user clicked on isn't necessarily the row we want
-            var possible = dragTables.children('tbody').children('tr');
-            var el = ev.target;
-            while (el) {
-                var index = $.inArray(el, possible);
-                if (index !== -1) {
-                    break;
-                }
-                el = el.parentNode;
-            }
-
-            // We didn't find the row at all, cancel the drag event
-            if (!el) {
-                return;
-            }
-
-            $(document)
-                .mousemove(mouseMove)
-                .mouseup(endDrag);
-
-            rows = dropTables.find('> tbody > tr');
-
-            currentDrag = $(el);
-            startPos = currentDrag.prevAll().length;
-            
-            oldTable = currentDrag.parent('table');
-            dragHelper
-                .append(currentDrag.clone())
-                .show();
-
-            mouseMove(ev);
-        }
-
-        function endDrag(ev) {
-            $(document)
-                .unbind('mousemove', mouseMove)
-                .unbind('mouseup', endDrag);
-
-            if(insertMethod === 'before') {
-                currentOver.before(currentDrag);
-            } else {
-                currentOver.after(currentDrag);
-            }
-
-            currentOver.removeClass('overBelow').removeClass('overAbove');
-            dragHelper.hide().empty();
-
-            if (options.dragComplete) {
-                options.dragComplete(currentDrag, oldTable, startPos, currentDrag.prevAll().length);
-            }
-
-            currentDrag = currentOver = oldTable = startPos = null;
-        }
-
-        function above(element, y) {
-            return y <= (element.offset().top + (element.height() / 2));
-        }
-
-        function below(element, y) {
-            return y >= (element.offset().top + (element.height() / 2));
-        }
-
-        function inside(element, y) {
-            var top = element.offset().top;
-            var bot = top + element.height();
-            return y >= top && y <= bot;
-        }
-
-        function setOver(ov) {
-            if (!ov) {
-                return;
-            }
-
-            if (currentOver && ov[0] !== currentOver[0]) {
-                currentOver
-                    .removeClass('overAbove')
-                    .removeClass('overBelow');
-            }
-            
-            currentOver = ov;
-            currentOver
-                .removeClass(insertMethod === 'before' ? 'overBelow' : 'overAbove')
-                .addClass(insertMethod === 'after' ? 'overBelow' : 'overAbove'); 
-        }
-
-        function mouseMove(ev) {
-            var mY = ev.pageY;
-            var over = null;
-            rows.each(function() {
-                over = $(this);
-                if(over === currentDrag) { return false; }
-                insertMethod = above(over, mY) ? 'before' : 'after';
-
-                // Keep looping *until* we find a row that the mouse is in
-                return !inside(over, mY);
-            });
-
-            setOver(over);
-            dragHelper.css({
-                top: mY,
-                left: ev.pageX
-            });
-        }
-
-        $.extend(self, {
-            rebind: function() {
-                dragTables.find(options.dragHandle).mousedown(beginDrag);
-            },
-            addDragSource: function(tab) {
-                dragTables = dragTables ? dragTables.add(tab) : $(tab);
-                dragTables.find(options.dragHandle).mousedown(beginDrag);
-            },
-            addDropTarget: function(tab) {
-                dropTables = dropTables ? dropTables.add(tab) : $(tab);
-            }
-        });
-    };
-})(MB);
\ No newline at end of file
diff --git a/root/static/scripts/MB/Control/ToggleButton.js b/root/static/scripts/MB/Control/ToggleButton.js
deleted file mode 100644
index 5a6b304..0000000
--- a/root/static/scripts/MB/Control/ToggleButton.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Copyright (C) 2009 Oliver Charles
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-(function(MB) {
-    $.extend(MB.url, {
-        ToggleButton: {
-            defaultOn: '/static/images/release_editor/edit-on.png',
-            defaultOff: '/static/images/release_editor/edit-off.png',
-            defaultDisable: '/static/images/release_editor/remove-disabled.png',
-        }
-    });
-
-    MB.Control.ToggleButton = function(options) {
-        var self = this;
-
-        options = $.extend({
-            defaultOn: input ? input.is(':checked') : false,
-            toggleOn: undefined,
-            toggleOff: undefined,
-            onImage: MB.url.ToggleButton.defaultOn,
-            offImage: MB.url.ToggleButton.defaultOff,
-            disableImage: MB.url.ToggleButton.defaultDisable,
-        }, options);
-
-        var state = options.defaultOn;
-        var input;
-
-        self.image = $(MB.html.img({
-            'class': 'image-button',
-            src: state ? options.onImage : options.offImage
-        }));
-
-        $.extend(self, {
-            toggle: function() {
-                state = !state;
-                updateImage();
-                updateCheckbox();
-                fireCallback();
-            },
-            checked: function() {
-                return state;
-            },
-            draw: function(checkbox) {
-                input = $(checkbox);
-                updateCheckbox();
-                self.image.click(self.toggle);
-                input.hide().after(self.image);
-            },
-            enable: function() {
-                input.attr('disabled', false);
-                updateImage();
-                self.image.bind('click', self.toggle);
-            },
-            disable: function() {
-                input.attr('disabled', 'disabled');
-                self.image.attr('src', options.disableImage);
-                self.image.unbind('click', self.toggle);
-            }
-        });
-
-        function updateImage() {
-            self.image.attr('src', state ? options.onImage : options.offImage);
-        }
-
-        function updateCheckbox() {
-            input.attr('checked', state ? 'checked' : false);
-        }
-
-        function fireCallback() {
-            var callback = options[ state ? 'toggleOn' : 'toggleOff' ];
-            if (callback) {
-                callback();
-            }
-        }
-    };
-})(MB);
\ No newline at end of file
diff --git a/root/static/scripts/MB/ReleaseEditor/ReleaseLabel.js b/root/static/scripts/MB/ReleaseEditor/ReleaseLabel.js
deleted file mode 100644
index bd74778..0000000
--- a/root/static/scripts/MB/ReleaseEditor/ReleaseLabel.js
+++ /dev/null
@@ -1,58 +0,0 @@
-(function(MB) {
-    String.prototype.template = function (o) {
-        return this.replace(/#{([^{}]*)}/g,
-            function (a, b) {
-                var r = o[b];
-                return typeof r === 'string' || typeof r === 'number' ?
-                    r : a;
-            }
-        );
-    };
-
-    var newRowTemplate = (
-        '<li class="release-label">' +
-            '<input type="checkbox" name="#{field}.removed" class="remove" /> ' +
-            '<input type="hidden" name="#{field}.label_id" />' +
-            '<input class="label-name" />' +
-            ' &ndash; ' +
-            '<input class="catalog-number" name="#{field}.catalog_number" size="8" />' +
-        '</li>'
-    );
-
-    function createOverlay(input) {
-        var text = input.val() ? MB.html.escape(MB.utility.displayedValue(input))
-                               : MB.text.UnknownPlaceholder;
-        var display = $('<span>#{overlay}</span>'.template({ overlay: text }))
-            .toggleClass('unknown', input.val());
-
-        var overlay = new MB.Control.Overlay(display);
-        overlay.draw(input);
-        return overlay;
-    }
-
-    $.extend(MB, {
-        newRow: function(index) {
-            var row = newRowTemplate.template({ field: 'edit-release.labels.' + index });
-            return $(row);
-        },
-        setupRow: function(row) {
-            row = $(row);
-
-            var removeToggle = new MB.Control.ToggleButton(MB.url.ReleaseEditor.removeImages);
-            removeToggle.draw(row.find('input.remove'));
-
-            var nameInput = row.find('input.label-name');
-            var lookup = new MB.Control.EntityLookup('label', {
-                defaultValue: nameInput.val(),
-                selection: function(result) {
-                    nameOverlay.overlay.text(result.name).removeClass('unknown');
-                    nameOverlay.showOverlay();
-                }
-            });
-            row.find('input.label-name').replaceWith(lookup.query);
-
-            var nameOverlay = createOverlay(lookup.query);
-            var catOverlay  = createOverlay(row.find('input.catalog-number'));
-        }
-    });
-})(MB);
\ No newline at end of file
diff --git a/root/static/scripts/MB/predicate.js b/root/static/scripts/MB/predicate.js
deleted file mode 100644
index da4bfa8..0000000
--- a/root/static/scripts/MB/predicate.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Copyright (C) 2009 Oliver Charles
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-(function(MB) {
-    $.extend(MB.predicate, {
-        isTrue: function(el) { return el ? true : false }
-    });
-})(MB);
\ No newline at end of file
diff --git a/root/static/scripts/ar-attributesearch.js b/root/static/scripts/ar-attributesearch.js
deleted file mode 100644
index 8a9ef50..0000000
--- a/root/static/scripts/ar-attributesearch.js
+++ /dev/null
@@ -1,603 +0,0 @@
-function ARSearch() {
-
-    // ----------------------------------------------------------------------------
-    // register class/global id
-    // ----------------------------------------------------------------------------
-    this.CN = "ARSearch";
-    this.GID = "arsearch";
-    mb.log.enter(this.CN, "__constructor");
-
-    // ----------------------------------------------------------------------------
-    // member variables
-    // ----------------------------------------------------------------------------
-    this.eventMode = "";
-    this.busy = false;
-    this.theDropdown = null;
-    this.currentIndex = 0;
-    this.currChar = null;
-    this.charsArr = new Array();
-    this.theSubstr = null;
-    this.lastChar = "";
-    this.objTimeout = new Array();
-    this.lastFocusObj = null;
-    this.searchTimeOut = 0;
-    this.searchFindNext = false;
-    this.searchFindNextAsc = true;
-
-    // ----------------------------------------------------------------------------
-    // member functions
-    // ----------------------------------------------------------------------------
-
-    /**
-     * Document Me!
-     *
-     * @param e
-     */
-    this.handleKeyPressed = function(e) {
-        mb.log.enter(this.GID, "handleKeyPressed");
-        this.eventMode = (e) ? ((e.eventPhase) ? "W3C" : "NN4") : ((window.event) ? "IE" : "unknown");
-
-        // lets try some netscape 4 support, just for fun.
-        if (this.eventMode == "NN4") {
-                document.captureEvents(Event.KEYDOWN);
-        }
-        var event = (this.eventMode == "IE" ? window.event : e);
-        var keyCode = (this.eventMode == "IE" ? event.keyCode : event.which);
-        var theObj = (this.eventMode == "IE" ? event.srcElement : event.target);
-        this.theDropdown = this.getDropDown(theObj);
-        var retval = this.handleKeyCode(keyCode);
-        mb.log.exit();
-        return retval;
-    };
-
-    /**
-     * Document Me!
-     *
-     * @param keyCode
-     * @param btnClicked
-     */
-    this.handleKeyCode = function(keyCode, btnClicked) {
-        mb.log.enter(this.GID, "handleKeyCode");
-        if (btnClicked == null) btnClicked = false;
-        var retval;
-        var inputFocus = this.inputHasFocus();
-        var selectFocus = this.selectHasFocus();
-
-        mb.log.debug("keyCode=$, focus on=$", keyCode, (inputFocus ? "Input" : selectFocus ? "Dropdown" : "none"));
-
-        if (! (this.theDropdown == null || this.theDropdown.options == null || keyCode == null)) {
-                this.currChar = String.fromCharCode(keyCode);
-                this.currChar = (this.currChar != null ? this.currChar.toLowerCase() : "");
-                this.searchFindNext = false;
-                // window.status = keyCode;
-                if (keyCode == 8 || keyCode == 46) { // 46:DELETE, 8:BACKSPACE
-                        if (this.charsArr.length > 1) { // pop one element from
-                                this.updateObjTimeout(this.theDropdown);
-                                this.currChar = "";
-                                this.currOp = "BACKTRACE";
-                                this.charsArr.pop(); // the search string
-                                this.theSubstr = this.charsArr.join("");
-                                this.search();
-                                if (keyCode == 46) this.updateStats(this.theDropdown, false, true);
-                                retval = true;
-                        } else {
-                                this.theDropdown.selectedIndex = 0;
-                                this.updateStats(this.theDropdown, true); // reset if query = ""
-                                retval = true;
-                        }
-
-                } else if (keyCode == 27) { // ESC=reset substring
-                        this.charsArr = new Array(); // and start from scratch
-                        this.currChar = "";
-                        this.currOp = "RESET";
-                        this.theDropdown.selectedIndex = 0;
-                        this.updateStats(this.theDropdown, true);
-                        mb.log.debug("", true);
-                        retval = false;
-
-                } else if ((btnClicked && keyCode == 39) ||
-                                   (selectFocus && keyCode == 39) ||
-                                   (inputFocus && keyCode == 40)) { // 39:ARROW_RIGHT, 40:ARROW_DOWN
-                        this.updateObjTimeout(this.theDropdown);
-                        this.currChar = "FINDNEXT";
-                        this.searchFindNextAsc = true;
-                        this.searchFindNext = true; // dropdown list.
-                        this.currentIndex = this.theDropdown.selectedIndex;
-                        this.search();
-                        retval = false;
-
-                } else if ((btnClicked && keyCode == 37) ||
-                                   (selectFocus && keyCode == 37) ||
-                                   (inputFocus && keyCode == 38)) { // 37:ARROW_LEFT, ARROW_UP:38
-                        this.updateObjTimeout(this.theDropdown);
-                        this.currChar = "FINDNEXT";
-                        this.searchFindNext = true;
-                        this.searchFindNextAsc = false;
-                        this.currentIndex = this.theDropdown.selectedIndex;
-                        this.search();
-                        retval = false;
-
-                } else if ((("abcdefghijklmnopqrstuvwxyz ").indexOf(this.currChar) > -1)) {
-                        this.checkObjTimeOut(this.theDropdown);
-                        this.charsArr[this.charsArr.length] = this.currChar;
-                        this.theSubstr = this.charsArr.join("");
-                        this.currOp = "ALPHANUM";
-                        this.lastChar = this.currChar;
-                        this.search();
-                        retval = inputFocus;
-
-                } else {
-                        mb.log.debug("No update required.");
-                        retval = true;
-                }
-        } else {
-                mb.log.error("No reference to dropdown found.");
-                retval = true;
-        }
-        mb.log.exit();
-        return retval;
-    };
-
-    /**
-     * Document Me!
-     *
-     * @param theObj
-     */
-    this.checkObjTimeOut = function(theObj) {
-        mb.log.enter(this.GID, "checkObjTimeOut");
-        this.theDropdown = this.getDropDown(theObj);
-        if (this.theDropdown != null) {
-                var lastEvent = this.objTimeout[this.theDropdown.id];
-                var now = new Date().getTime();
-                lastEvent = (lastEvent != null ? lastEvent : 0);
-                if ((now - lastEvent) > 3000) this.updateStats(theObj, true);
-                mb.log.debug("obj: $, last event: $", this.objToString(theObj), (now-lastEvent)+"[ms]");
-                this.updateObjTimeout(theObj);
-        } else {
-                mb.log.error("theObj is invalid reference: $", this.objToString(theObj));
-        }
-        mb.log.exit();
-    };
-
-    /**
-     * Document Me!
-     *
-     * @param theObj
-     */
-    this.updateObjTimeout = function(theObj) {
-        mb.log.enter(this.GID, "updateObjTimeout");
-        this.theDropdown = this.getDropDown(theObj);
-        if (this.theDropdown != null) {
-                this.objTimeout[this.theDropdown.id] = new Date().getTime();
-        } else {
-                mb.log.error("theObj is invalid reference: $", this.objToString(theObj));
-        }
-        mb.log.exit();
-    };
-
-    /**
-     * Document Me!
-     *
-     * @param theObj
-     */
-    this.getDropDown = function(theObj) {
-        mb.log.enter(this.GID, "getDropDown");
-        var el, elid = null;
-        if (theObj != null &&  theObj.id != null) {
-                var theName = theObj.id;
-                var nameSplit = theName.split("_");
-                if (nameSplit[0] == "attr" && (nameSplit[1] == "instrument" || nameSplit[1] == "vocal")) {
-                        var lastSplit = nameSplit[nameSplit.length-1];
-                        if (lastSplit == "substr" || lastSplit == "findprev" || lastSplit == "findnext" || lastSplit == "remove" ) {
-                                nameSplit.pop(); // loose last part of id
-                                elid = nameSplit.join("_");
-                                el = document.getElementById(elid);
-                        } else {
-                                el = theObj;
-                        }
-                } else {
-                        mb.log.debug("Object is not of the type attr_instrument or attr_vocal");
-                }
-        } else {
-                mb.log.error("theObj is invalid reference: $", this.objToString(theObj));
-        }
-
-        if (el == null) {
-                mb.log.error("Could not get reference to DropDown with id: $", elid);
-        }
-        mb.log.exit();
-        return el;
-    };
-
-    /**
-     * Document Me!
-     *
-     * @param theObj
-     */
-    this.getInputField = function(theObj) {
-        mb.log.enter(this.GID, "getInputField");
-        this.theDropdown = this.getDropDown(theObj);
-        if (this.theDropdown != null) {
-                var inputElemId = this.theDropdown.id + "_substr";
-                var inputElem = document.getElementById(inputElemId);
-                if (inputElem != null) {
-                        return inputElem;
-                } else {
-                        mb.log.error("Did not find inputElem with id=$", inputElemId);
-                }
-        } else {
-                mb.log.error("theObj is invalid reference: $", this.objToString(theObj));
-        }
-        mb.log.exit();
-        return null;
-    };
-
-    /**
-     * Document Me!
-     */
-    this.inputHasFocus = function() {
-        mb.log.enter(this.GID, "inputHasFocus");
-        var retval = ((this.lastFocusObj != null) &&
-                                  (this.lastFocusObj.id != null) &&
-                                  (this.lastFocusObj.id.match(/attr_(instrument|vocal)_\d+_substr/i) != null));
-        mb.log.exit();
-        return retval;
-    };
-
-    /**
-     * Document Me!
-     */
-    this.selectHasFocus = function() {
-        mb.log.enter(this.GID, "selectHasFocus");
-        var retval = ((this.lastFocusObj != null) &&
-                                  (this.lastFocusObj.id != null) &&
-                                  (this.lastFocusObj.id.match(/attr_(instrument|vocal)_\d+/i) != null));
-        mb.log.exit();
-        return retval;
-    };
-
-    /**
-     * Document Me!
-     *
-     * @param theObj
-     */
-    this.updateStats = function(theObj, bReset, bOverride) {
-        mb.log.enter(this.GID, "updateStats");
-        mb.log.debug("theObj: $, bReset: $", this.objToString(theObj), bReset==true ? "true" : "false");
-        bReset = (bReset == null ? false : bReset);
-        bOverride = (bOverride == null ? false : bOverride);
-        if (bReset) {
-                this.theSubstr = "";
-                this.charsArr = new Array();
-        }
-        this.updateDisplay(theObj, bReset, bOverride);
-        if (bReset) {
-                this.currentIndex = 0;
-                this.theDropdown = null;
-        }
-        mb.log.exit();
-    };
-
-    /**
-     * Document Me!
-     *
-     * @param theObj
-     */
-    this.updateDisplay = function(theObj, bReset, bOverride) {
-        mb.log.enter(this.GID, "updateDisplay");
-        var inputElem = this.getInputField(theObj);
-        if (inputElem != null) {
-                this.theSubstr = (this.theSubstr == null ? "" : this.theSubstr);
-                if ((!this.inputHasFocus() || bOverride) || bReset) inputElem.value = this.theSubstr;
-                mb.log.debug("active: $, string: $", this.inputHasFocus(), this.theSubstr);
-        } else {
-                mb.log.error("theObj is invalid reference: $", this.objToString(theObj));
-        }
-        mb.log.exit();
-    };
-
-
-    /**
-     * Document Me!
-     *
-     * @param theObj
-     */
-    this.handleFocus = function(theObj) {
-        mb.log.enter(this.GID, "handleFocus");
-        var inputElem = this.getInputField(theObj);
-        if (inputElem != null) {
-                this.lastFocusObj = theObj;
-                if (inputElem.value == "Search...") inputElem.value = "";
-                this.theSubstr = (inputElem.value != null ? inputElem.value : "");
-                this.charsArr = this.theSubstr.split("");
-                this.updateStats(theObj, false);
-                mb.log.debug("Initialized search string: $, focusObj: $", this.theSubstr, this.objToString(this.lastFocusObj));
-        } else {
-                mb.log.error("theObj is invalid reference: $, input: $", this.objToString(theObj), this.objToString(inputElem));
-        }
-        mb.log.exit();
-    };
-
-
-    /**
-     * Document Me!
-     *
-     * @param theObj
-     */
-    this.objToString = function(theObj) {
-        return (theObj == null || theObj.id == null ? "null" : theObj.id);
-    };
-
-
-    /**
-     * Document Me!
-     *
-     * @param theObj
-     */
-    this.findPrev = function(theObj) {
-        mb.log.enter(this.GID, "findPrev");
-        this.theDropdown = this.getDropDown(theObj);
-        if (this.theDropdown != null && this.theDropdown.options != null) {
-                this.handleKeyCode(37, true);
-        } else {
-                mb.log.error("theObj is invalid reference: $", this.objToString(theObj));
-        }
-        mb.log.exit();
-    };
-
-
-    /**
-     * Document Me!
-     *
-     * @param theObj
-     */
-    this.findNext = function(theObj) {
-        mb.log.enter(this.GID, "findNext");
-        this.theDropdown = this.getDropDown(theObj);
-        if (this.theDropdown != null && this.theDropdown.options != null) {
-                this.handleKeyCode(39, true);
-        } else {
-                mb.log.error("theObj is invalid reference: $", this.objToString(theObj));
-        }
-        mb.log.exit();
-    };
-
-
-    /**
-     * Search theObj.options for an element that
-     * has theSubstr as a substring and select
-     * first found occurence, else select index 0
-     *
-     * @param hasWrapped
-     */
-    this.search = function(hasWrapped) {
-        mb.log.enter(this.GID, "search");
-
-        if (this.theDropdown == null) {
-                mb.log.error("this.theDropdown = null");
-        } else {
-
-                if (this.theSubstr == null || this.theSubstr == "") {
-                        mb.log.error("this.theSubstr is empty/null");
-                } else {
-
-                        clearTimeout(this.searchTimeOut);
-                        if (this.busy) { // wait until interrupt was detected and busy was reset
-                                this.interrupted = true;
-                                this.searchTimeOut = setTimeout("arsearch.search()", 10);
-                        }
-                        var foundMatch = false;
-                        var hasMatched = false;
-                        var strWords = this.theSubstr.split(" ");
-                        var regexStr =  strWords.join("[^ ]* \\b");
-                        var re = new RegExp("\\b"+regexStr, "i");
-                        var i_min = 0;
-                        var i_max = this.theDropdown.options.length - 1;
-                        var i = (this.searchFindNext ? this.currentIndex : i_min);
-
-                        // print some debug information about the next search turn.
-                        mb.log.debug("" + (hasWrapped ? "2nd run" : "1st run") + "---------------------------------------------------------------------------");
-                        mb.log.debug("  Q: $, re=$", this.theSubstr, re);
-                        mb.log.debug("  OP: $, CHAR: $, LAST: $", this.currOp, this.currChar, this.lastChar);
-                        mb.log.debug("  findnext: $ ($), index: $, value: $",
-                                this.searchFindNext,
-                                this.searchFindNextAsc ? "asc" : "desc",
-                                this.currentIndex,
-                                this.currentIndex != -1 ? this.theDropdown.options[this.currentIndex].text : ""
-                        );
-
-                        // continue until search is interrupted
-                        this.interrupted = false;
-                        while (!this.interrupted) {
-                                if (this.searchFindNextAsc && i == i_max) {
-                                        // if ascending search, stop at maximum
-                                        break;
-                                }
-                                if (!this.searchFindNextAsc && i == i_min) {
-                                        // if descending search, stop at minimum
-                                        break;
-                                }
-                                i += (this.searchFindNextAsc ? 1 : -1); // if ascending search, +1, else +(-1)
-                                if (!(this.searchFindNext && i == this.currentIndex)) {
-                                        var probe = this.theDropdown.options[i].text;
-                                        var m = re.exec(probe);
-                                        if (m != null) {
-                                                hasMatched = true;
-                                                if (this.searchFindNext) {
-                                                        if ((this.searchFindNextAsc && i > this.currentIndex) ||
-                                                                (!this.searchFindNextAsc && i < this.currentIndex)) {
-                                                                foundMatch = true; // if we are looking for the next occurence of a substring
-                                                                break; // and the index is bigger than the previous match, end search successful.
-                                                        }
-                                                } else {
-                                                        foundMatch = true; // if we are looking for a new string and
-                                                        break; // it matched, end search successful.
-                                                }
-                                        }
-                                } else {
-                                        hasMatched = true; // if no other entry was matched, remember current entry as the one that has matched.
-                                }
-                        }
-
-                        // log what caused the loop termination, what has happened.
-                        mb.log.debug("  this.interrupted: $, hasMatched: $, foundMatch: $, index: $",
-                                this.interrupted,
-                                hasMatched,
-                                foundMatch,
-                                i
-                        );
-
-                        if (!this.interrupted) { // if search was not interrupted
-                                if (foundMatch && i != 0) { // if foundMatch, select index, else 0
-                                        this.theDropdown.selectedIndex = i;
-                                } else { // we have not found a valid match.
-                                        if (this.searchFindNext && !hasWrapped) {
-                                                this.busy = false; // reset busy flag.
-                                                this.currentIndex = (this.searchFindNextAsc ? i_min : i_max);
-                                                mb.log.debug("  => We need to wrap, searching again...");
-                                                this.searchTimeOut = setTimeout("arsearch.search(true)", 10);
-                                                mb.log.exit();
-                                                return;
-                                        } else {
-                                                this.theDropdown.selectedIndex = 0;
-                                        }
-                                }
-                                this.currentIndex = this.theDropdown.selectedIndex;
-                        }
-                        this.busy = false; // reset busy flag.
-                        this.updateStats(this.theDropdown);
-                }
-        }
-        mb.log.exit();
-    };
-
-
-    /**
-     * @param theObj
-     */
-    this.removeAttribute = function(theObj) {
-        mb.log.enter(this.GID, "removeAttribute");
-        this.theDropdown = this.getDropDown(theObj);
-        if (this.theDropdown != null) {
-                var nameSplit = this.theDropdown.name.split("_");
-                var attr = nameSplit[1];
-                var index = parseInt(nameSplit[2]);
-                if (index < 1) return; // do not remove element '0'
-                var elemParent = document.getElementById(attr);
-                if (elemParent) {
-                        var elemItem = document.getElementById(this.theDropdown.name + "_item");
-                        if (elemItem) {
-                                // remove dropdown, previous button, input field, next button and remove button
-                                var items = new Array("", "_findprev", "_substr", "_findnext", "_remove");
-                                for (var i=0; i<items.length; i++) {
-                                        var childId = 'attr_' + attr + "_" + index + "" + items[i];
-                                        var elem = document.getElementById(childId);
-                                        if (elem != null) {
-                                                try {
-                                                        elemItem.removeChild(elem);
-                                                } catch (e) {
-                                                        mb.log.debug("Could not removing id: $ from $", childId, elemItem.id);
-                                                }
-                                        } else {
-                                                mb.log.error("Did not find node to delete: $", childId);
-                                        }
-                                        if (items[i] == "_remove" && index > 1) {
-                                                var elemBtn = document.getElementById("attr_" + attr + "_" + (index-1) + items[i]);
-                                                if (elemBtn) elemBtn.style.display = "inline";
-                                                        // hide all remove buttons but the lowest one
-                                                        // (to prevent the removal of a button from the
-                                                        //  middle of the list)
-                                        }
-                                }
-                        }
-                        try {
-                                elemParent.removeChild(elemItem);
-                        } catch (e) {
-                                mb.log.error("Could not remove id: $, from parent: $", elemItem.id, elemParent.id);
-                        }
-                } else {
-                        mb.log.error("Did not find parent; "+this.objToString(theObj));
-                }
-        } else {
-                mb.log.error("theObj is invalid reference: $", this.objToString(theObj));
-        }
-        mb.log.exit();
-    };
-
-    /**
-     * @param attr
-     */
-    this.addAttribute = function(attr) {
-        mb.log.enter(this.GID, "addAttribute");
-
-        var parent = document.getElementById(attr);
-        var elements = document.getElementsByName('attr_' + attr + "_0");
-        if (elements && parent) {
-                var attrElement = elements[0];
-                if (attrElement) {
-                        var index = this.findAttrIndex(attr);
-
-                        // do not add element '0' again
-                        if (index != 0) {
-                                mb.log.debug("Adding new index: $ to $", index, this.objToString(attrElement));
-
-                                // clone dropdown, previous button, input field, next button and remove button
-                                var items = new Array("", "_findprev", "_substr", "_findnext", "_remove");
-                                var pId = 'attr_' + attr + "_" + index + "_item";
-                                var divElem = document.createElement("div");
-                                divElem .setAttribute("id", pId);
-                                divElem .className = "ar-attribute-item";
-                                parent.appendChild(divElem);
-                                for (var i=0; i<items.length; i++) {
-                                        var childId = 'attr_' + attr + "_0" + items[i];
-                                        var elem = document.getElementById(childId);
-                                        if (elem != null) {
-                                                var newNodeId = "attr_" + attr + "_" + index + items[i];
-                                                var newNode = elem.cloneNode(true);
-                                                if (newNode != null) {
-                                                        newNode.setAttribute("id", newNodeId);
-                                                        newNode.setAttribute("name", newNodeId);
-                                                        divElem.appendChild(newNode);
-                                                        if (items[i] == "_substr") {
-                                                                newNode.value = "Search...";
-                                                        }
-                                                        if (items[i] == "_remove") {
-                                                                if (index > 1) {
-                                                                        // hide remove button of the previous
-                                                                        // dropdown (to prevent the removal of a button from
-                                                                        //  the middle of the list)
-                                                                        var elemBtn = document.getElementById("attr_" + attr + "_" + (index-1) + items[i]);
-                                                                        if (elemBtn) elemBtn.style.display = "none";
-                                                                }
-                                                                newNode.style.display = "inline";
-                                                        }
-                                                } else {
-                                                        mb.log.error("new node with id: $ could not be cloned!", newNodeId);
-                                                }
-                                        } else {
-                                                mb.log.error("elem with id: $ not found!", childId);
-                                        }
-                                }
-                        }
-                }
-        }
-        mb.log.exit();
-    };
-
-    /**
-     * @param attr
-     */
-    this.findAttrIndex = function(attr) {
-        mb.log.enter(this.GID, "findAttrIndex");
-        var index;
-        for(index = 1;; index++) {
-                var list = document.getElementsByName('attr_' + attr + "_" + index);
-                if (list.length == 0) {
-                        break;
-                }
-        }
-        mb.log.exit();
-        return index;
-    };
-
-
diff --git a/root/static/scripts/ar-frontend.js b/root/static/scripts/ar-frontend.js
deleted file mode 100644
index bfdf87a..0000000
--- a/root/static/scripts/ar-frontend.js
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
-
-
-    // ----------------------------------------------------------------------------
-    // member variables
-    // ----------------------------------------------------------------------------
-    this.form = null;
-    this.typeDropDownName = null;
-    this.typeDropDown = null;
-    this.isurlform = false;
-    this.isready = false;
-    this.formsubmitted = null;
-
-    // ----------------------------------------------------------------------------
-    // member functions
-    // ----------------------------------------------------------------------------
-
-    
-      Hide all of the divs specified in int_seenattrs.
-     
-    this.hideAll = function() {
-        mb.log.enter(this.GID, "hideAll");
-        var seenattrs;
-        if ((seenattrs = this.form.int_seenattrs) != null) {
-            var list = (seenattrs.value || "").split(",");
-            for  (var i=0; i<list.length; i++) {
-                var lr = list[i];
-                if (lr != "") {
-                    mb.ui.setDisplay(lr, false);
-                    mb.ui.setDisplay(lr+ "-desc", false);
-                }
-            }
-        } else {
-            // addcc.html, addurl.html pages do not specify this.
-        }
-        mb.log.exit();
-    };
-
-    
-      internal fields which drive how the javascript function
-      interacts with the form elements -->
-      int_isurlform, value: 0|1
-      int_typedropdown, value: linktypeid|linktype|license
-     
-      checks for the divs containing the client/server side
-      variants of the swap elements html, and enables the
-      client side behavior if it is supported (=javascript available)
-     
-    this.setupForm = function() {
-        mb.log.enter(this.GID, "setupForm");
-
-        // hide the notice, which is displayed for browsers
-        // which have javascript turned off.
-        var obj;
-        if ((obj = mb.ui.get("relationshipNoScript")) != null) {
-            obj.style.display = "none";
-        }
-
-        if ((this.form = mb.ui.get("LinkSelectForm")) != null) {
-            if ((this.typeDropDownName = this.form.int_typedropdown) != null) {
-                this.typeDropDownName = (this.typeDropDownName.value || "");
-                if ((this.typeDropDown = this.form[this.typeDropDownName]) != null) {
-                    if ((this.isurlform = this.form.int_isurlform) != null) {
-                        this.ready = true;
-
-                        // register event handlers
-                        this.typeDropDown.onkeydown = function(event) { arfrontend.typeChanged(); }
-                        this.typeDropDown.onchange = function(event) { arfrontend.typeChanged(); }
-
-                        // fire event to setup descriptions etc.
-                        this.typeChanged();
-                        this.typeDropDown.onkeydown();
-
-                        // add handler which clears the default value upon focus.
-                        if (this.isurlform.value == 1) {
-                            var urlfield;
-                            if ((urlfield = this.form.url) != null) {
-                                urlfield.onfocus = function(event) { if (this.value == "http://") this.value = ""; }
-                                urlfield.onblur = function(event) { if (this.value == "") this.value = "http://"; }
-                                urlfield.onchange = function(event) { arfrontend.guessTypeFromURL(this); }
-                                urlfield.onkeyup = function(event) { arfrontend.guessTypeFromURL(this); }
-                            } else {
-                                mb.log.error("Field url not found in form!");
-                            }
-                        }
-                    } else {
-                        mb.log.error("Could not find the hidden field int_isurlform");
-                    }
-                } else {
-                    mb.log.error("Could not find the DropDown given by int_typedropdown $", this.typeDropDownName);
-                }
-
-                var elcs, elss;
-                if ((elcs = mb.ui.get("arEntitiesSwap-Client")) != null &&
-                    (elss = mb.ui.get("arEntitiesSwap-Server")) != null) {
-                    elcs.style.display = "block";
-                    elss.style.display = "none";
-                }
-
-                var entities = getElementsByTagAndClassName('span', 'AR_ENTITY');
-                for (var i = 0; i < entities.length; i++) {
-                    var e = entities[i];
-                    var tmp = e.id.split('::');
-                    var index = tmp[1];
-                    var type = tmp[2];
-                    if (type != 'url') {
-                        var button = IMG({'src': '/images/release_editor/edit-off.gif', 'id': '_linkeditimg'+index, 'align': 'absmiddle', 'alt': 'Change this ' + type, 'title': 'Change this ' + type});
-                        connect(button, 'onclick', this, partial(this.changeEntity, index, type));
-                        replaceChildNodes(e, button, INPUT({'type': 'hidden', 'value': '0', 'id': '_linkedit'+index}));
-                    }
-                }
-
-
-            } else {
-                mb.log.error("Could not find the hidden field int_typedropdown");
-            }
-        } else {
-            var urlfield;
-            if ((urlfield = mb.ui.get("editurl_url")) != null) {
-                urlfield.onfocus = function(event) { if (this.value == "http://") this.value = ""; }
-                urlfield.onblur = function(event) { if (this.value == "") this.value = "http://"; }
-                urlfield.onchange = function(event) { arfrontend.fixURL(this); }
-                urlfield.onkeyup = function(event) { arfrontend.fixURL(this); }
-            }
-        }
-
-        mb.log.exit();
-    };
-
-    
-      Sets the display attributed of the the div
-      with id=id to the show (true|false)
-
-
-      Sets the description of the current selected element
-      from the dropdown list.
-     
-     
-    this.typeChanged = function() {
-        mb.log.enter(this.GID, "typeChanged");
-        if (this.typeDropDown != null) {
-            var selection = this.typeDropDown.value;
-            var sp = selection.split("|");
-            var attrs = (sp[1] || "");
-            var descr = (sp[2] || "");
-
-            if (!this.isurlform != null) {
-                this.hideAll();
-                if (attrs == "") {
-                    mb.ui.setDisplay("relationshipAttributes", false);
-                } else {
-                    mb.ui.setDisplay("relationshipAttributes", true);
-                    var p, pairs = attrs.split(" ");
-                    for(p in pairs) {
-                        var kv = pairs[p].split('=');
-                        if (kv[0] != "") {
-                            mb.ui.setDisplay(kv[0], true);
-                            mb.ui.setDisplay(kv[0] + "-desc", true);
-                        }
-                    }
-                }
-            }
-
-            // update description div
-            var el = mb.ui.get("relationshipTypeDesc");
-            if (el) {
-                if (descr != "") {
-                    el.innerHTML = "" + descr;
-                    el.setAttribute("className", "relationshipTypeDesc");
-                } else if (selection == "||") {
-                    el.innerHTML = "Please select a relationship type";
-                } else {
-                    var tempStr =     "Please select a subtype of the currently selected " +
-                                    "relationship type. The selected relationship type is " +
-                                    "only used for grouping sub-types.";
-                    el.innerHTML = tempStr;
-                    if (this.isFormSubmitted()) {
-                        el.setAttribute("className", "relationshipTypeError");
-                    }
-                }
-            }
-        } else {
-            mb.log.error("Cannot find the DropDown $ in the form!", this.typeDropDownName);
-        }
-        mb.log.exit();
-    }
-
-
-    
-      swap the contents of the first and the second element
-      which are going to be related to each other.
-      (saves a server roundtrip)
-     
-    this.swapElements = function(theBtn) {
-        mb.log.enter(this.GID, "swapElements");
-        var theForm = theBtn.form;
-        var leftTD = $("arEntitiesSwap-TD0");
-        var rightTD = $("arEntitiesSwap-TD1");
-        if (leftTD != null && rightTD != null) {
-            //var par = leftTD.parentNode;
-            //par.replaceChild(leftTD, rightTD);
-            //par.replaceChild(rightTD, leftTD);
-            var tmp = theForm.link0.value;
-            theForm.link0.value = theForm.link1.value
-            theForm.link1.value = tmp;
-            // edit AR page
-            if (theForm.link0name != null && theForm.link1name != null) {
-                tmp = theForm.link0name.value;
-                theForm.link0name.value = theForm.link1name.value;
-                theForm.link1name.value = tmp;
-                arfrontend.makeEntityLink(0);
-                arfrontend.makeEntityLink(1);
-            }
-            else {
-                tmp = leftTD.innerHTML;
-                leftTD.innerHTML = rightTD.innerHTML;
-                rightTD.innerHTML = tmp;
-            }
-        }
-        mb.log.exit();
-    }
-
-    this.makeEntityLink = function(idx, edit) {
-        if (!edit)
-            edit = $('_linkedit'+idx);
-        edit.value = '0';
-        $('_linkeditimg'+idx).src = '/images/release_editor/edit-off.gif';
-        $('AR_ENTITY_'+idx).innerHTML = mb.ui.getEntityLink($('link'+idx+'type').value, $('link'+idx).value, $('link'+idx+'name').value);
-    }
-
-    this.setEntity = function(idx, entity) {
-        $('link'+idx).value = entity.id;
-        $('link'+idx+'name').value = entity.name;
-        arfrontend.makeEntityLink(idx)
-    }
-
-    this.changeEntity = function(idx, type, evt) {
-        var edit = $('_linkedit'+idx);
-        if (edit.value == '0') {
-            edit.value = '1';
-            $('_linkeditimg'+idx).src = '/images/release_editor/edit-on.gif';
-            var input = INPUT({
-                'type': 'text',
-                'class': 'textfield',
-                'size': '35',
-                'maxlength': '255',
-                'value': $('link'+idx+'name').value
-            });
-            jsselect.registerAjaxSelect(input, type, partial(this.setEntity, idx));
-            replaceChildNodes($('AR_ENTITY_'+idx), input);
-        }
-        else {
-            arfrontend.makeEntityLink(idx, edit);
-        }
-    }
-*/
diff --git a/root/static/scripts/artistform.js b/root/static/scripts/artistform.js
deleted file mode 100644
index 7338f5d..0000000
--- a/root/static/scripts/artistform.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// Used on: /root/artist/create.tt
-// Used on: /root/artist/edit.tt
-
-/**************************************************
- *  Attach trigger to the change event for the
- *  artist type selector.
- *************************************************/
-$(document).ready(function(){
-    $('#id_artist_type').change(artistTypeChanged);
-});
-
-/**************************************************
- *  Changes the label descriptions depending upon
- *  the artist type.
- *************************************************/
-function artistChangeBeginEnd(begin, end)
-{
-    $('#id_label_start').text(begin);
-    $('#id_label_end').text(end);
-}
-
-/**************************************************
- *  Sets the label descriptions depending upon
- *  the artist type.
- *  Unknown: 0
- *  Person: 1
- *  Group: 2
- *************************************************/
-function artistTypeChanged()
-{
-  switch ($('#id_artist_type').val()) {
-  default:
-  case '0':
-    artistChangeBeginEnd('Begin Date', 'End Date');
-    break;
-  case '1':
-    artistChangeBeginEnd('Born', 'Deceased');
-    break;
-  case '2':
-    artistChangeBeginEnd('Founded', 'Dissolved');
-    break;
-  }
-}
diff --git a/root/static/scripts/artistreleases.js b/root/static/scripts/artistreleases.js
deleted file mode 100644
index 9a9a380..0000000
--- a/root/static/scripts/artistreleases.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Small helpers for viewing artist release listings */
-
-/* Note: Documentation on the headers toggle at 
-         http://www.terminally-incoherent.com/blog/2008/09/29/jquery-tablesorter-list-of-builtin-parserssorters/
-         Must be used on the Release Title column, as otherwise, it gets treated as a shortDate, and breaks.      */
-
-$(document).ready(function() {
-    /* Turn on table sorting */
-    $(".releases").tablesorter({
-        textExtraction: "complex",
-        headers: { 0 : { sorter: "text"  } }
-    });
-    /* Remove, then re-zebra stripe, the rows */
-    $(".releases").each(function() {
-        $(this).bind("sortStart",function() {
-            jQuery(this).find(".odd").each(function() {
-                $(this).removeClass("odd");
-            });
-        }).bind("sortEnd",function() {
-            jQuery(this).find("tr:odd").each(function() {
-                $(this).addClass("odd");
-            });
-        });
-    });
-});
diff --git a/root/static/scripts/collapsereleases.js b/root/static/scripts/collapsereleases.js
deleted file mode 100644
index cb9c247..0000000
--- a/root/static/scripts/collapsereleases.js
+++ /dev/null
@@ -1,278 +0,0 @@
-function CollapseReleases() {
-
-    // ----------------------------------------------------------------------------
-    // register class/global id
-    // ----------------------------------------------------------------------------
-    this.CN = "CollapseReleases";
-    this.GID = "collapsereleases";
-    mb.log.enter(this.CN, "__constructor");
-
-    // ----------------------------------------------------------------------------
-    // member variables
-    // ----------------------------------------------------------------------------
-    this.imgplus = new Image();
-    this.imgplus.src = "/images/es/maximize.gif";
-    this.imgminus = new Image();
-    this.imgminus.src = "/images/es/minimize.gif";
-
-    // ----------------------------------------------------------------------------
-    // member functions
-    // ----------------------------------------------------------------------------
-
-    /**
-     * Go through all the releases of the current page
-     * and add the toggle icons. This functionality can
-     * be defined in the page tree using the two
-     * hidden fields:
-     *
-     * ~userpreference::JSCollapse (0|1)
-     * ~userpreference::JSCollapseToggleIcon (0|1)
-     *
-     */
-    this.setupReleases = function() {
-        mb.log.enter(this.CN, "setupReleases");
-        var obj,list = mb.ui.getByTag("table");
-
-        var defaultcollapse = true;
-        if ((obj = mb.ui.get("userpreference::JSCollapse")) != null) {
-                defaultcollapse = !(obj.value == 0);
-        }
-
-        var showtoggleicon = true;
-        if ((obj = mb.ui.get("userpreference::JSCollapseToggleIcon")) != null) {
-                showtoggleicon = !(obj.value == 0);
-        }
-        for (var i=0;i<list.length; i++) {
-                var t = list[i];
-                var id = (t.id || "");
-                if (id.match(/tracks::\d+/i)) {
-
-                        // go through all the TR's of the table
-                        var defaultdisplay = (defaultcollapse ? "none" : "");
-                        var defaultimage =  (defaultcollapse ? "maximize" : "minimize");
-
-                        var rows = mb.ui.getByTag("tr", t);
-                        for (var j=0;j<rows.length; j++) {
-                                if (rows[j].className.match(/track|discid/i)) {
-                                        rows[j].style.display = defaultdisplay;
-                                }
-                        }
-                        if ((obj = mb.ui.get(id.replace("tracks", "releaselinks"))) != null) {
-                                obj.style.display = defaultdisplay;
-                        }
-                        if ((obj = mb.ui.get(id.replace("tracks", "releaseevents"))) != null) {
-                                obj.style.display = defaultdisplay;
-                        }
-
-                        var elid = id.replace("tracks", "link");
-                        var el;
-                        if ((el = mb.ui.get(elid)) != null) {
-                                var td = el.parentNode;
-
-                                if (showtoggleicon) {
-
-                                        // create the toggle icon, and the link wrapping
-                                        // it. If the we register a click on it, we
-                                        // have to stop propagation to the TD, else
-                                        // the release will be toggled to the closed
-                                        // state again if it was closed before.
-                                        //
-                                        // -- see: http://www.quirksmode.org/js/events_order.html
-                                        var toggletd = td.previousSibling;
-                                        while (toggletd != null && toggletd.tagName != "TD") {
-                                                toggletd = toggletd.previousSibling;
-                                        }
-
-                                        var a = document.createElement("a");
-                                        a.href = "javascript:; // Toggle release";
-                                        a.id = id.replace("tracks", "expand");
-                                        a.onfocus = function onfocus(event) { this.blur(); };
-                                        a.onclick = function onclick(event) {
-                                                try {
-                                                        if (window.event) {
-                                                                window.event.cancelBubble = true;
-                                                        } else if (event.stopPropagation) {
-                                                                event.stopPropagation();
-                                                        }
-                                                } catch (e) {
-                                                        mb.log.error("Could not cancel propagation: $", e);
-                                                }
-                                                var id = this.id.replace("expand", "tracks");
-                                                collapsereleases.showRelease(id);
-                                                return false;
-                                        };
-                                        var img = document.createElement("img");
-
-                                        img.src = "/images/es/"+defaultimage+".gif";
-                                        img.alt = "Toggle release";
-                                        img.border = 0;
-                                        a.appendChild(img);
-                                        toggletd.appendChild(a);
-
-                                        // updated for opera, such that the cells display as they
-                                        // are supposed to.
-                                        toggletd.style.display = "";
-                                        toggletd.style.width = "10px";
-                                        td.style.width = "100%";
-                                }
-
-                                td.title = "Click the arrow icon to expand/collapse the release.";
-
-                                /*
-
-                                // attach method to open the release if the
-                                // mouse is hovered over the orange/yellow bar.
-                                td.style.cursor = "pointer";
-                                td.id = id.replace("tracks", "title");
-
-                                td.onclick = function onclick(event) {
-                                        var id = this.id.replace("title", "tracks");
-
-                                        // clear default hovering behaviour
-                                        // after first click, else it is possibly
-                                        // confusing that the release gets opened/closed
-                                        // again.
-                                        collapsereleases.clearHoverTimeout(id);
-                                        this.onmouseover = null;
-                                        this.onmouseout = null;
-                                        this.title = "";
-
-                                        collapsereleases.showRelease(id);
-                                        return true;
-                                };
-                                */
-
-                                /*
-                                td.onmouseover = function onmouseover(event) {
-                                        var id = this.id.replace("title", "tracks");
-                                        collapsereleases.setHoverTimeout(id);
-                                };
-                                td.onmouseout = function onmouseout(event) {
-                                        var id = this.id.replace("title", "tracks");
-                                        collapsereleases.clearHoverTimeout(id);
-                                };
-
-                                */
-
-                                // we need to cancel event propagation on the
-                                // ReleaseTitle link, too. just return true, such
-                                // that the link click is not cancelled.
-                                el.onclick = function onclick(event) {
-                                        try {
-                                                if (window.event) {
-                                                        window.event.cancelBubble = true;
-                                                } else if (event.stopPropagation) {
-                                                        event.stopPropagation();
-                                                }
-                                        } catch (e) {
-                                                mb.log.error("Could not cancel propagation: $", e);
-                                        }
-                                        return true;
-                                };
-
-                        } else {
-                                mb.log.debug("Element $ not found", elid);
-                        }
-                }
-        }
-        mb.log.exit();
-    };
-
-    /**
-     * Register a hover timeout for opening a release
-     *
-     * @param id        the id of the release
-     */
-    this.setHoverTimeout = function(id) {
-        if (this.timeouts == null) {
-                this.timeouts = [];
-        }
-        var func = "collapsereleases.showRelease('"+id+"', true)";
-        this.timeouts[id] = setTimeout(func, 800);
-    };
-
-    /**
-     * Un-Register a hover timeout for opening a release
-     *
-     * @param id        the id of the release
-     */
-    this.clearHoverTimeout = function(id) {
-        if (this.timeouts == null) {
-                this.timeouts = [];
-        }
-        var ref = this.timeouts[id];
-        clearTimeout(ref);
-        this.timeouts[id] = null;
-    };
-
-    /**
-     * Go through all the releases of the current page
-     * and set their toggle status to the flag.
-     *
-     * @param flag      the new state (true|false)
-     */
-    this.toggleAll = function(flag) {
-        mb.log.enter(this.CN, "toggleAll");
-        var list = mb.ui.getByTag("table");
-        for (var i=0;i<list.length; i++) {
-                var t = list[i];
-                var id = (t.id || "");
-                if (id.match(/tracks::\d+/i)) {
-                        this.showRelease(id, flag);
-                }
-        }
-    };
-
-
-    /**
-     * Set the new toggle status of the release with id
-     *
-     * @param id        the release id
-     * @param flag      the new state (true|false)
-     */
-    this.showRelease = function(id, flag) {
-        mb.log.enter(this.CN, "showRelease");
-        var obj, img, t;
-
-        // get reference to image object.
-        if ((obj = mb.ui.get(id.replace("tracks", "expand"))) != null) {
-                img = obj.firstChild;
-
-                if (flag == null) {
-                        flag = img.src.match("maximize");
-                }
-                img.src = flag ? this.imgminus.src : this.imgplus.src;
-                var display = flag ? "" : "none";
-
-                if ((obj = mb.ui.get(id.replace("tracks", "releaselinks"))) != null) {
-                        obj.style.display = display;
-                }
-                if ((obj = mb.ui.get(id.replace("tracks", "releaseevents"))) != null) {
-                        obj.style.display = display;
-                }
-                if ((t = mb.ui.get(id)) != null) {
-                        var rows = mb.ui.getByTag("tr", t);
-                        for (var j=0;j<rows.length; j++) {
-                                if (rows[j].className.match(/track|discid/i)) {
-                                        rows[j].style.display = display;
-                                }
-                        }
-                } else {
-                        mb.log.debug("Element $ not found", tid);
-                }
-        } else {
-                mb.log.error("el is null");
-        }
-        mb.log.exit();
-    };
-
-    // exit constructor
-    mb.log.exit();
-}
-
-
-// register class...
-var collapsereleases = new CollapseReleases();
-mb.registerDOMReadyAction(
-    new MbEventAction(collapsereleases.GID, "setupReleases", "Setting up release toggle functions")
-);
diff --git a/root/static/scripts/common/es_URLfixer.js b/root/static/scripts/common/es_URLfixer.js
deleted file mode 100644
index 8601f3b..0000000
--- a/root/static/scripts/common/es_URLfixer.js
+++ /dev/null
@@ -1,173 +0,0 @@
-var urlRegExps = {
-    amazon:          new RegExp("^(?:http://)?(?:[^/]+.)?amazon.(com|ca|cn|co.uk|uk|fr|at|de|co.jp|jp|it)","i"),
-    archivedown:     new RegExp("^(http://)?([^/]+.)?archive.org/.*.(mp3|ogg|flac|shn)$","i"),
-    archiveimg:      new RegExp("^(http://)?([^/]+.)?archive.org/.*.(jpg|jpeg|png|gif)$","i"),
-    cdbaby:          new RegExp("^(http://)?([^/]+.)?cdbaby.(com|name)","i"),
-    discogs:         new RegExp("^(http://)?([^/]+.)?discogs.com","i"),
-    ibdb:            new RegExp("^(http://)?([^/]+.)?ibdb.com","i"),
-    imdb:            new RegExp("^(http://)?([^/]+.)?imdb.com","i"),
-    iobdb:           new RegExp("^(http://)?([^/]+.)?lortel.org","i"),
-    jamendo:         new RegExp("^(http://)?([^/]+.)?jamendo.com","i"),
-    jamendoimg:      new RegExp("^(http://)?([^/]+.)?imgjam.com","i"),  // Jamendo coverart server
-    magnatune:       new RegExp("^(http://)?([^/]+.)?(he3.)?magnatune.com","i"),
-    musicmoz:        new RegExp("^(http://)?([^/]+.)?musicmoz.(com|org)","i"),
-    myspace:         new RegExp("^(http://)?([^/]+.)?myspace.com","i"),
-    ozon:            new RegExp("^(http://)?([^/]+.)?www.ozon.ru","i"),
-    purevolume:      new RegExp("^(http://)?([^/]+.)?purevolume.com","i"),
-    thastrom:        new RegExp("^(http://)?([^/]+.)?www.thastrom.se","i"),
-    universalpoplab: new RegExp("^(http://)?([^/]+.)?www.universalpoplab.com","i"),
-    wikipedia:       new RegExp("^(http://)?([^/]+.)?wikipedia.","i"),
-    youtube:         new RegExp("^(http://)?([^/]+.)?youtube.com","i")
-},
-    urlARValues = {
-    artist:  0,
-    release: 1,
-    track:   2,
-    label:   3,
-    invalid:    ["||",   "||",  "||",   "||"],
-    asin:       ["||",   "30|",  "||",   "||"],
-    coverart:   ["||",   "34|",  "||",   "||"],
-    discogs:    ["11|",  "24|",  "||",   "9|"],
-    download:   ["||",   "20|",  "17|",  "||"],
-    imdb:       ["17|",  "27|",  "||",   "||"],
-    ibdb:       ["25|",  "36|",  "23|",  "||"],
-    iobdb:      ["26|",  "37|",  "24|",  "||"],
-    mailorder:  ["||",   "19|",  "||",   "||"],
-    musicmoz:   ["12|",  "25|",  "||",   "||"],
-    myspace:    ["19|",  "||",   "||",   "10|"],
-    purevolume: ["22|",  "||",   "||",   "||"],
-    wikipedia:  ["10|",  "23|",  "||",   "8|"],
-    youtube:    ["27|",  "||",   "||",   "12|"]
-};
-function fixSetURLAR() {
-    var thisURL = $("#form-add-url-relationship-url").attr("value"),
-        newURL = "",
-        site = "",
-        setSelect = function(ARtype) {
-            var EntityType = $("#entity-type").attr("value");
-            $("#form-add-url-relationship-type").selectOptions(urlARValues[ARtype][urlARValues[EntityType]], true);
-    };
-    if (thisURL.match(urlRegExps.amazon)) {
-        site = "asin";
-    } else if (thisURL.match(urlRegExps.archivedown)) {
-        site = "download";
-    } else if (thisURL.match(urlRegExps.archiveimg)) {
-        site = "coverart";
-    } else if (thisURL.match(urlRegExps.cdbaby)) {
-        site = "coverart";
-        thisURL = thisURL.replace("/from/musicbrainz","");
-    } else if (thisURL.match(urlRegExps.discogs)) {
-        site = "discogs";
-    } else if (thisURL.match(urlRegExps.ibdb)) {
-        site = "ibdb";
-    } else if (thisURL.match(urlRegExps.imdb)) {
-        site = "imdb";
-    } else if (thisURL.match(urlRegExps.iobdb)) {
-        site = "iobdb";
-    } else if (thisURL.match(urlRegExps.jamendoimg)) {
-        site = "coverart";
-    } else if (thisURL.match(urlRegExps.jamendo)) {
-        site = "coverart";
-    } else if (thisURL.match(urlRegExps.magnatune)) {
-        site = "coverart";
-    } else if (thisURL.match(urlRegExps.musicmoz)) {
-        site = "musicmoz";
-    } else if (thisURL.match(urlRegExps.myspace)) {
-        site = "myspace";
-    } else if (thisURL.match(urlRegExps.ozon)) {
-        site = "coverart";
-    } else if (thisURL.match(urlRegExps.purevolume)) {
-        site = "purevolume";
-    } else if (thisURL.match(urlRegExps.thastrom)) {
-        site = "coverart";
-    } else if (thisURL.match(urlRegExps.universalpoplab)) {
-        site = "coverart";
-    } else if (thisURL.match(urlRegExps.wikipedia)) {
-        site = "wikipedia";
-    } else if (thisURL.match(urlRegExps.youtube)) {
-        site = "youtube";
-    }
-    /* Change the selected option in the select. */
-    setSelect(site);
-    /* Clean up the url. */
-    switch (site) {
-        case "archiveimg":
-            newURL = thisURL.replace(/\/http:\/\//, "/");
-            break;
-        case "asin":
-            // http://www.amazon.TLD/gp/product/ASIN
-            var tld = thisURL.match(urlRegExps.amazon),
-                asin = thisURL.match(/\/([A-Z0-9]{10})(?:[\/?]|$|#)/);
-            if (tld == "jp" || tld == "uk") {
-                tld = "co." + tld;
-            }
-            if (tld !== "" && asin !== "") {
-                newURL = "http://www.amazon." + tld + "/gp/product/" + asin;
-            }
-            if (tld == "cn") {  // .cn does not use standard ASINs.
-                setSelect("mailorder");
-                newURL = thisURL;
-            }
-            break;
-//        case "cdbaby":  // If ticket 4979 is added, a second AR could be auto-added here for mailorder.
-//            break;
-        case "discogs":
-            newURL = thisURL.replace(/^https?:\/\/([^.]+\.)?discogs\.com\/(.*\/(artist|release|label))?/, "http://www.discogs.com/$3");
-            break;
-        case "jamendo":  // If ticket 4979 is added, a second AR could be auto-added here for free download.
-            thisURL = thisURL.replace(/jamendo\.com\/\w\w\/album\/(\d+)/, "$1");  // Jamendo site URLs
-            thisURL = thisURL.replace(/jamendo\.com\/albums\/(\d+)/, "$1");  // Old Jamendo art URLs
-            thisURL = thisURL.replace(/imgjam\.com\/albums\/(\d+)/, "$1");  // New Jamendo art URLs
-            newURL = "http://www.jamendo.com/en/album/" + thisURL;
-            break;
-        case "myspace":
-            thisURL.match(/^(?:http:\/\/)?(?:[^\/]+\.)?myspace\.com\/(?:index.+friendId=)?([a-zA-Z\d]+)/);
-            newURL = "http://www.myspace.com/" + thisURL;
-            break;
-        case "youtube":
-            newURL = thisURL.replace(/^http:\/\/(?:[^.]+\.)?youtube\.com\/(.+\/|watch\?v=|videos_list\?(?:user|tag)=)(.+)/, 
-                function(str, p1, p2) {
-                    if (p1 != "videos_list?tag=" && p1 != "watch?v=" && p1 != "tags/") {
-                        return "http://www.youtube.com/user/" + p2;
-                    } else {
-                        setSelect("invalid");
-                        alertUser("error",text.NonValidYouTubeAR);
-                    }
-                }
-            );
-            break;
-        default:
-            newURL = thisURL;
-    }
-    /* Set the field value to the newly cleaned URL. */
-    $("#form-add-url-relationship-url").attr("value", newURL);
-}
-$(function() {
-    $("#form-add-url-relationship-url").blur(function() {
-        fixSetURLAR();
-    });
-    $("#form-add-url-relationship-url").change(function() {
-        fixSetURLAR();
-    });
-    $("#form-add-url-relationship-url").focus(function() {
-        fixSetURLAR();
-    });
-    $("#form-add-url-relationship-url").keyup(function() {
-        fixSetURLAR();
-    });
-    $("#form-add-url-relationship-type").change(function() {
-        if ($("#form-add-url-relationship-type").selectedValues() == "34|") {
-            var goodCoverArtSite = false;
-            var validCoverArtSites = /^(http:\/\/)?([^\/]+\.)(cdbaby\.com|archive\.org|www\.encyclopedisque\.fr|(?:img\.)?jamendo\.com|imgjam\.com|(he3\.)magnatune\.com|www\.ozon\.ru|www\.thastrom\.se|www\.universalpoplab\.com)/;
-            fixSetURLAR();
-            if ($("#form-add-url-relationship-type").selectedValues() == "34|") {
-                if (validCoverArtSites.test($("#form-add-url-relationship-url").attr("value"))) {
-                    goodCoverArtSite = true;
-                }
-                if (!goodCoverArtSite) {
-                    alertUser("error",text.NonValidCoverArtAR);
-                }
-            }
-        }
-    });
-});
diff --git a/root/static/scripts/common/es_functions.js b/root/static/scripts/common/es_functions.js
deleted file mode 100644
index 9faf1be..0000000
--- a/root/static/scripts/common/es_functions.js
+++ /dev/null
@@ -1,899 +0,0 @@
-/********************************************************************************************
- * Edit Suite Helper Functions                                                              *
- ********************************************************************************************
- ********************************************************************************************
- * Function: handleCookie ( mode, cookie, default value / value to set )                    *
- *                                                                                          *
- * Basic interface to the cookie plugin.                                                    *
- * Returns the default value if the cookie was unset, returns the user's setting if it was. *
- ********************************************************************************************/
-function handleCookie(mode, muffin, value) {
-   if (!$.cookie(muffin) || mode === "set") {
-        $.cookie(muffin, value, {
-            expires: 15000
-        });
-       return value;
-   } else if (mode === "get") {
-       return $.cookie(muffin);
-   }
-}
-/**************************************************************************************
-* Function: .supersleight() ( none )                                                 *
-*                                                                                    *
-* Fix transparent png and other issues in IE6.                                       *
-* from http://allinthehead.com/retro/338/supersleight-jquery-plugin                  *
-**************************************************************************************/
-jQuery.fn.supersleight = function(settings) {
-    settings = jQuery.extend({
-        imgs: true,
-        backgrounds: true,
-        shim: 'x.gif',
-        apply_positioning: true
-    }, settings);
-    return this.each(function(){
-        if (jQuery.browser.msie && parseInt(jQuery.browser.version) < 7 && parseInt(jQuery.browser.version) > 4) {
-            jQuery(this).find('*').each(function(i,obj) {
-                var self = jQuery(obj);
-                // background pngs
-                if (settings.backgrounds && self.css('background-image').match(/\.png/i) !== null) {
-                    var bg = self.css('background-image');
-                    var src = bg.substring(5,bg.length-2);
-                    var mode = (self.css('background-repeat') == 'no-repeat' ? 'crop' : 'scale');
-                    var styles = {
-                        'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='" + mode + "')",
-                        'background-image': 'url('+settings.shim+')'
-                    };
-                    self.css(styles);
-                };
-                // image elements
-                if (settings.imgs && self.is('img[src$=png]')){
-                    var styles = {
-                        'width': self.width() + 'px',
-                        'height': self.height() + 'px',
-                        'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + self.attr('src') + "', sizingMethod='scale')"
-                    };
-                    self.css(styles).attr('src', settings.shim);
-                };
-                // apply position to 'active' elements
-                if (settings.applyPositioning && self.is('a, input') && self.css('position') === ''){
-                    self.css('position', 'relative');
-                };
-            });
-        };
-    });
-};
-/**************************************************************************************
-* Function: fullWidthConverter ( string )                                            *
-*                                                                                    *
-* Convert fullwidth characters to standard halfwidth Latin.                          *
-**************************************************************************************/
-function fullWidthConverter(inputString) {
-    if (inputString === "") {
-        return "";
-    }
-    var convertMe = function(str, p1) {
-        return String.fromCharCode(p1.charCodeAt(0) - 65248);
-    },
-        i = inputString.length,
-        newString = [];
-    do {
-        newString.push(inputString[i-1].replace(/([\uFF01-\uFF5E])/g,convertMe));
-    } while (--i);
-    return newString.reverse().join("");
-}
-/**************************************************************************************
-* Function: countTracks ( none )                                                     *
-*                                                                                    *
-* Returns the number of tracks present in a release.                                 *
-**************************************************************************************/
-function countTracks() {
-    return $(".releasetracks").length;
-}
-/********************************************************************************************
- * Class creation function from Simple JavaScript Inheritance, by John Resig                *
- * http://ejohn.org/blog/simple-javascript-inheritance/                                     *
- ********************************************************************************************/
-(function() {
-    var initializing = false,
-    fnTest = /xyz/.test(function() { xyz; }) ? /\b_super\b/: /.*/; // The base Class implementation (does nothing)
-    this.Class = function() {}; // Create a new Class that inherits from this class
-    Class.extend = function(prop) {
-        var _super = this.prototype; // Instantiate a base class (but only create the instance,
-        // don't run the init constructor)
-        initializing = true;
-        var prototype = new this();
-        initializing = false; // Copy the properties over onto the new prototype
-        for (var name in prop) { // Check if we're overwriting an existing function
-            if (prop.hasOwnProperty(name)) {  // filter unwanted properties from the prototype
-                prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn) {
-                    return function() {
-                        var tmp = this._super; // Add a new ._super() method that is the same method
-                        // but on the super-class});
-                        this._super = _super[name]; // The method only need to be bound temporarily, so we
-                        // remove it when we're done executing
-                        var ret = fn.apply(this, arguments);
-                        this._super = tmp;
-                        return ret;
-                    };
-                })(name, prop[name]) : prop[name];
-            }
-        } // The dummy class constructor
-        function Class() { // All construction is actually done in the init method
-            if (!initializing && this.init) {
-                this.init.apply(this, arguments);
-            }
-        } // Populate our constructed prototype object
-        Class.prototype = prototype; // Enforce the constructor to be what we expect
-        Class.constructor = Class; // And make this class extendable
-        Class.extend = arguments.callee;
-        return Class;
-    };
-})();
-/********************************************************************************************
- * Function: alertUser                                                                      *
- *                                                                                          *
- * Handles popup messages                                                                   *
- * Types: "prompt" and "confirm" appear as popups                                           *
- ********************************************************************************************/
-function alertUser(type, message, callback) {
-    var typesettings, settings, popup, buttons;
-    switch(type) {
-        case "warning":
-            typesettings = {
-                buttons: {},
-                image: "120px-Gnome-dialog-warning",
-                imageAlt: text.ErrorTitle,
-                title: text.WarningTitle
-            };
-            typesettings.buttons[text.Ok] = 1;
-            break;
-        case "error":
-            typesettings = {
-                buttons: {},
-                image: "120px-Gnome-dialog-warning",
-                imageAlt: text.ErrorTitle,
-                title: text.ErrorTitle
-            };
-            typesettings.buttons[text.Ok] = 1;
-            break;
-        case "prompt":
-            typesettings = {
-                buttons: {},
-                image: "120px-Gnome-dialog-warning",
-                imageAlt: text.PromptTitle,
-                title: text.PromptTitle
-            };
-            typesettings.buttons[text.Ok] = 1;
-            break;
-        case "confirm":
-            typesettings = {
-                buttons: {},
-                image: "120px-Gnome-dialog-warning",
-                imageAlt: text.ConfirmTitle,
-                question: text.ConfirmQuestion,
-                title: text.ConfirmTitle,
-                msgcallback: callback
-            };
-            typesettings.buttons[text.Yes] = 1;
-            typesettings.buttons[text.No] = 2;
-            break;
-        default:
-    }
-    settings = $.extend({
-        imageLoc: filelocs.serverImage,
-        question: " "
-    }, typesettings);
-    popup  = '<div class="'+windowTitle+'">' + settings.title + '</div>';
-    popup += '<div class="'+floatLeft+'">';
-    popup +=     '<img src="'+settings.imageLoc+settings.image+'.'+imageExt;
-    popup +=        '" alt="'+settings.imageAlt+'" class="'+windowImage+'" />';
-    popup += '</div>';
-    popup += '<div class="'+windowMessage+'">'+message+'</div>';
-    popup += '<div class="'+windowConfirm+'">'+settings.question+'</div>';
-    $.prompt(popup,{
-        buttons: settings.buttons,
-        prefix: 'cleanblue',
-        show: 'fadeIn',
-        callback: settings.msgcallback
-    });
-}
-/********************************************************************************************
- * Constructor Prototypes: esButton, GcButton                                               * 
- * Constructors: UndoButton, ArtistButton, TitleButton, GuessAll, UndoAll, RevertAll        *
- * Constructor Functions: makeArtistButton, makeTitleButton ( field number, field object )  *
- *                                                                                          *
- * Field number is the track number.  Field object is the field upon which Guess Case       *
- * will be operating.  Each of the constructor functions creates a Guess Case button        *
- * and an Undo button, inserts them into a div, then inserts that div into the DOM just     *
- * after the field which Guess Case is operating upon.  That div's css then positions       *
- * it on the same line as the field, aligned with the right side of the screen.             *
- *                                                                                          *
- * The UndoButton, ArtistButton, and TitleButton constructors could be used independantly,  *
- * though they are designed, as with the form creation templates, to normally be instanced  *
- * using the constructor functions.  This is not the case for the Guess All, Undo All, and  *
- * Revert All buttons.  These are designed merely to create the button and return it.  The  *
- * form initialization code in es_main (for Guess All) and in es_undo_revert (for Undo All  *
- * and Revert All) then positions those 3 buttons within a form.  The Undo All and Revert   *
- * All buttons will be created on any form which includes the undo_revert Edit Suite        *
- * module.  The Guess All button will only be created if both the guess_case module is      *
- * included in the template *and* if the es=1 flag is set within the fieldset line within   *
- * that same template.                                                                      *
- *                                                                                          *
-// TODO: Make it possible to turn on Undo All / Revert All without also enabling Guess All.
-// TODO: Make sure that the scripts don't error out if es=1 is not set in the template.
- *                                                                                          *
- * Creates Edit Suite and Guess Case button objects                                         *
- ********************************************************************************************/
-var EsButton = Class.extend({
-    init: function(type) {
-        this.type = type;
-        this.target = "";
-        this.button = "generic";
-    },
-    makeButton: function(number) {
-        var gcButton = $(document.createElement('input')).attr({
-            id: "es-button-" + number + "-" + this.type + "-" + this.button,
-            name: this.type,
-            title: this.description,
-            type: "button",
-            value: this.text
-        }).addClass(controlButton)
-          .data("number", number)
-          .data("target", this.target)
-          .data("type", this.type);
-        return gcButton;
-    }
-});
-var GcButton = EsButton.extend({
-    init: function(target, type) {
-        this.type = type;
-        this._super(this.type);
-        this.description = text.ButtonTitleGuessCase;
-        this.text = text.ButtonGuessCase;
-        this.target = target;
-        this.button = "guesscase";
-    },
-    makeButton: function(number) {
-        return this._super(number).click(
-            function() {
-                storeHistory($(this).data("target").attr("value"), $(this).data("type"), $(this).data("number"));
-                // Check for the presence of a "language" dropdown in the current form.
-                if ($("select.release_language").length > 0) {
-                    $(this).data("target").attr("value", guessMyCase($(this).data("type"), $(this).data("number"), $(this).data("target").attr("value"), $("select.release_language").selectedValues()[0]));
-                } else {
-                    $(this).data("target").attr("value", guessMyCase($(this).data("type"), $(this).data("number"), $(this).data("target").attr("value")));
-                }
-            }
-        );
-    }
-});
-var TitleButton = GcButton.extend({
-    init: function(target) {
-        this._super(target, "title");
-        this.button = "gctitle";
-    },
-    makeButton: function(number) {
-        return this._super(number);
-    }
-});
-var ArtistButton = GcButton.extend({
-    init: function(target) {
-        this._super(target, "artist");
-        this.button = "gcartist";
-    },
-    makeButton: function(number) {
-        return this._super(number);
-    }
-});
-var LabelButton = GcButton.extend({  // Used on the add / edit label forms.
-    init: function(target) {
-        this._super(target, "label");
-        this.button = "gclabel";
-    },
-    makeButton: function(number) {
-        return this._super(number);
-    }
-});
-var UndoButton = EsButton.extend({
-    init: function(target, type) {
-        this._super(type);
-        this.description = text.ButtonTitleUndo;
-        this.target = target;
-        this.text = text.ButtonUndo;
-        this.button = "undo";
-    },
-    makeButton: function(number) {
-        return this._super(number).click(
-            function() {
-                $(this).data("target").attr("value", takeHistory($(this).data("type"), $(this).data("number")));
-            }
-        );
-    }
-});
-var GuessAllButton = EsButton.extend({
-    init: function() {
-        this._super("guessall");
-        this.description = text.ButtonTitleGuessAll;
-        this.text = text.ButtonGuessAll;
-        this.button = "guessall";
-    },
-    makeButton: function(number) {
-        return this._super(number).click(
-            function() {
-                $gcFieldsGroup.each(  // For each type of Guess Case field...
-                    function(group) {
-                        $gcFieldsGroup[group].each(   // ...and for each text field in that particular type of fields...
-                            function(i) {
-                                if ($(this).attr("value") !== "") {  // ...if that field isn't empty,
-                                    var type = $gcFieldsTitles[group];
-                                    var value = $(this).attr("value");
-                                    storeHistory(value, type, i);  // save the undo history,
-                                    if (type !== "duration") {  // then guess its case, unless it's a duration field...
-                                        $(this).attr("value", guessMyCase(type, i, value));
-                                    } else {
-                                        if ($gcfixDuration) {  /// ...where we first want make sure that the user has that option turned on.
-                                            $(this).attr("value", guessMyCase("duration", i, value));
-                                        }
-                                    }
-                                }
-                            }
-                        );
-                    }
-                );
-            }
-        );
-    }
-});
-var UndoAllButton = EsButton.extend({
-    init: function() {
-        this._super("undo");
-        this.description = text.ButtonTitleUndoAll;
-        this.text = text.ButtonUndoAll;
-        this.button = "undoall";
-    },
-    makeButton: function(number) {
-        return this._super(number).click(
-            function() {
-                undoAll();
-            }
-        );
-    }
-});
-var RevertAllButton = EsButton.extend({
-    init: function() {
-        this._super("revertall");
-        this.description = text.ButtonTitleRevertAll;
-        this.text = text.ButtonRevertAll;
-        this.button = "revertall";
-    },
-    makeButton: function(number) {
-        return this._super(number).click(
-            function() {
-                revertAll();
-            }
-        );
-    }
-});
-function makeTitleButton(i, element) {
-    $(element).after($(document.createElement('div')).attr("id", "es-gc-div-title-"+i)
-                                                     .addClass(buttonContainer)
-                                                     .append(new TitleButton($(element)).makeButton(i)
-                                                                                        .addClass("es-gc-button-gc-track")
-                                                     )
-                                                     .append($(document.createElement('span')).html("&nbsp;&nbsp;"))
-                                                     .append(new UndoButton($(element),"title").makeButton(i)
-                                                                                               .addClass("es-gc-button-gc-undo")
-                                                     )
-                    );
-}
-function makeArtistButton(i, element) {
-    $(element).after($(document.createElement('div')).attr("id", "es-gc-div-artist-"+i)
-                                                     .css("display", $(element).css("display"))
-                                                     .addClass(buttonContainer)
-                                                     .append(new ArtistButton($(element)).makeButton(i)
-                                                                                         .addClass("es-gc-button-gc-artist")
-                                                     )
-                                                     .append($(document.createElement('span')).html("&nbsp;&nbsp;"))
-                                                     .append(new UndoButton($(element),"artist").makeButton(i)
-                                                                                                .addClass("es-gc-button-gc-undo")
-                                                     )
-                    );
-}
-function makeLabelButton(i, element) {
-    $(element).after($(document.createElement('div')).attr("id", "es-gc-div-label-"+i)
-                                                     .css("display", $(element).css("display"))
-                                                     .addClass(buttonContainer)
-                                                     .append(new LabelButton($(element)).makeButton(i)
-                                                                                         .addClass("es-gc-button-gc-label")
-                                                     )
-                                                     .append($(document.createElement('span')).html("&nbsp;&nbsp;"))
-                                                     .append(new UndoButton($(element),"label").makeButton(i)
-                                                                                                .addClass("es-gc-button-gc-undo")
-                                                     )
-                    );
-}
-/********************************************************************************************
- * Function: addHints ( element collection, what text hint to use, left or center align )   *
- *                                                                                          *
- * Wrap needed elements for text hinting, then text-hinting.                                *
- ********************************************************************************************/
-function addHints(group, mask, align) {
-    group.each(function() {
-        var id = $(this).attr("id");
-        $(this).wrap('<div class="overlabel-wrapper" id="'+id+'-div"></div>');
-        $(this).before('<label id="'+id+'-label" for="'+id+'"class="overlabel" style="width:' + 
-            $(this).css("width") + ';">'+mask+'</label>');
-        switch(align) {
-            case "center":
-                $('#'+id+'-label').css({'text-align': 'center'});
-                break;
-            case "left":
-                $('#'+id+'-label').css({
-                    'padding-left': '5px',
-                    'text-align': 'left'
-                });
-                break;
-            default:
-        }
-    });
-}
-/********************************************************************************************
- * Function: overlabel ( none )                                                             *
- *                                                                                          *
- * Original concept by Mike Brittain                                                        *
- * Written by Scott Sauyet                                                                  *
- * Modified by Dave Methvin                                                                 *
- * Modified by Aristotle Pagaltzis                                                          *
- * Modified by Guy Fraser                                                                   *
- * Modified by Brian Schweitzer (BrianFreud)                                                *
- *                                                                                          *
- * Creates a label overlay for text input fields which hides when the user clicks into      *
- * the field, stays hidden if the user enters text, or is re-displayed if the field is      *
- * left blank when the user moves out of the field.                                         *
- *                                                                                          *
- * http://scott.sauyet.com/thoughts/archives/2007/03/31/overlabel-with-jquery/              *
- * Licensed as Creative Commons Public Domain Dedication.                                   *
- ********************************************************************************************/
-(function($) {
-    $.fn.overlabel = function(options) {
-        var opts = $.extend({},
-        $.fn.overlabel.defaults, options);
-        var selection = this.filter('label[for]').map(function() {
-            var label = $(this);
-            var id = label.attr('for');
-            var field = document.getElementById(id);
-            if (!field) {
-                return;
-            }
-            var o = $.meta ? $.extend({},
-            opts, label.data()) : opts;
-            label.addClass(o.label_class);
-            var hide_label = function() {
-                label.css(o.hide_css);
-            };
-            var show_label = function() {
-                this.value || label.css(o.show_css);
-            };
-            $(field).parent()
-                    .addClass(o.wrapper_class)
-                    .end()
-                    .focus(hide_label)
-                    .blur(show_label)
-                    .each(hide_label)
-                    .each(show_label);
-            return this;
-        });
-        return opts.filter ? selection: selection.end();
-    };
-    $.fn.overlabel.defaults = {
-        label_class: 'overlabel-apply',
-        wrapper_class: 'overlabel-wrapper',
-        hide_css: {
-            'display': 'none'
-        },
-        show_css: {
-            'display': 'inline',
-            'cursor': 'text'
-        },
-        filter: false
-    };
-})(jQuery);
-/********************************************************************************************
- * Function: addErrorReport
- * 
- * Displays error report for a given input field
- ********************************************************************************************/
-function addErrorReport(type, number) {
-    var element;
-    switch (type) {
-    case "title":
-        element = $($trackTitleGroup).get(number);
-        leftDistance = -270;
-        break;
-    case "artist":
-        element = $artistGroup.get(number);
-        leftDistance = -429;
-        break;
-    case "duration":
-        element = $durationGroup.get(number);
-        leftDistance = -200;
-        break;
-    case "label":
-        element = $labelGroup.get(number);
-        leftDistance = -200;
-        break;
-    case "text":
-        element = $textTextGroup.get(number);
-        leftDistance = -270;
-        break;
-    case "textartist":
-        element = $textArtistGroup.get(number);
-        leftDistance = -429;
-        break;
-    }
-    $("#" + $(element).attr("id") + "-hint").remove();
-    if (howManyErrors(type, number) > 0) {
-        $(element).inputHintBox({
-            className: 'es_error_hint',
-            source: 'html',
-            html: takeErrors(type, number),
-            incrementLeft: leftDistance,
-            incrementTop: 20,
-            id: $(element).attr("id") + "-hint",
-            attachTo: $(element).parent()
-        });
-        $(element).addClass("es_field_error");
-    } else {
-        $(element).attr("title", "");
-        $(element).removeClass("es_field_error");
-    }
-}
-/**************************************************************************************
-* Function: removeTrack ( number )                                                    *
-*                                                                                     *
-* Removes the specified track.                                                        *
-**************************************************************************************/
-function removeTrack(trackToRemove) {
-    removeRecord(countTracks(), trackToRemove);  // Update the undo stack.
-    if (countTracks() != trackToRemove) {  // check that we're not removing the last track.
-        var currentTrack = trackToRemove;
-        do {
-            $("#form-add-release-tracks-track_" + currentTrack + "-name").attr("value",$("#form-add-release-tracks-track_" + (parseInt(currentTrack,10) + 1) + "-name").attr("value"));
-            $("#form-add-release-tracks-track_" + currentTrack + "-duration").attr("value",$("#form-add-release-tracks-track_" + (parseInt(currentTrack,10) + 1) + "-duration").attr("value"));
-            $("#form-add-release-tracks-artist-" + currentTrack).attr("value",$("#form-add-release-tracks-artist-" + (parseInt(currentTrack,10) + 1)).attr("value"));    
-            currentTrack++;
-        } while (currentTrack < countTracks());
-    }
-    $(".releasetracks:last").remove();
-    $(".es-button-inserttrack:last").attr("value",text.AddTrack+ ' ➡');
-}
-/**************************************************************************************
-* Function: insertTrack ( number )                                                    *
-*                                                                                     *
-* Inserts a track after the track specified.  If no track number is specified, or if  *
-* the track number specified is higher than the highest track number present, the new *
-* track is added to the end of the release.                                           *
-**************************************************************************************/
-function insertTrack(insertWhere) {
-    if (typeof(insertWhere) == "undefined") {
-        insertWhere = countTracks() + 1;
-    } else if (insertWhere > countTracks()) {
-        insertWhere = countTracks() + 1;
-    }
-    var thisTrack = parseInt(countTracks(),10) + 1;
-    /* Take the innerHTML of the stored copy of track 1, change the ids, and add it to the end of the release. */
-    $("#form-add-release-tracks-track_"+countTracks()).after('<br /><div class="releasetracks" id="form-add-release-tracks-track_' + thisTrack + '">' + rawTrack.replace(/1/g, thisTrack) + '</div>');
-    /* Remove the ?:?? from the duration field. */
-    $("#form-add-release-tracks-track_" + thisTrack + "-duration").attr("value","");
-    /* Add hinting to the duration field on the new track. */
-    addHints($("#form-add-release-tracks-track_" + thisTrack + "-duration"), "?:??", "center");
-    $("label.overlabel").overlabel();
-    /* Add the Guess Case buttons. */
-    makeTitleButton(parseInt(thisTrack,10) - 1, $("#form-add-release-tracks-track_" + thisTrack + "-name"));
-    makeArtistButton(parseInt(thisTrack,10) - 1, $("#form-add-release-tracks-artist-" + thisTrack));
-    /* Add the insert and remove buttons. */
-    $("#form-add-release-tracks-track_" + thisTrack).prepend('<div style="position: absolute; display: inline; margin-left: -1.4em;"> ' +
-            '<input class="es-button-removetrack" type="button" value="' + text.Remove + ' ➡" style="font-size: .9em; margin-top: 1em;">' +
-            '<br />' +
-            '<input class="es-button-inserttrack" type="button" value="' + text.InsertTrack + ' ➡" style="font-size: .9em; margin-top: 2.7em;">')
-        .css({'margin-top': '.3em'});
-    $(".es-button-inserttrack").attr("value",text.InsertTrack+ ' ➡');
-    $(".es-button-inserttrack:last").attr("value",text.AddTrack+ ' ➡');
-    $("#form-add-release-tracks-track_" + thisTrack + " .es-button-inserttrack").click(function() {
-        insertTrack(thisTrack);
-    });
-    $("#form-add-release-tracks-track_" + thisTrack + " .es-button-removetrack").click(function() {
-        removeTrack(i+1);
-    });
-    /* Update the global collection variables. */
-    $trackTitleGroup = $("input[class='track_name']");
-    $artistGroup = $("input[class='artist_name']");
-    $durationGroup = $("input[class='track_duration']");
-    $gcFieldsGroup = $([$trackTitleGroup, $artistGroup, $durationGroup, $labelGroup, $textTextGroup, $textArtistGroup]);
-    if (insertWhere != countTracks()) { // We're inserting into the release.
-        /* Extend the undo and error count arrays to handle the new track. */
-        insertNewRecord(insertWhere, thisTrack);
-        /* Shift the form data. */
-// TODO: Once switch.tt is back in, we also need to shift the locked artists here.
-        var currentTrack = countTracks();
-        do {
-            $("#form-add-release-tracks-track_" + currentTrack + "-name").attr("value",$("#form-add-release-tracks-track_" + (parseInt(currentTrack,10) - 1) + "-name").attr("value"));
-            $("#form-add-release-tracks-track_" + currentTrack + "-duration").attr("value",$("#form-add-release-tracks-track_" + (parseInt(currentTrack,10) - 1) + "-duration").attr("value"));
-            $("#form-add-release-tracks-artist-" + currentTrack).attr("value",$("#form-add-release-tracks-artist-" + (parseInt(currentTrack,10) - 1)).attr("value"));
-            currentTrack--;
-        } while (currentTrack > (parseInt(insertWhere,10) + 1) && currentTrack !== 0);
-        $("#form-add-release-tracks-track_" + currentTrack + "-name").attr("value","");
-        $("#form-add-release-tracks-track_" + currentTrack + "-duration").attr("value","");
-        $("#form-add-release-tracks-artist-" + currentTrack).attr("value","");
-    } else { // We're appending to the end of the release.
-        /* Extend the undo and error count arrays to handle the new track. */
-        addNewRecord(thisTrack);
-    }
-}
-/**************************************************************************************
-* Function: catalogNumberCheck ( none )                                               *
-*                                                                                     *
-* Binds post-edit events to check for problematic catalog numbers.                    *
-**************************************************************************************/
-function catalogNumberCheck() {
-    $catalogGroup.each(function() {
-        $(this).blur(function() {
-            $("#" + $(this).attr("id") + "-hint").remove();
-            $(this).attr("value",jQuery.trim($(this).attr("value")));
-            if(new RegExp(/^[0B][A-Z0-9]{9}$/).test($(this).attr("value"))) {
-                $(this).inputHintBox({
-                    className: 'es_error_hint',
-                    source: 'html',
-                    html: text.AmazonCatalog,
-                    incrementLeft: -300,
-                    incrementTop: 20,
-                    id: $(this).attr("id") + "-hint",
-                    attachTo: $(this).parent()
-                });
-                $(this).addClass("es_field_error");
-            } else {
-                $(this).removeClass("es_field_error");
-            }
-        });
-    });
-}
-/**************************************************************************************
-* Function: updateEvents ( none )                                                     *
-*                                                                                     *
-* Updates the identifiers for release events.                                         *
-**************************************************************************************/
-function updateEvents() {
-    $("label.overlabel").overlabel();
-    $("label.overlabel").toggle().toggle().show();
-    $("input").each(function() { // Refresh the input masks.
-        $(this).triggerHandler("focus");
-        $(this).triggerHandler("blur");
-    });
-    $(".es-events-remove").each(function(i) {  // Rebind the remove events.
-        $(this).click(function() {
-            $("#es-events > table > tbody > tr:eq("+i+")").remove();
-            updateEvents();
-        });
-    });
-    catalogNumberCheck();
-    /* Update the global collection variables for release events. */
-    $dateYearGroup = $("input[id$='date-year']");
-    $dateMonthGroup = $("input[id$='date-month']");
-    $dateDayGroup = $("input[id$='date-day']");
-    $labelGroup = $("input[class='release_event_label']");
-    $catalogGroup = $("input[class='release_event_catalog']");
-    $barcodeGroup = $("input[class='release_event_barcode']");
-    $gcFieldsGroup = $([$trackTitleGroup, $artistGroup, $durationGroup, $labelGroup, $textTextGroup, $textArtistGroup]);
-}
-/**************************************************************************************
-* Function: .swap ( none )                                                            *
-*                                                                                     *
-* Swap the position of two elements.                                                  *
-* from http://brandonaaron.net/blog/2007/06/10/jquery-snippets-swap                   *
-**************************************************************************************/
-jQuery.fn.swap = function(b) {
-    b = jQuery(b)[0];
-    var a = this[0],
-        a2 = a.cloneNode(true),
-        b2 = b.cloneNode(true),
-        stack = this;
-    a.parentNode.replaceChild(b2, a);
-    b.parentNode.replaceChild(a2, b);
-    stack[0] = a2;
-    return this.pushStack( stack );
-};
-/**************************************************************************************
-* Function: setTrackMovers ( none )                                                   *
-*                                                                                     *
-* Handles the move up / down track manipulators.                                      *
-**************************************************************************************/
-function setTrackMovers() {
-    $(".es-track-up").show();
-    $(".es-track-up:first").hide();
-    $(".es-track-down").show();
-    $(".es-track-down:last").hide();
-    $(".es-track-up").unbind("click");
-    $(".es-track-down").unbind("click");
-    $(".es-button-inserttrack").attr("value",text.InsertTrack+ ' ➡');
-    $(".es-button-inserttrack:last").attr("value",text.AddTrack+ ' ➡');
-    $("label.overlabel").overlabel();
-    $(".es-track-up").each(function(i) {
-        $(this).click(function() {
-            $(".track_number:eq(" + i + ")").attr("value", i);
-            $(".track_number:eq(" + (i - 1) + ")").attr("value", (i + 1));
-            $(".releasetracks:eq(" + i + ")").swap(".releasetracks:eq(" + (i - 1) + ")");
-            setTrackMovers();
-        });
-    });
-    $(".es-track-down").each(function(i) {
-        $(this).click(function() {
-            $(".track_number:eq(" + i + ")").attr("value", (i + 2));
-            $(".track_number:eq(" + (i + 1) + ")").attr("value", (i + 1));
-            $(".releasetracks:eq(" + i + ")").swap(".releasetracks:eq(" + (i + 1) + ")");
-            setTrackMovers();
-        });
-    });
-}
-/**************************************************************************************
-* Function: addEvent ( none )                                                         *
-*                                                                                     *
-* Adds a release event.                                                               *
-**************************************************************************************/
-function addEvent() {
-    var eventCount = $("#es-events > table > tbody > tr").length;
-    $("#es-events > table > tbody").append("<tr>" + rawEvent.replace(/event\-1/g,"event-"+(parseInt(eventCount,10)+1)) + "</tr>");
-    $("#es-events > table > tbody > tr:last > input").attr("value","");  // Clear out any data that may have been carried over.
-    $("#es-events > table > tbody > tr:last > select").attr("value","");  // Clear out any data that may have been carried over.
-    $("label.overlabel").overlabel();
-    $("label.overlabel").toggle().toggle().show();
-    $("input").each(function() { // Refresh the input masks.
-        $(this).triggerHandler("focus");
-        $(this).triggerHandler("blur");
-    });
-    $(".es-events-remove").each(function(i) {
-        $(this).click(function() {
-            $("#es-events > table > tbody > tr:eq("+i+")").hide();
-            $("#es-events > table > tbody > tr:eq("+i+") > input[id$='remove'])").attr("checked",true);
-        });
-    });
-    catalogNumberCheck();
-    /* Update the global collection variables for release events. */
-    $dateYearGroup = $("input[id$='date-year']");
-    $dateMonthGroup = $("input[id$='date-month']");
-    $dateDayGroup = $("input[id$='date-day']");
-    $labelGroup = $("input[class='release_event_label']");
-    $catalogGroup = $("input[class='release_event_catalog']");
-    $barcodeGroup = $("input[class='release_event_barcode']");
-    $gcFieldsGroup = $([$trackTitleGroup, $artistGroup, $durationGroup, $labelGroup, $textTextGroup, $textArtistGroup]);
-}
-function validateType() {
-    var CompNames = new RegExp("(Best of|Greatest Hits|Compilation|Collection|Anthology|Collection)","i");
-    if (CompNames.test($(".release-title:eq(1)").attr("value"))) {
-        if ($(".release_type:eq(0)").selectedValues() != 4) { // If not a compilation
-            alertUser("warning",text.LikelyACompilation);
-        }
-    }
-}
-$(function() {
-    /* Work around IE6 and its serious layout issues with all the css.  */
-    /* Without this, the sidebar would be placed below the entire edit form and various other problems would arise.  */
-    /* IE6 isn't pretty, but this at least makes it a little more functional. */
-    if (jQuery.browser.msie && parseInt(jQuery.browser.version) < 7) {
-        $('body').supersleight({shim: '/static/images/es/x.gif'});
-        $("#header").after('<table><tr><td id="es-ie6-sidebar"></td><td id="es-ie6-right"></td></tr></table>');
-        document.getElementById("es-ie6-sidebar").appendChild(document.getElementById("sidebar"));
-        document.getElementById("es-ie6-right").appendChild(document.getElementById("container"));
-        $("#es-ie6-sidebar").attr("valign","top");
-        $("#es-ie6-right").attr("valign","top");
-        $("#content").css("margin-left","0");
-    }
-    /* -------------------------------------------------------------------------*/
-    /* Swap JavaScript / no-JavaScript text                                     */
-    /* -------------------------------------------------------------------------*/
-    $(".only-if-no-javascript").hide();
-    $(".only-if-javascript").show();
-    /* -------------------------------------------------------------------------*/
-    /* Remove the ?:?? that is in the duration fields - text hinting can't      */
-    /* accidentally be submitted, they can.                                     */
-    /* -------------------------------------------------------------------------*/
-    $durationGroup.each(function(i) {
-        if ($(this).attr("value") == "?:??") {
-            $(this).attr("value", "");
-        }
-    });
-    /* -------------------------------------------------------------------------*/
-    /* Store the "clean copy" of the first track, to use as a template later.   */
-    /* -------------------------------------------------------------------------*/
-    rawTrack = $("#form-add-release-tracks-track_1").html();
-    /* -------------------------------------------------------------------------*/
-    /* Add input hints to duration and release event fields and do general      */
-    /* cleaning up of release events for nicer UI.                              */
-    /* -------------------------------------------------------------------------*/
-    $("#es-events th:first").html("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
-    $("td:has(.release_event_remove)").hide();
-    $(".no_label:has(#form-add-release-tracks-more-events)").remove();
-    $(".release_event_format option:first").text("[ " + text.SelectFormat + " ]");
-    $(".release_event_country option:first").text("[ " + text.SelectCountry + " ]");
-    $(".release_type option:first").text("[ " + text.SelectOne + " ]");
-    $(".release_status option:first").text("[ " + text.SelectOne + " ]");
-    $("#es-events > table > tbody > tr").each(function() {
-        $(this).prepend('<td><img class="es-events-remove" alt="' + text.RERemove + '" src="/static/images/release_editor/remove-off.gif" /></td>');
-    });
-    $dateYearGroup.css("width","4em");
-    $dateMonthGroup.css("width","2.5em");
-    $dateDayGroup.css("width","2.5em");
-    addHints($dateYearGroup, text.YearMask, "left");
-    $("label.overlabel").overlabel();
-    addHints($dateMonthGroup, text.MonthMask, "left");
-    $("label.overlabel").overlabel();
-    addHints($dateDayGroup, text.DayMask, "left");
-    $("label.overlabel").overlabel();
-    addHints($labelGroup, text.LabelMask, "left");
-    $("label.overlabel").overlabel();
-    addHints($catalogGroup, text.CatalogMask, "left");
-    $("label.overlabel").overlabel();
-    addHints($barcodeGroup, "00000000000000", "left");
-    $("label.overlabel").overlabel();
-    $(".overlabel").css({'padding-left': '5px','text-align': 'left'}); // Force all the "left" items to actually go to the left (avoids issues with the date masks).
-    $dateYearGroup.css({'text-align': 'center'});
-    $dateMonthGroup.css({'text-align': 'center'});
-    $dateDayGroup.css({'text-align': 'center'});
-    addHints($durationGroup, "?:??", "center");
-    $("label.overlabel").overlabel();
-    rawEvent = $("#es-events > table > tbody > tr:first").html();
-    $("#es-events").append('<br /><input style="margin-left: 2.5em;" type="button" id="es-button-add-event" value="' + text.AddRE + '" />');
-    $("#es-button-add-event").click(function() {
-        addEvent();
-    });
-    $(".es-events-remove").each(function(i) {
-        $(this).click(function() {
-            $("#es-events > table > tbody > tr:eq("+i+")").hide();
-            $("#es-events > table > tbody > tr:eq("+i+") > input[id$='remove'])").attr("checked",true);
-        });
-    });
-    $("label.overlabel").toggle().toggle().show();
-    $("input").each(function() { // Refresh the input masks.
-        $(this).triggerHandler("focus");
-        $(this).triggerHandler("blur");
-    });
-    $("#label-form-create-label-name-label, #label-form-edit-label-name-label").remove();  // Don't overlabel label field on add / edit label forms.
-    /* Give a heads up if it appears as though an ASIN has been entered as a catalog number. */
-    catalogNumberCheck();
-    /* -------------------------------------------------------------------------*/
-    /* Add track insertion, manipulation, and removal controls.                 */
-    /* -------------------------------------------------------------------------*/
-    $(".releasetracks").prepend('<div class="es-track-controls" style="position: absolute; display: inline; margin-left: -1.4em;">' +
-            '<input class="es-button-removetrack" type="button" value="' + text.Remove + ' ➡" style="font-size: .9em; margin-top: 1em;">' +
-            '<br />' +
-            '<input class="es-button-inserttrack" type="button" value="' + text.InsertTrack + ' ➡" style="font-size: .9em; margin-top: 2.4em;">')
-        .css({'margin-top': '.3em'});
-    $(".es-button-inserttrack:last").attr("value",text.AddTrack+ ' ➡');
-    $(".es-button-inserttrack").each(function(i) {
-        $(this).click(function() {
-           insertTrack(i+1); 
-        });
-    });
-    $(".es-button-removetrack").each(function(i) {
-        $(this).click(function() {
-            removeTrack(i+1);
-        });
-    });
-    $(".track_remove").hide();
-    $(".track_number").before('<input value="↑" title="' + text.MoveUp + '" class="es-track-controls es-track-up" type="button" style="padding:0 3px 0 3px;font-weight:bolder;"/>');
-    $(".track_number").after('<input value="↓" title="' + text.MoveDown + '" class="es-track-controls es-track-down" type="button" style="padding:0 3px 0 3px;font-weight:bolder;"/>');
-    setTrackMovers();
-    $("#form-controls").prepend('<input id="es-button-manipulators" type="button" value="' + text.Manipulators + '" style="float: left;" />')
-                       .css({"marginRight" : "-10pt"});
-    $("#es-button-manipulators").click(function() {
-        $(".es-track-controls").toggle();
-        $(".es-track-up:first").hide();
-        $(".es-track-down:last").hide();
-    });
-    $(".es-track-controls").hide();
-    /* Shrink breadcrumbs for browsers who render them too large, so that they wrap. */
-    if (new RegExp("epiphany","i").test(navigator.userAgent)) {
-        $("#wizard_breadcrumbs > li").css("font-size","11.1");
-    }
-    /* Add warning for compilations not set to compilation. */
-    $(".release_type:eq(0)").change(validateType);
-});
diff --git a/root/static/scripts/common/es_guess_case.js b/root/static/scripts/common/es_guess_case.js
deleted file mode 100644
index b5fe39e..0000000
--- a/root/static/scripts/common/es_guess_case.js
+++ /dev/null
@@ -1,5556 +0,0 @@
-var TurkishI,
-    NON_BMP_CHAR_CODES = {
-    BOTTOM : 55296,
-    TOP    : 56319
-}
-String.prototype.toMusicBrainzUpperCase = function() { 
-    if (this.length === 0) {
-        return "";
-    }
-    var returnString = "",
-        x,
-        i = 0;
-    do
-    {
-        x = this[i];
-        if (x.charCodeAt(0) >= NON_BMP_CHAR_CODES.BOTTOM && x.charCodeAt(0) <= NON_BMP_CHAR_CODES.TOP) {  // Deseret characters are in plane 1, thus 2 chars wide.  Also avoids CJK issues and other planes 1 - 16 issues.
-            x = String.fromCharCode(this.charAt(i).charCodeAt(0)) + String.fromCharCode(this.charAt(++i).charCodeAt(0));
-        }
-        switch(x) {
-            /* Handle Turkish I problem. */
-            case "i": returnString += TurkishI ? "İ" : "I"; break;
-            case "ı": returnString += "I"; break;
-            case "İ": returnString += "İ"; break;  // Make sure it stays dotted. - composed version
-            case "İ": returnString += "İ"; break;  // Make sure it stays dotted. - precomposed version
-            /* Composed characters where want titlecase, not uppercase. */
-            case "dž": returnString += "Dž"; break;
-            case "dz": returnString += "Dz"; break;
-            case "nj": returnString += "Nj"; break;
-            case "lj": returnString += "Lj"; break;
-            case "lj": returnString += "Lj"; break;
-            case "lj": returnString += "Lj"; break;
-            /* Non-reversible titlecasing for composed characters where want titlecase, not uppercase.  Non-reversibility is per Unicode spec. */
-            case "ff": returnString += "Ff"; break;
-            case "fi": returnString += "Fi"; break;
-            case "fl": returnString += "Ffi"; break;
-            case "ffi": returnString += "Ffi"; break;
-            case "ffl": returnString += "Ffl"; break;
-            case "ſt": returnString += "St"; break;
-            case "st": returnString += "St"; break;
-            case "և": returnString += "Եւ"; break;
-            case "ﬓ": returnString += "Մն"; break;
-            case "ﬔ": returnString += "Մե"; break;
-            case "ﬕ": returnString += "Մի"; break;
-            case "ﬖ": returnString += "Վն"; break;
-            case "ﬗ": returnString += "Մխ"; break;
-            case "ʼn": returnString += "ʼN"; break;
-            case "ΐ": returnString += "Ϊ́"; break;
-            case "ΰ": returnString += "Ϋ́"; break;
-            case "ǰ": returnString += "J̌"; break;
-            case "ẖ": returnString += "H̱"; break;
-            case "ẗ": returnString += "T̈"; break;
-            case "ẘ": returnString += "W̊"; break;
-            case "ẙ": returnString += "Y̊"; break;
-            case "ẚ": returnString += "A"; break;
-            case "ὐ": returnString += "Υ̓"; break;
-            case "ὒ": returnString += "Υ̓̀"; break;
-            case "ὔ": returnString += "Υ̓́"; break;
-            case "ὖ": returnString += "Υ̓͂"; break;
-            case "ᾶ": returnString += "Α͂"; break;
-            case "ῆ": returnString += "Η͂"; break;
-            case "ῒ": returnString += "Ϊ̀"; break;
-            case "ΐ": returnString += "Ϊ́"; break;
-            case "ῖ": returnString += "Ι͂"; break;
-            case "ῗ": returnString += "Ϊ͂"; break;
-            case "ῢ": returnString += "Ϋ̀"; break;
-            case "ΰ": returnString += "Ϋ́"; break;
-            case "ῤ": returnString += "Ρ̓"; break;
-            case "ῦ": returnString += "Υ͂"; break;
-            case "ῧ": returnString += "Ϋ͂"; break;
-            case "ῶ": returnString += "Ω͂"; break;
-            case "ȸ": returnString += "Db"; break;
-            case "ʣ": returnString += "Dz"; break;
-            case "ʥ": returnString += "Dʑ "; break;
-            case "ʤ": returnString += "Dʒ"; break;
-            case "ʩ": returnString += "Fŋ"; break;
-            case "ʪ": returnString += "Ls"; break;
-            case "ʫ": returnString += "Lz"; break;
-            case "ɮ": returnString += "ʒ "; break;
-            case "ȹ": returnString += "Qp"; break;
-            case "ʨ": returnString += "Tɕ"; break;
-            case "ʦ": returnString += "Ts"; break;
-            case "ʧ": returnString += "Tʃ"; break;
-            /* Characters broken in various browser implementations of toLocaleUpperCase.  */
-            case "ȳ": returnString += "Ȳ"; break;  // U+0233 - test 21, broken in IE8
-            case "ɇ": returnString += "Ɇ"; break;  // U+0247 - test 24, broken in IE8
-            case "ⰺ": returnString += "Ⰺ"; break;  // U+2C3A - test 8, broken in IE8
-            case "ⲳ": returnString += "Ⲳ"; break;  // U+2CB3 - test 158, broken in IE8
-            case "ⲵ": returnString += "Ⲵ"; break;  // U+2CB5 - test 159, broken in IE8
-            case "ⲷ": returnString += "Ⲷ"; break;  // U+2CB7 - test 160, broken in IE8
-            /* Deseret Unicode block, no characters implemented in toLocaleUpperCase in any major browser.  */
-            case "𐐨": returnString += "𐐀"; break;  // Deseret small letter long i (U+10428)
-            case "𐐩": returnString += "𐐁"; break;  // Deseret small letter long e (U+10429)
-            case "𐐪": returnString += "𐐂"; break;  // Deseret small letter long a (U+1042a)
-            case "𐐫": returnString += "𐐃"; break;  // Deseret small letter long ah (U+1042b)
-            case "𐐬": returnString += "𐐄"; break;  // Deseret small letter long o (U+1042c)
-            case "𐐭": returnString += "𐐅"; break;  // Deseret small letter long oo (U+1042d)
-            case "𐐮": returnString += "𐐆"; break;  // Deseret small letter short i (U+1042e)
-            case "𐐯": returnString += "𐐇"; break;  // Deseret small letter short e (U+1042f)
-            case "𐐰": returnString += "𐐈"; break;  // Deseret small letter short a (U+10430)
-            case "𐐱": returnString += "𐐉"; break;  // Deseret small letter short ah (U+10431)
-            case "𐐲": returnString += "𐐊"; break;  // Deseret small letter short o (U+10432)
-            case "𐐳": returnString += "𐐋"; break;  // Deseret small letter short oo (U+10433)
-            case "𐐴": returnString += "𐐌"; break;  // Deseret small letter ay (U+10434)
-            case "𐐵": returnString += "𐐍"; break;  // Deseret small letter ow (U+10435)
-            case "𐐶": returnString += "𐐎"; break;  // Deseret small letter wu (U+10436)
-            case "𐐷": returnString += "𐐏"; break;  // Deseret small letter yee (U+10437)
-            case "𐐸": returnString += "𐐐"; break;  // Deseret small letter h (U+10438)
-            case "𐐹": returnString += "𐐑"; break;  // Deseret small letter pee (U+10439)
-            case "𐐺": returnString += "𐐒"; break;  // Deseret small letter bee (U+1043a)
-            case "𐐻": returnString += "𐐓"; break;  // Deseret small letter tee (U+1043b)
-            case "𐐼": returnString += "𐐔"; break;  // Deseret small letter dee (U+1043c)
-            case "𐐽": returnString += "𐐕"; break;  // Deseret small letter chee (U+1043d)
-            case "𐐾": returnString += "𐐖"; break;  // Deseret small letter jee (U+1043e)
-            case "𐐿": returnString += "𐐗"; break;  // Deseret small letter kay (U+1043f)
-            case "𐑀": returnString += "𐐘"; break;  // Deseret small letter gay (U+10440)
-            case "𐑁": returnString += "𐐙"; break;  // Deseret small letter ef (U+10441)
-            case "𐑂": returnString += "𐐚"; break;  // Deseret small letter vee (U+10442)
-            case "𐑃": returnString += "𐐛"; break;  // Deseret small letter eth (U+10443)
-            case "𐑄": returnString += "𐐜"; break;  // Deseret small letter thee (U+10444)
-            case "𐑅": returnString += "𐐝"; break;  // Deseret small letter es (U+10445)
-            case "𐑆": returnString += "𐐞"; break;  // Deseret small letter zee (U+10446)
-            case "𐑇": returnString += "𐐟"; break;  // Deseret small letter esh (U+10447)
-            case "𐑈": returnString += "𐐠"; break;  // Deseret small letter zhee (U+10448)
-            case "𐑉": returnString += "𐐡"; break;  // Deseret small letter er (U+10449)
-            case "𐑊": returnString += "𐐢"; break;  // Deseret small letter el (U+1044a)
-            case "𐑋": returnString += "𐐣"; break;  // Deseret small letter em (U+1044b)
-            case "𐑌": returnString += "𐐤"; break;  // Deseret small letter en (U+1044c)
-            case "𐑍": returnString += "𐐥"; break;  // Deseret small letter eng (U+1044d)
-            case "𐑎": returnString += "𐐦"; break;  // Deseret small letter oi (U+1044e)
-            case "𐑏": returnString += "𐐧"; break;  // Deseret small letter ew (U+1044f)
-            default:
-                returnString += x.toLocaleUpperCase();
-        }
-        i++;
-    }
-    while (i < this.length);
-    return returnString;
-};
-
-String.prototype.toMusicBrainzLowerCase = function() { 
-    if (this.length === 0) {
-        return "";
-    }
-    var returnString = "",
-        x,
-        i = 0;
-    do
-    {
-        x = this[i];
-        if (x.charCodeAt(0) >= NON_BMP_CHAR_CODES.BOTTOM && x.charCodeAt(0) <= NON_BMP_CHAR_CODES.TOP) {  // Deseret characters are in plane 1, thus 2 chars wide.  Also avoids CJK issues and other planes 1 - 16 issues.
-            x = String.fromCharCode(this.charAt(i).charCodeAt(0)) + String.fromCharCode(this.charAt(++i).charCodeAt(0));
-        }
-        switch(x) {
-            /* Handle Turkish I problem. */
-            case "ı": returnString += "ı"; break;  // Make sure it stays dotless.
-            case "İ": returnString += "i"; break;  // Precomposed version
-            case "İ": returnString += "i"; break;  // Composed version
-            case "I": returnString += TurkishI ? "ı" : "i"; break;
-            /* Characters broken in various browser implementations of toLocaleLowerCase.  */
-            case "Ǝ": returnString += "ǝ"; break;  // U+018E - test 1, broken in IE8
-            case "Ⲅ": returnString += "ⲅ"; break;  // U+2C84 - test 36, broken in IE8
-            case "Ⲛ": returnString += "ⲛ"; break;  // U+2C9A - test 47, broken in IE8
-            case "Ⳓ": returnString += "ⳓ"; break;  // U+2CD2 - test 75, broken in IE8
-            case "Ⳕ": returnString += "ⳕ"; break;  // U+2CD4 - test 76, broken in IE8
-            case "Ⴇ": returnString += "ⴇ"; break;  // U+10A7 - test 127, broken in IE8
-            case "Ⴈ": returnString += "ⴈ"; break;  // U+10A8 - test 128, broken in IE8
-            /* Deseret Unicode block, no characters implemented in toLocaleLowerCase in any major browser.  */
-            case "𐐀": returnString += "𐐨"; break;  // Deseret capital letter long i (U+10400)
-            case "𐐁": returnString += "𐐩"; break;  // Deseret capital letter long e (U+10401)
-            case "𐐂": returnString += "𐐪"; break;  // Deseret capital letter long a (U+10402)
-            case "𐐃": returnString += "𐐫"; break;  // Deseret capital letter long ah (U+10403)
-            case "𐐄": returnString += "𐐬"; break;  // Deseret capital letter long o (U+10404)
-            case "𐐅": returnString += "𐐭"; break;  // Deseret capital letter long oo (U+10405)
-            case "𐐆": returnString += "𐐮"; break;  // Deseret capital letter short i (U+10406)
-            case "𐐇": returnString += "𐐯"; break;  // Deseret capital letter short e (U+10407)
-            case "𐐈": returnString += "𐐰"; break;  // Deseret capital letter short a (U+10408)
-            case "𐐉": returnString += "𐐱"; break;  // Deseret capital letter short ah (U+10409)
-            case "𐐊": returnString += "𐐲"; break;  // Deseret capital letter short o (U+1040a)
-            case "𐐋": returnString += "𐐳"; break;  // Deseret capital letter short oo (U+1040b)
-            case "𐐌": returnString += "𐐴"; break;  // Deseret capital letter ay (U+1040c)
-            case "𐐍": returnString += "𐐵"; break;  // Deseret capital letter ow (U+1040d)
-            case "𐐎": returnString += "𐐶"; break;  // Deseret capital letter wu (U+1040e)
-            case "𐐏": returnString += "𐐷"; break;  // Deseret capital letter yee (U+1040f)
-            case "𐐐": returnString += "𐐸"; break;  // Deseret capital letter h (U+10410)
-            case "𐐑": returnString += "𐐹"; break;  // Deseret capital letter pee (U+10411)
-            case "𐐒": returnString += "𐐺"; break;  // Deseret capital letter bee (U+10412)
-            case "𐐓": returnString += "𐐻"; break;  // Deseret capital letter tee (U+10413)
-            case "𐐔": returnString += "𐐼"; break;  // Deseret capital letter dee (U+10414)
-            case "𐐕": returnString += "𐐽"; break;  // Deseret capital letter chee (U+10415)
-            case "𐐖": returnString += "𐐾"; break;  // Deseret capital letter jee (U+10416)
-            case "𐐗": returnString += "𐐿"; break;  // Deseret capital letter kay (U+10417)
-            case "𐐘": returnString += "𐑀"; break;  // Deseret capital letter gay (U+10418)
-            case "𐐙": returnString += "𐑁"; break;  // Deseret capital letter ef (U+10419)
-            case "𐐚": returnString += "𐑂"; break;  // Deseret capital letter vee (U+1041a)
-            case "𐐛": returnString += "𐑃"; break;  // Deseret capital letter eth (U+1041b)
-            case "𐐜": returnString += "𐑄"; break;  // Deseret capital letter thee (U+1041c)
-            case "𐐝": returnString += "𐑅"; break;  // Deseret capital letter es (U+1041d)
-            case "𐐞": returnString += "𐑆"; break;  // Deseret capital letter zee (U+1041e)
-            case "𐐟": returnString += "𐑇"; break;  // Deseret capital letter esh (U+1041f)
-            case "𐐠": returnString += "𐑈"; break;  // Deseret capital letter zhee (U+10420)
-            case "𐐡": returnString += "𐑉"; break;  // Deseret capital letter er (U+10421)
-            case "𐐢": returnString += "𐑊"; break;  // Deseret capital letter el (U+10422)
-            case "𐐣": returnString += "𐑋"; break;  // Deseret capital letter em (U+10423)
-            case "𐐤": returnString += "𐑌"; break;  // Deseret capital letter en (U+10424)
-            case "𐐥": returnString += "𐑍"; break;  // Deseret capital letter eng (U+10425)
-            case "𐐦": returnString += "𐑎"; break;  // Deseret capital letter oi (U+10426)
-            case "𐐧": returnString += "𐑏"; break;  // Deseret capital letter ew (U+10427)
-            default:
-                returnString += x.toLocaleLowerCase();
-        }
-        i++;
-    }
-    while (i < this.length);
-    return returnString;
-};
-/********************************************************************************************
- * Function: Capitalizes only the first letter of a string.                                 *
- *                                                                                          *
- * Passed a string, returns it with the first letter capitalized.  Supports wide chars.     *
- ********************************************************************************************/
-function titleCaseString(inputstring) {
-    if (typeof(inputstring) == "undefined") {
-        return "";
-    }
-    var x = inputstring.slice(0,1);
-    if (x.charCodeAt(0) >= NON_BMP_CHAR_CODES.BOTTOM && x.charCodeAt(0) <= NON_BMP_CHAR_CODES.TOP) {  // Unicode hex scalar values for D800-DBFF, the Unicode surrogate code points.
-        if (inputstring.length > 2) {
-            inputstring = inputstring.slice(0, 2).toMusicBrainzUpperCase() + inputstring.slice(2).toMusicBrainzLowerCase();
-        } else {
-            inputstring = inputstring.toMusicBrainzUpperCase();
-        }
-    } else {
-        if (inputstring.length > 1) {
-            inputstring = x.toMusicBrainzUpperCase() + inputstring.slice(1).toMusicBrainzLowerCase();
-        } else {
-            inputstring = inputstring.toMusicBrainzUpperCase();
-        }
-    }
-    return inputstring;
-}
-/********************************************************************************************
- * Function: validateRoman                                                                  *
- *                                                                                          *
- * Passed a string, returns true if it is a legal Roman numeral.                            *
- ********************************************************************************************/
-function validateRoman(input) {
-    if (typeof(input) === "undefined" || input === "") {
-        return false;
-    } else {
-        var romanPattern = /^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/;
-        return romanPattern.test(input);
-    }
-}
-/********************************************************************************************
- * Function: convertRomanToArabic                                                           *
- *                                                                                          *
- * Passed a legal Roman numeral, returns the equivalent as int.                             *
- ********************************************************************************************/
-function convertRomanToArabic(input) {
-    if (typeof(input) === "undefined" || input === "") {
-        return 0;
-    } else {
-        var iterations = input.length,
-            stringPosition = 0,
-            arabicNumber = 0,
-            letters = [],
-            getValue = function(thisLetter, nextLetter) {
-                if (thisLetter === " ") {
-                    return 0;
-                }
-                switch (thisLetter+nextLetter) {
-                    case "IV":
-                        ++stringPosition;
-                        return 4;
-                    case "IX":
-                        ++stringPosition;
-                        return 9;
-                    case "XL":
-                        ++stringPosition;
-                        return 40;
-                    case "XC":
-                        ++stringPosition;
-                        return 90;
-                    case "CD":
-                        ++stringPosition;
-                        return 400;
-                    case "CM":
-                        ++stringPosition;
-                        return 900;
-                    default:
-                        return letters[thisLetter];
-                }
-            };
-            input = input+"   ";
-            letters.I = 1;
-            letters.V = 5;
-            letters.X = 10;
-            letters.L = 50;
-            letters.C = 100;
-            letters.D = 500;
-            letters.M = 1000;
-        do {
-            arabicNumber += getValue(input[stringPosition], input[++stringPosition]);
-        } while (--iterations);
-        return arabicNumber;
-    }
-}
-/*********************************************************************************************************
- * Useful references:                                                                                    *
- * Unicode Standard Annex #21: Case Mappings                                                             *
- * http://unicode.org/reports/tr21/tr21-5.html                                                           *
- *********************************************************************************************************
- * Function: loadRuleSet ( one of 6 GC groups: artist, title, label, duration, text, textartist )        *
- * Loads language-specific rules for the user's current GC mode setting.                                 *
- *                                                                                                       *
- * Add new language rulesets here.  Make sure to add them                                                *
- * both to the artist name and non-artist name switches.                                                 *
- *                                                                                                       *
- * Language Flags:   (All must be set for any language, even if unused!)                                 *
- *                                                                                                       *
- * ----------------------------------------------------------------------------------------------------- *
- * alwaysUppercasedWords.......Words that should always be all UPPERCASE  (examples: USA, DC, BBC)       *
- * ----------------------------------------------------------------------------------------------------- *
- * ambiguousUppercasedWords....Words that may sometimes be all UPPERCASE, but not 100% of the            *
- *                             time.  (examples: )  These will stay normal cased, but                    *
- *                             with heads-up warnings.                                                   *
- * ----------------------------------------------------------------------------------------------------- *
- * ambiguousLowercasedWords....Words that may sometimes be all lowercase, but not 100% of the            *
- *                             time.  (example: Presents)  These will stay normal cased, but             *
- *                             with heads-up warnings.                                                   *
- * ----------------------------------------------------------------------------------------------------- *
- * capitalizeFragments.........Capitalize first word inside parentheses and brackets.                    *
- * ----------------------------------------------------------------------------------------------------- *
- * capitalizeSentences.........Capitalize the first word of text, and each first word following          *
- *                             the end of a sentence.                                                    *
- * ----------------------------------------------------------------------------------------------------- *
- * changeCapitalization........Titlecase (English mode) if true, sentence mode if false.                 *
- * ----------------------------------------------------------------------------------------------------- *
- * commaUppercasedWords........Words that are 99.9% always all UPPERCASE if before and after             *
- *                             a comma.  (Allows better capitalization of ambiguous Uppercased           *
- *                             words.) (examples: ME, ON, OR).  These will always be be uppercased.      *
- *                             (Useful mainly for locations that should always be all UPPERCASE.)        *
- * ----------------------------------------------------------------------------------------------------- *
- * dashFigure..................The correct dash to be used within numbers (not numeric ranges), such     *
- *                             as phone numbers.                                                         *
- * ----------------------------------------------------------------------------------------------------- *
- * dashQuotation...............The correct dash to be used prior to a quotation. (example ― "Foo!")      *
- * ----------------------------------------------------------------------------------------------------- *
- * dashRange...................The correct dash to be used to indicate a numeric range, like 1 – 10.     *
- * ----------------------------------------------------------------------------------------------------- *
- * extraTitleInfoWords.........Language-specific ExtraTitleInformation words.  (ex: remix, vocal, clean) *
- *                             Do not use multi-word phrases - only single words here!                   *
- *                             This must have at least one value, please use "alternate)" to close out   *
- *                             this value.                                                               *
- * ----------------------------------------------------------------------------------------------------- *
- * fixApostropheWords..........Make the second letter character in O'Clock-style words capitalized.      *
- * ----------------------------------------------------------------------------------------------------- *
- * fragmentPunctuation.........Punctuation used to indicate the beginning of a parenthetical             *
- *                             or bracketed section of text.                                             *
- * ----------------------------------------------------------------------------------------------------- *
- * junkHyphens.................Hyphens and dashes which may or may not be used in the language, but will *
- *                             never be used correctly in Guess Case-processed text.                     *
- * ----------------------------------------------------------------------------------------------------- *
- * junkHyphensReplacement......The character to be used to replace all of the junkHyphens.               *
- * ----------------------------------------------------------------------------------------------------- *
- * junkTildes..................Tildes which may or may not be used in the language, but will never be    *
- *                             used correctly in Guess Case-processed text.                              *
- * ----------------------------------------------------------------------------------------------------- *
- * junkTildesReplacement.......The character to be used to replace all of the junkTildes.                *
- * ----------------------------------------------------------------------------------------------------- *
- * lowerCaseApostropheWords....True if words like 'round should stay as 'round.                          *
- * ----------------------------------------------------------------------------------------------------- *
- * lowerCaseWords..............Short words that should always be lowercased.                             *
- * ----------------------------------------------------------------------------------------------------- *
- * lowerCaseWordsEndWords......Short words from the above list which should be uppercased if at the      *
- *                             end of a sentence fragment, or before a period.  Examples: on, in:        *
- *                             'Come On (acoustic)' instead of 'Come on (acoustic)'                      *
- *                             'Jumpin' In' instead of 'Jumpin' in'                                      *
- * ----------------------------------------------------------------------------------------------------- *
- * mirroredGuillemets..........True if the language uses guillemets, and each « should have a matching   *
- *                             » (whichever direction they should be pointing on each side).  False if   *
- *                             the language does not use guillemets, or if it only uses two » or two «.  *
- * ----------------------------------------------------------------------------------------------------- *
- * numberAbbreviation..........What word is used to indicate Number?  ex: No.                            *
- * ----------------------------------------------------------------------------------------------------- *
- * numberWords.................Used as a last ditch effort to avoid false positives when differentiating *
- *                             between "Part" as a word, and "Part:" as in PartNumberStyle.  If          *
- *                             "Foo Bar, Part One" is a valid construction, with the number word right   *
- *                             after the wordForPart, then fill in this with the typed out names         *
- *                             for numbers in this language.  If there are variations possible, such as  *
- *                             "twenty one" and "twenty-one", please include both.  However, if this is  *
- *                             not a valid construction in this language, leave this as "".              *
- *                             IMPORTANT: Numbers must be in the array here in numerical order!          *
- * ----------------------------------------------------------------------------------------------------- *
- * punctuationCharacters.......Characters used as valid punctuation in the language.                     *
- * ----------------------------------------------------------------------------------------------------- *
- * roleWords...................Words like "conductor" which indicate a performance role, and should      *
- *                             always be lowercased, but only if they are both inside parenthesis and    *
- *                             followed by a colon.  example: (conductor: Foo Bar)                       *
- * ----------------------------------------------------------------------------------------------------- *
- * sentenceEndingPunctuation...Punctuation used to indicate the end of a sentence.                       *
- * ----------------------------------------------------------------------------------------------------- *
- * spaceAfterPunctuation.......A space should always appear after these punctuation marks.               *
- *                             Use "" if no space should appear after any punctuation marks.             *
- * ----------------------------------------------------------------------------------------------------- *
- * spaceBeforePunctuation......A space should always appear before these punctuation marks.              *
- *                             Use "" if no space should appear before any punctuation marks.            *
- * ----------------------------------------------------------------------------------------------------- *
- * spaceChar...................If spaces are required before certain punctuation (whichever of :;!?»«    *
- *                             are used in the language), what space character should be used?           *
- * ----------------------------------------------------------------------------------------------------- *
- * usesRomanNumerals...........Are Roman numerals legal to be used in this language?                     *
- * ----------------------------------------------------------------------------------------------------- *
- * For the following, use "" as the value if there is no applicable word in the language:                *
- * wordForBox..................What word might be used for box, as in box set, in this language?         *
- * wordForPt...................What word might be used for "Foo, Pt 1" in this language?                 *
- * wordForPart.................What word might be used for "Foo, Part 1" in this language?               *
- * wordForParts................What word might be used for "Foo, Parts 1-2" in this language?            *
- * wordForVolumeA..............What word might be used for "Foo, Volume 1" in this language?             *
- * wordForVolumeB..............What word might be used for "Foo, Vol. 1" in this language?               *
- * wordForDisc.................What word might be used for "Foo (disc 1)" in this language?              *
- * ----------------------------------------------------------------------------------------------------- *
- * romanWordsLower.............Words in this language which also happen to be Roman numerals.  Any words *
- *                             listed here will ignore Roman numeral rules and become lowercased.        *
- * ----------------------------------------------------------------------------------------------------- *
- * romanWordsNormal............Words in this language which also happen to be Roman numerals.  Any words *
- *                             listed here will ignore Roman numeral rules and become normal cased.      *
- *********************************************************************************************************/
-// All punctuation characters, use to create new modes
-var AllPunctuation = "-!\"#$%&'()\\*\\+,\\./\\․/‣:;<=;΄ʹ͵΅>?@[\\\\\\]^_`{|}‽⁋;΄΅·~⁊‧։֊…¤‐\\(@‒⳹⳺⳻⳼–¡¿—⁄、ʹ͵‥᛫〽𐤟〜 ‹›―჻‖˜◊∴→⇒" +
-                       "⊃⊢´⊨⁂☞∵§~_¦|¶º°%‰‱#⁘⁙⁚⁛⁜⁝⁞ ⸐⸑⸒⸓⸔⸖⸕^†״׃‡•\\*\\₡ƒ׀₤₧¥¢=゠⸗׳$£٭,₩₪»«仝ヽヾゝゞ〃〲〱〳〵〴〵「」『』〔〕{}" +
-                       "〈〉《》【】〖〗〘〙〚〛゛゜。、・ↀↁↂ¨©ª¬®±²³µ¶·¸¹ºʼˈ˘˙˚˛˜˝ˣ₰℈℔℞℟℣℥⏑⏒⏓⏔⸀⸌⸍⸜⸝" +
-                       "〆〜…‥•◦※*〽♪♫♬♩〒〶〠〄⁅⁆Ⓧ﷼Ⓨ㉿\\]",
-    AllCapsPositions = [], // Used to store the position of ALLCAPS words
-    allFoldableChars = "a-zA-Z" +              //  Latin: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-                       "\u00B5" +              //  Latin: µ
-                       "\u00C0-\u00D6" +       //  Latin: ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ
-                       "\u00D8-\u00DF" +
-                       "\u00E1-\u00F6" +
-                       "\u0100-\u013F" +
-                       "\u0140-\u017E" +
-                       "\u0180-\u024F" +       //  Latin: ƀƁƂƃƄƅƆƇƈƉƊƋƌƍƎƏƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿǀǁǂǃDŽDždžLJLj
-                                               //         ljNJNjnjǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘ
-                                               //         șȚțȜȝȞȟȠȡȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏ
-                       "\u0250-\u02AF" +       //  Latin IPA Extensions: ɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋ
-                                               //                        ʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯ
-                       "\u0300-\u036F" +       //  Greek combining characters
-                       "\u0370-\u0373" +       //  Greek: ͰͱͲͳ
-                       "\u0376-\u037D" +       //  Greek: Ͷͷͺͻͼͽ
-                       "\u0386-" +             //  Greek: Ά·ΈΉΊΌΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϏϐϑϒϓϔϕϖϗϘϙ
-                                               //         ϚϛϜϝϞϟϠϡ   (\u0386-\u03E1)
-                  //   "\u03E2-\u03EF" +       //  Coptic: ϢϣϤϥϦϧϨϩϪϫϬϭϮϯ
-                  //   "\u03F0-\u03FF" +       //  Greek: ϰϱϲϳϴϵ϶ϷϸϹϺϻϼϽϾϿ
-                  //   "\u0400-\u04FF" +       //  Cyrillic: ЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэ
-                  //  Commented out as it is   //            юяѐёђѓєѕіїјљњћќѝўџѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿҀҁ҂҃҄҅҆҇҈҉ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқ
-                  //  all one continuous       //            ҜҝҞҟҠҡҢңҤҥҦҧҨҩҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿӀӁӂӃӄӅӆӇӈӉӊӋӌӍӎӏӐӑӒӓӔӕӖӗӘәӚӛӜӝӞӟӠӡӢӣӤӥӦӧӨө
-                  //  range.                   //            ӪӫӬӭӮӯӰӱӲӳӴӵӶӷӸӹӺӻӼӽӾӿ
-                              "\u0523" +       //  Cyrillic: ԀԁԂԃԄԅԆԇԈԉԊԋԌԍԎԏԐԑԒԓԔԕԖԗԘԙԚԛԜԝԞԟԠԡԢԣ   (\u0500-\u0523)
-                       "\u0531-\u0587" +       //  Armenian: ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖՙ՚՛՜՝՞՟աբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆև
-                       "\u10A0-\u10FA\u10FC" + //  Georgian: ႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅაბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶჷჸჹჺჼ
-                       "\u1D00-\u1D7F" +       //  Latin: ᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᴬᴭᴮᴯᴰᴱᴲᴳᴴᴵᴶᴷᴸᴹᴺᴻᴼᴽᴾᴿᵀᵁᵂᵃᵄᵅᵆᵇᵈᵉᵊᵋᵌᵍᵎ
-                                               //         ᵏᵐᵑᵒᵓᵔᵕᵖᵗᵘᵙᵚᵛᵜᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵸᵹᵺᵻᵼᵽᵾᵿ
-                       "\u1D80-\u1DBF" +       //  Latin: ᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚᶛᶜᶝᶞᶟᶠᶡᶢᶣᶤᶥᶦᶧᶨᶩᶪᶫᶬᶭᶮᶯᶰᶱᶲᶳᶴᶵᶶᶷᶸᶹᶺᶻᶼᶽᶾᶿ
-                       "\u1E00-\u1EFF" +       //  Latin: ḀḁḂḃḄḅḆḇḈḉḊḋḌḍḎḏḐḑḒḓḔḕḖḗḘḙḚḛḜḝḞḟḠḡḢḣḤḥḦḧḨḩḪḫḬḭḮḯḰḱḲḳḴḵḶḷḸḹḺḻḼḽḾḿṀṁṂṃṄṅṆṇṈṉṊṋṌṍṎṏṐ
-                                               //         ṑṒṓṔṕṖṗṘṙṚṛṜṝṞṟṠṡṢṣṤṥṦṧṨṩṪṫṬṭṮṯṰṱṲṳṴṵṶṷṸṹṺṻṼṽṾṿẀẁẂẃẄẅẆẇẈẉẊẋẌẍẎẏẐẑẒẓẔẕẖẗẘẙẚẛẜẝẞẟẠạẢả
-                                               //         ẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳ
-                                               //         ỴỵỶỷỸỹỺỻỼỽỾỿ
-                       "\u1F00-\u1FFF" +       //  Greek: ἀἁἂἃἄἅἆἇἈἉἊἋἌἍἎἏἐἑἒἓἔἕἘἙἚἛἜἝἠἡἢἣἤἥἦἧἨἩἪἫἬἭἮἯἰἱἲἳἴἵἶἷἸἹἺἻἼἽἾἿὀὁὂὃὄὅὈὉὊὋὌὍὐὑὒὓὔὕὖὗ
-                                               //         ὙὛὝὟὠὡὢὣὤὥὦὧὨὩὪὫὬὭὮὯὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾈᾉᾊᾋᾌᾍᾎᾏᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾞᾟᾠᾡᾢᾣᾤᾥᾦᾧᾨᾩᾪᾫᾬᾭ
-                                               //         ᾮᾯᾰᾱᾲᾳᾴᾶᾷᾸᾹᾺΆᾼ᾽ι᾿῀῁ῂῃῄῆῇῈΈῊΉῌ῍῎῏ῐῑῒΐῖῗῘῙῚΊ῝῞῟ῠῡῢΰῤῥῦῧῨῩῪΎῬ῭΅`ῲῳῴῶῷῸΌῺΏῼ´῾
-                       "\u2132" +              //  Latin: Ⅎ
-                       "\u214E" +              //  Latin: ⅎ
-                       "\u2183-\u2184" +       //  Latin: Ↄↄ
-                       "\u2471-\u247D" +       //  Latin: ⱱⱲⱳⱴⱵⱶⱷⱸⱹⱺⱻⱼⱽ
-                       "\u2C00-\u2C5E" +       //  Glagolitic: ⰀⰁⰂⰃⰄⰅⰆⰇⰈⰉⰊⰋⰌⰍⰎⰏⰐⰑⰒⰓⰔⰕⰖⰗⰘⰙⰚⰛⰜⰝⰞⰟ
-                                               //              ⰠⰡⰢⰣⰤⰥⰦⰧⰨⰩⰪⰫⰬⰭⰮⰰⰱⰲⰳⰴⰵⰶⰷⰸⰹⰺⰻⰼⰽⰾⰿⱀ
-                                               //              ⱁⱂⱃⱄⱅⱆⱇⱈⱉⱊⱋⱌⱍⱎⱏⱐⱑⱒⱓⱔⱕⱖⱗⱘⱙⱚⱛⱜⱝⱞ
-                       "\u2C60-" +             //  Latin: ⱠⱡⱢⱣⱤⱥⱦⱧⱨⱩⱪⱫⱬⱭⱮⱯ  (\u2C60-\u2C6F)
-                   //  "\u2C70-\u2C7F" +       //  Latin: ⱰⱱⱲⱳⱴⱵⱶⱷⱸⱹⱺⱻⱼⱽⱾⱿ
-                   //  "\u2C80-\u2CFF" +       //  Coptic: ⲀⲁⲂⲃⲄⲅⲆⲇⲈⲉⲊⲋⲌⲍⲎⲏⲐⲑⲒⲓⲔⲕⲖⲗⲘⲙⲚⲛⲜⲝⲞⲟⲠⲡⲢⲣⲤⲥⲦⲧⲨⲩⲪⲫⲬⲭⲮⲯⲰⲱⲲⲳⲴⲵⲶⲷⲸⲹⲺⲻⲼⲽⲾⲿⳀⳁⳂⳃⳄⳅⳆⳇⳈⳉ
-                   // Another range...         //          ⳊⳋⳌⳍⳎⳏⳐⳑⳒⳓⳔⳕⳖⳗⳘⳙⳚⳛⳜⳝⳞⳟⳠⳡⳢⳣⳤ⳥⳦⳧⳨⳩⳪
-                   //  "\u2D00-\u2D2F" +       //  Georgian: ⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥ
-                              "\u2DFF" +       //  Cyrillic: ⷠⷡⷢⷣⷤⷥⷦⷧⷨⷩⷪⷫⷬⷭⷮⷯⷰⷱⷲⷳⷴⷵⷶⷷⷸⷹⷺⷻⷼⷽⷾⷿ  (\u2DE0-\u2DFF)
-                       "\uA640-\uA697" +       //  Cyrillic: ꙀꙁꙂꙃꙄꙅꙆꙇꙈꙉꙊꙋꙌꙍꙎꙏꙐꙑꙒꙓꙔꙕꙖꙗꙘꙙꙚꙛꙜꙝꙞꙟꙢꙣꙤꙥꙦꙧꙨꙩꙪꙫꙬꙭꙮ꙯꙰꙱꙲꙳꙼꙽꙾ꙿꚀꚁꚂꚃꚄꚅꚆꚇ
-                                               //         ꚈꚉꚊꚋꚌꚍꚎꚏꚐꚑꚒꚓꚔꚕꚖꚗ
-                       "\uA720-\uA78C" +       //  Latin: ꜠꜡ꜢꜣꜤꜥꜦꜧꜨꜩꜪꜫꜬꜭꜮꜯꜰꜱꜲꜳꜴꜵꜶꜷꜸꜹꜺꜻꜼꜽꜾꜿꝀꝁꝂꝃꝄꝅꝆꝇꝈꝉꝊꝋꝌꝍꝎꝏꝐꝑꝒꝓꝔꝕꝖꝗꝘꝙꝚꝛꝜꝝꝞꝟ
-                                               //         ꝠꝡꝢꝣꝤꝥꝦꝧꝨꝩꝪꝫꝬꝭꝮꝯꝰꝱꝲꝳꝴꝵꝶꝷꝸꝹꝺꝻꝼꝽꝾꝿꞀꞁꞂꞃꞄꞅꞆꞇꞈ꞉꞊Ꞌꞌ
-                       "\uA7FB-\uA7FF" +       //  Latin: ꟻꟼꟽꟾꟿ
-                       "\uF20E" +              //  Latin: 
-                       "\uFB00-\uFB06" +       //  Latin ligatures: fffiflffifflſt
-                       "\uFB13-\uFB17" +       //  Armenian ligatures: stﬓﬔﬕﬖﬗ
-                       "\uD801\uDC00-\uDC4F" + //  Deseret: 𐐀𐐁𐐂𐐃𐐄𐐅𐐆𐐇𐐈𐐉𐐊𐐋𐐌𐐍𐐎𐐏𐐐𐐑𐐒𐐓𐐔𐐕𐐖𐐗𐐘𐐙𐐚𐐛𐐜𐐝𐐞𐐟𐐠𐐡𐐢𐐣𐐤𐐥𐐦𐐧𐐨𐐩𐐪𐐫𐐬𐐭𐐮𐐯𐐰𐐱𐐲𐐳𐐴𐐵𐐶𐐷𐐸𐐹𐐺𐐻𐐼𐐽𐐾𐐿𐑀𐑁𐑂𐑃𐑄𐑅𐑆𐑇𐑈𐑉𐑊𐑋𐑌𐑍𐑎𐑏
-                       "C\u0308" +        //  Latin: N̈
-                       "n\u0308" +        //  Latin: n̈
-                       "H\u0331" +             //  Latin: H̱
-                       "P\u0303" +        //  Latin: P̃
-                       "S\u0329" +        //  Latin: S̩
-                       "T\u0308" +        //  Latin: T̈
-                       "W\u030A" +        //  Latin: W̊
-                       "p\u0303" +        //  Latin: p̃
-                       "s\u0329" +        //  Latin: s̩
-                       "\u0144\u030A" +        //  Latin: ń̊
-                       "\u030A\u030A" +        //  Latin: Y̊
-                       "У\u030A" +        //  Cyrillic: У̊
-                       "у\u030A" +        //  Cyrillic: у̊
-                       "\u0399\u0308\u0301" +  //  Greek: Ϊ́
-                       "\u03A5\u0308\u0301" +  //  Greek: Ϋ́
-                       "J\u030C" +        //  Latin: J̌
-                       "H\u0331" +             //  Latin: H̱
-                       "T\u0308" +        //  Latin: T̈
-                       "W\u030A" +        //  Latin: W̊
-                       "Y\u030A" +        //  Latin: Y̊
-                       "A\u02BE" +        //  Latin: Aʾ
-                       "\u03A5\u0313" +        //  Greek: Υ̓
-                       "\u03A5\u0313\u0300" +  //  Greek: Υ̓̀
-                       "\u03A5\u0313\u0301" +  //  Greek: Υ̓́
-                       "\u03A5\u0313\u0342" +  //  Greek: Υ̓͂
-                       "\u0391\u0342" +        //  Greek: Α͂
-                       "\u0397\u0342" +        //  Greek: Η͂
-                       "\u0399\u0308\u0300" +  //  Greek: Ϊ̀
-                       "\u0399\u0308\u0301" +  //  Greek: Ϊ́
-                       "\u0399\u0342" +        //  Greek: Ι͂
-                       "\u0399\u0308\u0342" +  //  Greek: Ϊ͂
-                       "\u03A5\u0308\u0300" +  //  Greek: Ϋ̀
-                       "\u03A5\u0308\u0301" +  //  Greek: Ϋ́
-                       "\u03A1\u0313" +        //  Greek: Ρ̓
-                       "\u03A5\u0342" +        //  Greek: Υ͂
-                       "\u03A5\u0308\u0342" +  //  Greek: Ϋ͂
-                       "\u03A9\u0342" +        //  Greek: Ω͂
-                       "\u1FBA\u0345" +        //  Greek:  Ὰͅ
-                       "\u0386\u0345" +        //  Greek:  Άͅ
-                       "\u1FCA\u0345" +        //  Greek:  Ὴͅ
-                       "\u0389\u0345" +        //  Greek:  Ήͅ
-                       "\u1FFA\u0345" +        //  Greek:  Ὼͅ
-                       "\u038F\u0345" +        //  Greek:  Ώͅ
-                       "\u0391\u0342\u0345" +  //  Greek:  ᾼ͂
-                       "\u0397\u0342\u0345" +  //  Greek:  ῌ͂
-                       "\u03A9\u0342\u0345" +   //  Greek:  ῼ͂
-                       "ʼNΪ́Ϋ́J̌H̱T̈W̊Y̊AΥ̓Υ̓̀Υ̓́Υ̓͂Α͂Η͂Ϊ̀Ϊ́Ι͂Ϋ̀Ϋ́Ρ̓Υ͂Ϋ͂Ω͂", // Latin composed characters which result from title case folding
-/* This next block is the same as the above, but with all lower-case letters removed. (The Unicode equivalent of A-Z.)  */
-    allUpperCaseChars = "[\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E" +
-                         "\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F" +
-                         "\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160" +
-                         "\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181" +
-                         "\u0182\u0184\u0186\u0187\u0189\u018A\u018B\u0193\u0194\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6" +
-                         "\u01A7\u01A9\u01AC\u01AE\u01AF\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3" +
-                         "\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6" +
-                         "\u01F7\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214" +
-                         "\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A" +
-                         "\u023B\u023D\u023E\u0241\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u0386\u038C\u038E\u038F\u03CF" +
-                         "\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA" +
-                         "\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E" +
-                         "\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6" +
-                         "\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5" +
-                         "\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6" +
-                         "\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506" +
-                         "\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u1E00\u1E02" +
-                         "\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22" +
-                         "\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42" +
-                         "\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62" +
-                         "\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82" +
-                         "\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA" +
-                         "\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA" +
-                         "\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA" +
-                         "\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F59\u1F5B\u1F5D\u1F5F\u2102\u2107" +
-                         "\u2115\u2119\u2124\u2126\u2128\u213E\u213F\u2145\u2183\u2C60\u2C67\u2C69\u2C6B\u2C72\u2C75\u2C80" +
-                         "\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0" +
-                         "\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0" +
-                         "\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0" +
-                         "\u2CE2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C" +
-                         "\uA65E\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690" +
-                         "\uA692\uA694\uA696\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C" +
-                         "\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C" +
-                         "\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784" +
-                         "\uA786\uA78BN\u0308H\u0331P\u0303S\u0329T\u0308W\u030A\u030A\u030A" +
-                         "У\u030A\u0399\u0308\u0301\u03A5\u0308\u0301J\u030CH\u0331T\u0308W\u030A" +
-                         "Y\u030AA\u02BE\u03A5\u0313\u03A5\u0313\u0300\u03A5\u0313\u0301\u03A5\u0313\u0342\u0391" +
-                         "\u0342\u0397\u0342\u0399\u0308\u0300\u0399\u0308\u0301\u0399\u0342\u0399\u0308\u0342\u03A5\u0308" +
-                         "\u0300\u03A5\u0308\u0301\u03A1\u0313\u03A5\u0342\u03A5\u0308\u0342\u03A9\u0342\u1FBA\u0345\u0386" +
-                         "\u0345\u1FCA\u0345\u0389\u0345\u1FFA\u0345\u038F\u0345\u0391\u0342\u0345\u0397\u0342\u0345\u03A9" +
-                         "ʼNΪ́Ϋ́J̌H̱T̈W̊Y̊AΥ̓Υ̓̀Υ̓́Υ̓͂Α͂Η͂Ϊ̀Ϊ́Ι͂Ϋ̀Ϋ́Ρ̓Υ͂Ϋ͂Ω͂" +
-                         "\u0342\u0345" +
-                         "\u00C0-\u00D6" +
-                         "\u00D8-\u00DE" +
-                         "\u018E-\u0191" +
-                         "\u0196-\u0198" +
-                         "\u01B1-\u01B3" +
-                         "\u0243-\u0246" +
-                         "\u0388-\u038A" +
-                         "\u0391-\u03A1" +
-                         "\u03A3-\u03AB" +
-                         "\u03D2-\u03D4" +
-                         "\u03FD-\u042F" +
-                         "\u0531-\u0556" +             // This really strange layout is required.
-                         "\u10A0-\u10C5" +             // If you merge all of these strings with
-                         "\u1F08-\u1F0F" +             // ranges back into a single string,
-                         "\u1F18-\u1F1D" +             // funky things happen in Firefox and other
-                         "\u1F28-\u1F2F" +             // browsers when you use this variable in a
-                         "\u1F38-\u1F3F" +             // regexp - it will insert spaces at random
-                         "\u1F48-\u1F4D" +             // into the ranges, breaking them.
-                         "\u1F68-\u1F6F" +
-                         "\u1FB8-\u1FBB" +
-                         "\u1FC8-\u1FCB" +
-                         "\u1FD8-\u1FDB" +
-                         "\u1FE8-\u1FEC" +
-                         "\u1FF8-\u1FFB" +
-                         "\u210B-\u210D" +
-                         "\u2110-\u2112" +
-                         "\u211A-\u211D" +
-                         "\u212A-\u212D" +
-                         "\u2130-\u2133" +
-                         "\u2C00-\u2C2E" +
-                         "\u2C62-\u2C64" +
-                         "\u2C6D-\u2C6F" +
-                         "\uD801\uDC00-\uDC27" +
-                         "A-Z]";
-/*********************************************************************************************************
-* Note: While not *every single* character in the above included ranges contains a letter which has     *
-*       a matching lower/upper cased pair (phonetic symbols, ligatures, etc), those characters must     *
-*       still be included.  If they are left out, any character following them will be treated as if    *
-*       it is the start of a new word, thus causing mid-word capitalization.                            *
-*                                                                                                       *
-* Excluded ranges with Latin letter-like characters:                                                    *
-* U+2100 - U+214F Symbols, not actual letters                                                           *
-* U+2460 - U+24FF Symbols, not actual letters (In the Unicode case-folding list, but any time anyone    *
-*                 might actually use it on MB, they likely want to keep the case.)                      *
-*                 Same for U+2126, U+212A - U+212B, U+2160 - U+216F.                                    *
-* U+FF21 - U+FF3A Fullwidth already pre-processed to halfwidth                                          *
-* U+FF41 - U+FF5A Fullwidth already pre-processed to halfwidth                                          *
-* U+1D400 - U+1D7FF Math symbols, not intended to be alphabetical                                       *
-*********************************************************************************************************/
-function loadRuleSet(type, mode) {
-    var commonRoleWords = "(accordion|acoustic\\sbass\\sguitar|acoustic\\sguitar|acoustic\\supright\\sbass|aeolian\\sharp|afuche|alphorn|" +
-                           "alto\\sclarinet|alto\\ssaxophone|alto\\sviolin|appalachian\\sdulcimer|bagpipe|balalaika|bandoneón|banghu|" +
-                           "banhu|banjo|bansuri|baritone\\shorn|baritone\\ssaxophone|bass|bass\\sclarinet|bass\\sguitar|bass\\strombone|" +
-                           "bassoon|bát|bells|berimbau|biwa|bongos|bouzouki|bowed\\spsaltery|bugle|bull-roarer|cabasa|calliope|carillon|" +
-                           "castanets|celesta|cello|chamberlin|chập\\schoa|chapman\\sstick|chiêng|cittern|cizhonghu|clarinet|" +
-                           "classical\\sguitar|claves|clavichord|clavinet|concertina|conch|conductor|congas|contrabass|contrabass\\sclarinet|" +
-                           "contrabassoon|cornet|cornett|cowbell|crotales|crwth|cymbals|cymbalum|đại\\scô|đàn\\sbầu|đàn\\snguyệt|đàn\\snhị|" +
-                           "đàn\\stam\\sthập\\slục|đàn\\stranh|đàn\\stứ\\sdây|đàn\\stỳ\\sbà|denis\\sd'or|didgeridoo|diyingehu|djembe|dobro|" +
-                           "double\\sbass|double\\sreed|doyra|drum\\smachine|drums|drumset|dubreq\\sstylophone|electric\\sbass\\sguitar|" +
-                           "electric\\scello|electric\\sguitar|electric\\spiano|electric\\ssitar|electric\\supright\\sbass|electric\\sviolin|" +
-                           "english\\shorn|èrhú|euphonium|fiddle|fipple\\sflutes|flugelhorn|flute|free\\sreed|french\\shorn|gadulka|gaohu|" +
-                           "gayageum|gehu|geomungo|glass\\sarmonica|glass\\sharmonica|glockenspiel|goblet\\sdrum|gong|gongs|grand\\spiano|" +
-                           "greek\\sbaglama|gudok|güiro|guitar|hammered\\sdulcimer|hammond\\sorgan|handbells|hardart|hardingfele|harmonica|" +
-                           "harmonium|harp|harpsichord|heckelphone|horn|huqin|hurdy\\sgurdy|jew's\\sharp|jing\\shú|k'long\\spút|kazoo|kemenche|" +
-                           "keyboard|khalam|kinnor|kithara|kokyu|komungo|kora|koto|langeleik|lasso\\sd'amore|lute|lyre|mandola|mandolin|" +
-                           "maracas|marimba|mbira|mellophone|mellotron|melodica|mendoza|mexican\\svihuela|minimoog|mõ|moog|moon\\slute|" +
-                           "morin\\skhuur|musical\\sbow|musical\\ssaw|narrator|nose\\sflute|nyckelharpa|oboe|ocarina|omnichord|ondes\\smartenot|" +
-                           "ophicleide|organ|other\\spercussion|oud|pan\\spipes|percussion\\sinstruments|piano|piccolo|pipe\\sorgan|psaltery|" +
-                           "ratchet|reader|rebab|rebec|recorder|reed\\sorgan|reeds|rhodes\\spiano|sackbut|sampler|sanh|sanshin|santur|sanxián|" +
-                           "sáo\\strúc|sarod|saxophone|serpent|shakuhachi|shamisen|sheng|sho|shofar|singing\\sbowl|singular\\sreed|sitar|" +
-                           "slide\\sguitar|slide\\swhistle|snare\\sdrum|song\\sloan|soprano\\ssaxophone|soprano\\sviolin|sousaphone|" +
-                           "spanish\\sacoustic\\sguitar|spanish\\svihuela|speaker|spoons|steel\\sguitar|steelpan|suikinkutsu|synclavier|" +
-                           "synthesizer|tambourine|teleharmonium|temple\\sblocks|tenor\\shorn|tenor\\ssaxophone|theremin|tibetan\\swater\\sdrum|" +
-                           "tiểu\\scô|timbales|timpani|tin\\swhistle|toy\\spiano|treble\\sviolin|tres|triangle|trombone|trumpet|tuba|" +
-                           "tubular\\sbells|turkish\\sbaglama|turntables|uilleann\\spipes|ukulele|upright\\spiano|valve\\strombone|" +
-                           "vertical\\sflute|vibraphone|vibraslap|vielle|viola|viola\\sd'amore|viola\\sda\\sgamba|viola\\sorganista|" +
-                           "violin|violotta|vocoder|wagner\\stuba|warr\\sguitar|washboard|washtub\\sbass|waterphone|whip|whistle|" +
-                           "willow\\sflute|wood\\sblock|woodwind|xalam|xylophone|yángqín|yehu|zhonghu|zhongruan|zither";
-    /* =====================================================================*/
-    /* Name dashes to avoid having to deal with unicode code point ids.     */
-    /* =====================================================================*/
-    var dash = [];
-    dash.Armenian_hyphen        = "\u058A"; // ֊
-    dash.em_dash                = "\u2014"; // —
-    dash.en_dash                = "\u2013"; // –
-    dash.figure_dash            = "\u2012"; // ‒
-    dash.Hebrew_maqaf           = "\u05BE"; // ־
-    dash.hyphen                 = "\u2010"; // ‐
-    dash.hyphen_bullet          = "\u2043"; // ⁃
-    dash.hyphen_minus           = "-";      // -
-    dash.macron                 = "\u00AF"; // ¯
-    dash.minus_sign             = "\u2212"; // −
-    dash.Mongolian_todo_hyphen  = "\u1806"; // ᠆
-    dash.quotation_dash         = "\u2015"; // ―
-    dash.soft_hyphen            = "\u00AD"; //
-    dash.swung_dash             = "\u2053"; // ⁓
-    dash.tilde                  = "~";      // ~
-    dash.tilde_operator         = "\u223C"; // ∼
-    dash.underscore             = "_";      // _
-    dash.wave_dash              = "\u301C"; // 〜
-    /* =====================================================================*/
-    /* Rules below are for artist name text.                                */
-    /* =====================================================================*/
-    if (type == "artist" || type == "textartist") {
-        var gcrules = {};
-        switch (mode) {
-        case "Czech":
-            gcrules = {
-                alwaysUppercasedWords: "",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: true,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.quotation_dash, dash.figure_dash, dash.en_dash, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["and","v","v.","vs","vs."],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒–…—―˜»«№◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: "",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~»]+)",
-                spaceBeforePunctuation: "([~‒–—―=˜/\\[(«])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "English":
-            gcrules = {
-                alwaysUppercasedWords: "(2XLC|AC|DC|DMX|GZA|ODB|RZA|KLF|DMC|XTC|PVD|ABBA|MC|DJ)",
-                ambiguousLowercasedWords: "(present|presents|presenting)",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: true,
-                commaUppercasedWords: "",
-                dashFigure: dash.figure_dash,
-                dashQuotation: dash.quotation_dash,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen,
-                junkTildes: [dash.tilde, dash.wave_dash, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["a","and","at","by","de","des","etc.","etc","of","or","the","to","v","v.","vs","vs."],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: false,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}‽·~@‒–…—―˜◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: "",
-                spaceAfterPunctuation: "([!$%&)+,./:;=>?\\\\\\]|}~]+)",
-                spaceBeforePunctuation: "([~‒–—―=˜#/$&\\[(])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "French":
-            /* murdos, dmppanda */
-            gcrules = {
-                alwaysUppercasedWords: "",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: true,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.wave_dash, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["à","de","des","du","et","l","la","le"],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "Nᵒ",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~№‒–…—―˜»«¢£€]+)",
-                roleWords: "",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~»]+)",
-                spaceBeforePunctuation: "([~‒–=—―;:!?˜/[(»«])",
-                spaceChar: "\u00A0",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "Latvian":
-            gcrules = {
-                alwaysUppercasedWords: "",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: true,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.quotation_dash, dash.figure_dash, dash.en_dash, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["and","v","v.","vs","vs."],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒…–—―˜»«№◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: "",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~»]+)",
-                spaceBeforePunctuation: "([~‒–—―=˜/\\[(«])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "Lithuanian":
-            gcrules = {
-                alwaysUppercasedWords: "",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: true,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.quotation_dash, dash.figure_dash, dash.en_dash, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["and","v","v.","vs","vs."],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒…–—―˜»«№◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: "",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~»]+)",
-                spaceBeforePunctuation: "([~‒–—―=˜/\\[(«])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "Norwegian":
-            /* mo */
-            gcrules = {
-                alwaysUppercasedWords: "",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: true,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.wave_dash, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["og"],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒–…—―˜¢£€]+)",
-                roleWords: "",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~]+)",
-                spaceBeforePunctuation: "([~‒–=—―˜/[(])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX","I","VI"]
-            };
-            break;
-        case "Polish":
-            gcrules = {
-                alwaysUppercasedWords: "",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: true,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.quotation_dash, dash.figure_dash, dash.en_dash, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["and","v","v.","vs","vs."],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒–—…―˜»«№◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: "",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~»]+)",
-                spaceBeforePunctuation: "([~‒–—―=˜/\\[(«])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "Russian":
-            /* pronik */
-            gcrules = {
-                alwaysUppercasedWords: "",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: true,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.wave_dash, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: "",
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "№.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒–…—―˜»«№]+)",
-                roleWords: "",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~»]+)",
-                spaceBeforePunctuation: "([~‒–=—―˜/[(«])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-                /* Uses Guillemots normally for quotation punctuation */
-            };
-            break;
-        case "Sentence":
-            gcrules = {
-                alwaysUppercasedWords: "(RCA)",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: true,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.quotation_dash, dash.figure_dash, dash.en_dash, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["and","at","by","de","des","etc.","etc","la","le","of","on","or","the","to","v","v.","vs","vs."],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒…–—¡¿―˜»«№◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: "",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~»]+)",
-                spaceBeforePunctuation: "([~‒–—―=˜/\\[(«])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: ["MIX","I","VI"],
-                romanWordsNormal: []
-            };
-            break;
-        case "Slovak":
-            gcrules = {
-                alwaysUppercasedWords: "",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: true,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.quotation_dash, dash.figure_dash, dash.en_dash, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["and","v","v.","vs","vs."],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒–…—―˜»«№◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: "",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~»]+)",
-                spaceBeforePunctuation: "([~‒–—―=˜/\\[(«])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "Vietnamese":
-            gcrules = {
-                alwaysUppercasedWords: "",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: true,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.wave_dash, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["à","de","des","du","et","l","la","le"],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "Nᵒ",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~№‒…–—―˜¢£€]+)",
-                roleWords: "",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~]+)",
-                spaceBeforePunctuation: "([~‒–=—―;:!?˜/[(])",
-                spaceChar: "\u202F",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        default:
-        }
-        /* =====================================================================*/
-        /* Rules below are for non-artist name text.                            */
-        /* =====================================================================*/
-    } else {
-        switch (mode) {
-        case "Czech":
-            gcrules = {
-                alwaysUppercasedWords: "(BWV|RV|HWV|KV)",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: false,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.quotation_dash, dash.figure_dash, dash.en_dash, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["and"],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: false,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒–…—―˜№◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱#^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: commonRoleWords + ")",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~]+)",
-                spaceBeforePunctuation: "([~‒–=—―˜/\\[(])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "English":
-            gcrules = {
-                alwaysUppercasedWords: "(AK|AZ|AR|CA|CT|DE|DC|FL|GA|GU|HI|ID|IA|KS|KY|LA|" +        /* US States and Provinces        */
-                                        "MH|MD|MI|MN|MS|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|PW|PR|" +     /* US States and Provinces        */
-                                        "RI|SC|SD|TN|TX|UT|VT|VI|WA|WV|WI|WY|" +                    /* US States and Provinces        */
-                                        "NYC|HMV|OSU|XMU|WFMU|WHFS|HFS|NYU|JHU|MIT|" +              /* Places                         */
-                                        "AB|BC|MB|NB|NL|NT|NS|NU|PE|QC|SK|YT|" +                    /* Canadian States and Provinces  */
-                                        "2XLC|AC|DC|DMX|GZA|ODB|RZA|KLF|DMC|XTC|PVD|ABBA|" +        /* Artists                        */
-                                        "BPM|DJ|EP|LP|MC|R&B|BWV|RV|HWV|KV|AC|LWV|TWV|WAB|" +       /* Music Terms                    */
-                                        "ZMV|AWV|BVN|DLR|FVB|FWV|GWV|KWV|LWV|MWV|RWV|TFV|" +        /* Music Terms                    */
-                                        "WKO|WWV|ZWV|NMA|SWV|RPM|BPM" +                             /* Music Terms                    */
-                                        "AT&T|BBC|MLB|MTV|NBA|NBC|NFL|NHL|YMCA|XFM|RCA|BMG|" +      /* Companies and Organizations    */
-                                        "NASA|AHL|AT&T|" +                                          /* Companies and Organizations    */
-                                        "MD|JD|MC|DJ|" +                                            /* Titles                         */
-                                        "FFI|FFII|FFIII|FFIV|FFV|FFVI|FFVII|FFVIII|FFIX|FFX|" +     /* Games frequently abbreviated   */
-                                        "FFXI|FFXII|FFXIII|" +                                      /* Games frequently abbreviated   */
-                                        "FM|TV|TM|VIP|CD|CPO|CEO|JFK|ESP|QED|BBQ|BGM|UFO|DNA|" +    /* Other Words                    */
-                                        "NRG|4WD|HIV|LSD|DVD|PSP|MPH|AEGIS|API|UNIX|" +             /* Other Words                    */
-                                        "DNA|AIDS|ANSI|ASCII)",                                     /* Other Words                    */
-                ambiguousLowercasedWords: "(presenting|presents|a\\.k\\.a\\.)",
-                ambiguousUppercasedWords: "(ad)",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: true,
-                commaUppercasedWords: "(al|co|il|in|ma|me|mo|oh|ok|on|or|pa|va)",
-                dashFigure: dash.figure_dash,
-                dashQuotation: dash.quotation_dash,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, 
-                              dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen,
-                junkTildes: [dash.tilde, dash.wave_dash, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: true,
-                lowerCaseWords: ["a","an","and","as","at","but","by","cum","de","des","etc.","etc","for","if","in","la","le","mid","nor","off","of",
-                                 "on","or","per","qua","re","so","the","to","up","via","v","v.","vs","vs.","yet","a.k.a."],
-                lowerCaseWordsEndWords: "(by|cum|in|off|on|so|up|yet|for|to)",
-                mirroredGuillemets: false,
-                numberAbbreviation: "No.",
-                numberWords: ["one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen", 
-                              "sixteen","seventeen","eighteen","nineteen","twenty","twenty-one","twenty-two","twenty-three","twenty-four","twenty-five",
-                              "twenty-six","twenty-seven","twenty-eight","twenty-nine","thirty","thirty-one","thirty-two","thirty-three","thirty-four",
-                              "thirty-five","thirty-six","thirty-seven","thirty-eight","thirty-nine","fourty","fourty-one","fourty-two","fourty-three",
-                              "fourty-four","fourty-five","fourty-six","fourty-seven","fourty-eight","fourty-nine","fifty","fifty-one","fifty-two",
-                              "fifty-three","fifty-four","fifty-five","fifty-six","fifty-seven","fifty-eight","fifty-nine","sixty","sixty-one",
-                              "sixty-two","sixty-three","sixty-four","sixty-five","sixty-six","sixty-seven","sixty-eight","sixty-nine","seventy",
-                              "seventy-one","seventy-two","seventy-three","seventy-four","seventy-five","seventy-six","seventy-seven","seventy-eight",
-                              "seventy-nine","eighty","eighty-one","eighty-two","eighty-three","eighty-four","eighty-five","eighty-six","eighty-seven",
-                              "eighty-eight","eighty-nine","ninety","ninety-one","ninety-two","ninety-three","ninety-four","ninety-five","ninety-six",
-                              "ninety-seven","ninety-eight","ninety-nine","one hundred"],
-                /* Do not include ' " or ‐ in the punctuation lists! … can be in the spaceBeforePunctuation list, but it must be \\s?…\\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]‽·^_`{|}~‒@–—…―˜◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱#^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: commonRoleWords + ")",
-                spaceAfterPunctuation: "([!$%&)+,./:;=>?\\\\\\]|}~]+)",
-                spaceBeforePunctuation: "([~‒–—―=˜#/$&\\[(])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":", ";"],
-                usesRomanNumerals: true,
-                wordForBox: "box",
-                wordForPt: "pt",
-                wordForPart: "part",
-                wordForParts: "parts",
-                wordForVolumeA: "volume",
-                wordForVolumeB: "vol",
-                wordForDisc: "disc",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "French":
-            gcrules = {
-                alwaysUppercasedWords: "(BWV|RV|HWV|KV)",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: false,
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                commaUppercasedWords: "",
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.wave_dash, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["à","de","des","du","et","l","la","le"],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "Nᵒ",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~№‒–…—―˜»«¢£€]+)",
-                roleWords: commonRoleWords + ")",
-                spaceAfterPunctuation: "([!#$%&)*+,./:«;=>?\\\\\\]|}~»]+)",
-                spaceBeforePunctuation: "([~‒–=—―;:!?˜/[(»«])",
-                spaceChar: "\u00A0",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "partie",
-                wordForParts: "parties",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "discque",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "Latvian":
-            gcrules = {
-                alwaysUppercasedWords: "(BWV|RV|HWV|KV)",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: false,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.quotation_dash, dash.figure_dash, dash.en_dash, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["and"],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: false,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒–—…―˜№◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱#^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: commonRoleWords + ")",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~]+)",
-                spaceBeforePunctuation: "([~‒–=—―˜/\\[(])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "Lithuanian":
-            gcrules = {
-                alwaysUppercasedWords: "(BWV|RV|HWV|KV)",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: false,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.quotation_dash, dash.figure_dash, dash.en_dash, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["and"],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: false,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒…–—―˜№◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱#^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: commonRoleWords + ")",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~]+)",
-                spaceBeforePunctuation: "([~‒–=—―˜/\\[(])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "Norwegian":
-            gcrules = {
-                alwaysUppercasedWords: "(BWV|RV|HWV|KV)",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: false,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.wave_dash, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["and","og"],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒…–—―˜¢£€]+)",
-                roleWords: commonRoleWords + ")",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~]+)",
-                spaceBeforePunctuation: "([~‒–—=―˜/[(])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "del",
-                wordForParts: "delene",
-                wordForVolumeA: "volum",
-                wordForVolumeB: "vol.",
-                wordForDisc: "disk",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX","I","VI"]
-            };
-            break;
-        case "Polish":
-            gcrules = {
-                alwaysUppercasedWords: "(BWV|RV|HWV|KV)",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: false,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.quotation_dash, dash.figure_dash, dash.en_dash, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["and"],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: false,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒…–—―˜№◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱#^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: commonRoleWords + ")",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~]+)",
-                spaceBeforePunctuation: "([~‒–=—―˜/\\[(])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "Russian":
-            gcrules = {
-                alwaysUppercasedWords: "(BWV|RV|HWV|KV)",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: false,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.wave_dash, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: "",
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "№",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒…–—―˜»«№]+)",
-                roleWords: commonRoleWords + ")",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~»]+)",
-                spaceBeforePunctuation: "([~‒–=—―˜/[(«])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "ч.",
-                wordForPart: "Часть",
-                wordForParts: "части",
-                wordForVolumeA: "Том",
-                wordForVolumeB: "",
-                wordForDisc: "диск",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-                /* Uses Guillemots normally for quotation punctuation */
-            };
-            break;
-        case "Sentence":
-            gcrules = {
-                alwaysUppercasedWords: "(AK|AZ|AR|CA|CT|DE|DC|FL|GA|GU|HI|ID|IA|KS|KY|LA|" +        /* US States and Provinces        */
-                                        "MH|MD|MI|MN|MS|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|PW|PR|" +     /* US States and Provinces        */
-                                        "RI|SC|SD|TN|TX|UT|VT|VI|WA|WV|WI|WY|" +                    /* US States and Provinces        */
-                                        "NYC|HMV|OSU|XMU|WFMU|WHFS|HFS|NYU|JHU|" +                  /* Places                         */
-                                        "AB|BC|MB|NB|NL|NT|NS|NU|PE|QC|SK|YT|" +                    /* Canadian States and Provinces  */
-                                        "2XLC|AC|DC|DMX|GZA|ODB|RZA|KLF|DMC|XTC|PVD|ABBA|" +        /* Artists                        */
-                                        "BPM|DJ|EP|LP|MC|R&B|BWV|RV|HWV|KV|AC|LWV|TWV|WAB|" +       /* Music Terms                    */
-                                        "ZMV|AWV|BVN|DLR|FVB|FWV|GWV|KWV|LWV|MWV|RWV|TFV|" +        /* Music Terms                    */
-                                        "WKO|WWV|ZWV|NMA|SWV|RPM|BPM" +                             /* Music Terms                    */
-                                        "AT&T|BBC|MLB|MTV|NBA|NBC|NFL|NHL|YMCA|XFM|RCA|BMG|" +      /* Companies and Organizations    */
-                                        "NASA|AHL|AT&T|" +                                          /* Companies and Organizations    */
-                                        "MD|JD|MC|DJ|" +                                            /* Titles                         */
-                                        "FFI|FFII|FFIII|FFIV|FFV|FFVI|FFVII|FFVIII|FFIX|FFX|" +     /* Games frequently abbreviated   */
-                                        "FFXI|FFXII|FFXIII|" +                                      /* Games frequently abbreviated   */
-                                        "FM|TV|TM|VIP|CD|CPO|CEO|JFK|ESP|QED|BBQ|BGM|UFO|DNA|" +    /* Other Words                    */
-                                        "NRG|4WD|HIV|LSD|DVD|PSP|MPH|AEGIS|API|UNIX|" +             /* Other Words                    */
-                                        "DNA|AIDS|ANSI|ASCII)",                                     /* Other Words                    */
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "(RCA)",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: false,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.quotation_dash, dash.figure_dash, dash.en_dash, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["and","de","des","et","la","le","the"],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: false,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~‒¡¿–—―…˜»«№◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱#^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: commonRoleWords + ")",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~»]+)",
-                spaceBeforePunctuation: "([~‒–=—―˜/\\[(«])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: ["MIX","I","VI"],
-                romanWordsNormal: []
-            };
-            break;
-        case "Slovak":
-            gcrules = {
-                alwaysUppercasedWords: "(BWV|RV|HWV|KV)",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: false,
-                commaUppercasedWords: "",
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron, dash.quotation_dash, dash.figure_dash, dash.en_dash, dash.em_dash],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: "",
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: false,
-                numberAbbreviation: "No.",
-                numberWords: [],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~…‒–—―˜№◊∴→⇒⊃⊢⊨⁂☞∵§~_¦|¶º°%‰‱#^†‡•\\*\\₡ƒ₤₧¥¢$£₩₪]+)",
-                roleWords: commonRoleWords + ")",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~]+)",
-                spaceBeforePunctuation: "([~‒–=—―˜/\\[(])",
-                spaceChar: "",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "",
-                wordForParts: "",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        case "Vietnamese":
-            gcrules = {
-                alwaysUppercasedWords: "(BWV|RV|HWV|KV)",
-                ambiguousLowercasedWords: "",
-                ambiguousUppercasedWords: "",
-                capitalizeFragments: true,
-                capitalizeSentences: true,
-                changeCapitalization: false,
-                dashFigure: dash.hyphen_minus,
-                dashQuotation: dash.hyphen_minus,
-                dashRange: dash.en_dash,
-                commaUppercasedWords: "",
-                extraTitleInfoWords: "alternate)",
-                fixApostropheWords: true,
-                fragmentPunctuation: "([[{(])",
-                junkHyphens: [dash.hyphen_minus, dash.hyphen, dash.Armenian_hyphen, dash.Hebrew_maqaf, dash.Mongolian_todo_hyphen, dash.soft_hyphen, dash.minus_sign, dash.hyphen_bullet, dash.macron],
-                junkHyphensReplacement: dash.hyphen_minus,
-                junkTildes: [dash.tilde, dash.wave_dash, dash.tilde_operator, dash.swung_dash],
-                junkTildesReplacement: dash.tilde,
-                lowerCaseApostropheWords: false,
-                lowerCaseWords: ["à","de","des","du","et","l","la","le"],
-                lowerCaseWordsEndWords: "",
-                mirroredGuillemets: true,
-                numberAbbreviation: "Nᵒ",
-                numberWords: ["một","hai","ba","bốn","năm","sáu","bảy","tám","chín","mười","mười một","mười hai","mười ba","mười bốn","mười lăm", 
-                              "mười sáu","mười bảy","mười tám","mười chín","hai mươi","hai mươi mốt","hai mươi hai","hai mươi ba","hai mươi bốn", 
-                              "hai mươi lăm","hai mươi sáu","hai mươi bảy","hai mươi tám","hai mươi chín","ba mươi","ba mươi mốt","ba mươi hai", 
-                              "ba mươi ba","ba mươi bốn","ba mươi năm","ba mươi sáu","ba mươi bảy","ba mươi tám","ba mươi chín","bốn mươi","bốn mươi mốt", 
-                              "bốn mươi hai","bốn mươi ba","bốn mươi bốn","bốn mươi lăm","bốn mươi sáu","bốn mươi bảy","bốn mươi tám","bốn mươi chín", 
-                              "năm mươi","năm mươi mốt","năm mươi hai","năm mươi ba","năm mươi bốn","năm mươi lăm","năm mươi sáu","năm mươi bảy", 
-                              "năm mươi tám","năm mươi chín","sáu mươi","sáu mươi mốt","sáu mươi hai","sáu mươi ba","sáu mươi bốn","sáu mươi lăm",
-                              "sáu mươi sáu","sáu mươi bảy","sáu mươi tám","sáu mươi chín","bảy mươi","bảy mươi mốt","bảy mươi hai","bảy mươi ba", 
-                              "bảy mươi bốn","bảy mươi lăm","bảy mươi sáu","bảy mươi bảy","bảy mươi tám","bảy mươi chín","tám mươi","tám mươi hai",
-                              "tám mươi hai","tám mươi ba","tám mươi bốn","tám mươi lăm","tám mươi sáu","tám mươi bảy","tám mươi tám","tám mươi chín", 
-                              "chín mươi","chín mươi hai","chín mươi hai","chín mươi ba","chín mươi bốn","chín mươi lăm","chín mươi sáu","chín mươi bảy", 
-                              "chín mươi tám","chín mươi chín"],
-                /* Do not include ' " or ‐ in the punctuation lists! (… can be in the spaceBeforePunctuation list, but it must be \s?…\s? to work right. */
-                punctuationCharacters: "([-!#$%&()*+,./:;<=>?@[\\\\\\]^_`{|}~№‒–…—―˜¢£€]+)",
-                roleWords: commonRoleWords + ")",
-                spaceAfterPunctuation: "([!#$%&)*+,./:;=>?\\\\\\]|}~]+)",
-                spaceBeforePunctuation: "([~‒–=—―;:!?˜/[(])",
-                spaceChar: "\u202F",
-                sentenceEndingPunctuation: [".", "!", "?", "\\s?…\\s?", "/", ":"],
-                usesRomanNumerals: true,
-                wordForBox: "",
-                wordForPt: "",
-                wordForPart: "partie",
-                wordForParts: "parties",
-                wordForVolumeA: "",
-                wordForVolumeB: "",
-                wordForDisc: "discque",
-                romanWordsLower: [],
-                romanWordsNormal: ["MIX"]
-            };
-            break;
-        default:
-        }
-    }
-    return gcrules;
-}
-/*************************************************************************************
- * Function: validateRuleSet ( language ruleset object )                             *
- *                                                                                   *
- * Make sure that the current mode is properly configured within Guess Case,         *
- * give the user enough info to file a decent bug ticket if not.                     *
- *************************************************************************************/
-function validateRuleSet(ruleSet, mode) {
-    function somethingWrong(whatIsWrong, mode) {
-        if (reportErrors === true) {
-            alertUser("error", text.GCProblem + mode + ", " + whatIsWrong);
-            return false;
-        }
-    }
-    switch ("undefined") {
-        case typeof(ruleSet.alwaysUppercasedWords):
-            somethingWrong("alwaysUppercasedWords");
-            break;
-        case typeof(ruleSet.ambiguousLowercasedWords):
-            somethingWrong("ambiguousLowercasedWords");
-            break;
-        case typeof(ruleSet.ambiguousUppercasedWords):
-            somethingWrong("ambiguousUppercasedWords");
-            break;
-        case typeof(ruleSet.capitalizeFragments):
-            somethingWrong("capitalizeFragments");
-            break;
-        case typeof(ruleSet.capitalizeSentences):
-            somethingWrong("capitalizeSentences");
-            break;
-        case typeof(ruleSet.changeCapitalization):
-            somethingWrong("changeCapitalization");
-            break;
-        case typeof(ruleSet.commaUppercasedWords):
-            somethingWrong("commaUppercasedWords");
-            break;
-        case typeof(ruleSet.dashFigure):
-            somethingWrong("dashFigure");
-            break;
-        case typeof(ruleSet.dashQuotation):
-            somethingWrong("dashQuotation");
-            break;
-        case typeof(ruleSet.dashRange):
-            somethingWrong("dashRange");
-            break;
-        case typeof(ruleSet.extraTitleInfoWords):
-            somethingWrong("extraTitleInfoWords");
-            break;
-        case typeof(ruleSet.fixApostropheWords):
-            somethingWrong("fixApostropheWords");
-            break;
-        case typeof(ruleSet.fragmentPunctuation):
-            somethingWrong("fragmentPunctuation");
-            break;
-        case typeof(ruleSet.junkHyphens):
-            somethingWrong("junkHyphens");
-            break;
-        case typeof(ruleSet.junkHyphensReplacement):
-            somethingWrong("junkHyphensReplacement");
-            break;
-        case typeof(ruleSet.junkTildes):
-            somethingWrong("junkTildes");
-            break;
-        case typeof(ruleSet.junkTildesReplacement):
-            somethingWrong("junkTildesReplacement");
-            break;
-        case typeof(ruleSet.lowerCaseApostropheWords):
-            somethingWrong("lowerCaseApostropheWords");
-            break;
-        case typeof(ruleSet.lowerCaseWords):
-            somethingWrong("lowerCaseWords");
-            break;
-        case typeof(ruleSet.lowerCaseWordsEndWords):
-            somethingWrong("lowerCaseWordsEndWords");
-            break;
-        case typeof(ruleSet.mirroredGuillemets):
-            somethingWrong("mirroredGuillemets");
-            break;
-        case typeof(ruleSet.numberAbbreviation):
-            somethingWrong("numberAbbreviation");
-            break;
-        case typeof(ruleSet.punctuationCharacters):
-            somethingWrong("punctuationCharacters");
-            break;
-        case typeof(ruleSet.roleWords):
-            somethingWrong("roleWords");
-            break;
-        case typeof(ruleSet.spaceAfterPunctuation):
-            somethingWrong("spaceAfterPunctuation");
-            break;
-        case typeof(ruleSet.spaceBeforePunctuation):
-            somethingWrong("spaceBeforePunctuation");
-            break;
-        case typeof(ruleSet.spaceChar):
-            somethingWrong("spaceChar");
-            break;
-        case typeof(ruleSet.sentenceEndingPunctuation):
-            somethingWrong("sentenceEndingPunctuation");
-            break;
-        case typeof(ruleSet.usesRomanNumerals):
-            somethingWrong("usesRomanNumerals");
-            break;
-        case typeof(ruleSet.wordForBox):
-            somethingWrong("wordForBox");
-            break;
-        case typeof(ruleSet.wordForDisc):
-            somethingWrong("wordForDisc");
-            break;
-        case typeof(ruleSet.wordForVolumeA):
-            somethingWrong("wordForVolumeA");
-            break;
-        case typeof(ruleSet.wordForVolumeB):
-            somethingWrong("wordForVolumeB");
-            break;
-        case typeof(ruleSet.wordForParts):
-            somethingWrong("wordForParts");
-            break;
-        case typeof(ruleSet.wordForPart):
-            somethingWrong("wordForPart");
-            break;
-        case typeof(ruleSet.wordForPt):
-            somethingWrong("wordForPt");
-            break;
-        case typeof(ruleSet.romanWordsLower):
-            somethingWrong("romanWordsLower");
-            break;
-        case typeof(ruleSet.romanWordsNormal):
-            somethingWrong("romanWordsNormal");
-            break;
-        default:
-            return true;
-    }
-}
-/*************************************************************************************
- * Function: findBasicErrors ( language ruleset object, GC group type,               *
- *                             track number / event number, string to be processed ) *
- *                                                                                   *
- * Stage 1 of Guess Case, checks for basic problems in the input text, fixes what it *
- * can, warns about what it can't.                                                   *
- *************************************************************************************/
-function findBasicErrors(ruleSet, type, number, stringBeingFixed, mode, keepUpperCased) {
-    /* ---------------------------------------------------------------------*/
-    /* Convert HTML entities into text.                                     */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = $(document.createElement("textarea")).html(stringBeingFixed.replace("<","&lt;")
-                                                                                  .replace(">","&gt;")
-                                                                                  .replace("&","&#38;"))
-                                                                                  .text()
-                                                                                  .replace("&lt;","<")
-                                                                                  .replace("&gt;",">")
-                                                                                  .replace("&#38;","&");
-    /* ---------------------------------------------------------------------*/
-    /* Replace "?" titles early.  (We change them later anyhow, but 
-    /* if we leave it til then, they'll bomb out some of the replacements
-    /* between here and there.
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/^\?+$/,"unknown");
-    /* ---------------------------------------------------------------------*/
-    /* Standardize some punctuation.                                        */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/([^\.])\.\.\s/g, "$1. ")  // doubled periods
-                                       .replace(/\s\.\.([^\.])/g, " .$1")  // doubled periods
-                                       .replace(/\.{4,}/g, "...")  // 4+ periods
-                                       .replace(/<</g, "«") // guilemets
-                                       .replace(/>>/g, "»") // guilemets
-                                       .replace(/\[\.\s?\]/g,"") // bracketed period
-                                       .replace(/\,{1,}/g,",") // Remove extra commas when more than one are adjacent to each other
-                                       .replace(/\-{1,}/g,"-") // Remove extra hyphens when more than one are adjacent to each other
-                                       .replace(/\s?[\+#\\\*]\*?$/,"") // Remove trailing *, **, \, +, and # (Normally used for bonus or other note info)
-                                       .replace(/\.\s?(aac|ape|fla|flac|mp3|ogg|shn|wav)$/,""); // Remove file types that might make it into the string
-    if (ruleSet.punctuationCharacters.match("…") !== "null") {  // Replace ... with elipses (if used by the language).
-        stringBeingFixed = stringBeingFixed.replace(/(\.){3}/g, "…");
-    }
-    for (var hyphenTypes in ruleSet.junkHyphens) {  // hyphens and dashes
-        if (ruleSet.junkHyphens.hasOwnProperty(hyphenTypes)) {
-            stringBeingFixed = stringBeingFixed.replace(new RegExp(ruleSet.junkHyphens[hyphenTypes], "g"),ruleSet.junkHyphensReplacement);
-        }
-    }
-    for (var tildaTypes in ruleSet.junkTildes) {  // tildes
-        if (ruleSet.junkTildes.hasOwnProperty(tildaTypes)) {
-            stringBeingFixed = stringBeingFixed.replace(new RegExp(ruleSet.junkTildes[tildaTypes], "g"),ruleSet.junkTildesReplacement);
-        }
-    }
-    var changePunctuation = function(p1) {
-        switch (p1) {
-            case "’":      // apostrophes and primes
-            case "ʼ":
-            case "ʻ":
-            case "ˮ":
-            case "՚":
-            case "′":
-            case "´":
-            case "‘":
-            case "’":
-            case "‛":
-            case "`":
-            case "″":
-            case "‴":
-            case "⁗":
-            case "ʹ":
-            case "ʺ":
-                return "'";
-            case "\u2329":  // See http://www.unicode.org/charts/PDF/U2300.pdf notes
-            case "\u27E8":
-                return "‹";
-            case "\u232A":  // See http://www.unicode.org/charts/PDF/U2300.pdf notes
-            case "\u27E9":
-                return "›";
-            case "\u02D0":
-            case "\u2236":
-            case "\uFF1A":
-            case "\u05C3":
-            case ":":
-                return ":";
-            case "․":
-                return ".";
-            case "⁄":
-                return "/";
-            case "\u01C3":  // exclaimation points
-            case "!":
-                return "!";
-            case "\uFF1F":  // question marks
-            case "\u2E2E":
-            case "?":
-                return "?";
-            case ";":      // Fullwidth semi-colon
-                return ";";
-            case "\u00B4":  // acute accent
-            case "\u2018":  // single quotation marks
-            case "\u2019":
-            case "\u201A":
-            case "\u201B":
-                return "'";
-            case "\u201C":  // double quotation marks
-            case "\u201D":
-            case "\u201E":
-            case "\u201F":
-                return '"';
-            case " ":       // Space (matched by \s)
-            case "_":       // Underscore
-            case "\u00A0":  // No-break space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u0009":  // Tab (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2000":  // En quad (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2001":  // Em quad (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2002":  // En space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2003":  // Em space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2004":  // Three-per-em space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2005":  // Four-per-em space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2006":  // Six-per-em space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2007":  // Figure space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2008":  // Punctuation space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2009":  // Thin space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u180E":  // Mongolian vowel separator (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u200A":  // Hair space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2028":  // Line separator (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2029":  // Paragraph separator (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u202F":  // Narrow no-break space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u205F":  // Medium mathematical space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u3000":  // Ideographic space (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u1680":  // Ogham space mark (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u2420":  // Symbol for space
-            case "\u303F":  // Ideographic Half-Full Space
-                return " ";
-            case "﴾":
-            case "(":      // Fullwidth (
-                return " (";
-            case "﴿":
-            case ")":      // Fullwidth )
-                return ")";
-            case "[":      // Fullwidth [
-                return " [";
-            case "]":      // Fullwidth ]
-                return "]";
-            case "[.]":   // Bracketed period
-            case "[ .]":
-            case "[. ]":
-            case "[ . ]":
-            case "\u000A":  // Line feed (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u000B":  // Vertical tab (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u000C":  // Form feed (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u000D":  // Carriage return (matched by \s except in IE7 and earlier, which failed to include this space in \s.)
-            case "\u200C": // Zero-width non-joiner
-            case "\u200D": // Zero-width joiner
-            case "\u2060": // Word joiner ("a zero width non-breaking space(only) intended for disambiguation of functions for byte order mark ")
-            case "\uFEFF": // Zero-width no-break space
-                return "";
-            case "Ⅰ"    : return "I";
-            case "Ⅱ"    : return "II";
-            case "Ⅲ"    : return "III";
-            case "Ⅳ"    : return "IV";
-            case "Ⅴ"    : return "V";
-            case "Ⅵ"    : return "VI";
-            case "Ⅶ"    : return "VII";
-            case "Ⅷ"    : return "VIII";
-            case "Ⅸ"    : return "IX";
-            case "Ⅹ"    : return "X";
-            case "Ⅺ"    : return "XI";
-            case "Ⅻ"    : return "XII";
-            case "Ⅼ"    : return "L";
-            case "Ⅽ"    : return "C";
-            case "Ⅾ"    : return "D";
-            case "Ⅿ"    : return "M";
-            case "ⅰ"    : return "i";
-            case "ⅱ"    : return "ii";
-            case "ⅲ"    : return "iii";
-            case "ⅳ"    : return "iv";
-            case "ⅴ"    : return "v";
-            case "ⅵ"    : return "vi";
-            case "ⅶ"    : return "vii";
-            case "ⅷ"    : return "viii";
-            case "ⅸ"    : return "ix";
-            case "ⅹ"    : return "x";
-            case "ⅺ"    : return "xi";
-            case "ⅻ"    : return "xii";
-            case "ⅼ"    : return "l";
-            case "ⅽ"    : return "c";
-            case "ⅾ"    : return "d";
-            case "ⅿ"    : return "m";
-            case "℉"    : return "°F";
-            case "℃"    : return "°C";
-            case "µ"    : return "μ";
-            default:
-                return p1;
-        }
-    },
-        strLen = stringBeingFixed.length,
-        newString = [];
-    do {  // While not punctuation, this also is used as a useful place to decompose certain presentational Unicode forms, such as precomposed Roman numerals.
-        newString.push(stringBeingFixed[strLen-1].replace(/[’ʼʻˮ՚′´﴾﴿‘’‛`″‴⁗ʹʺ℉µ℃ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅿⅾ\u003E\u00A0\u0009\u2000-\u2009\u180E\u200A\u2028\u2029\u202F\u205F\u3000\u1680\u000A-\u000D\u232A\u27E8\u003C․\u02D0\u2236\uFF1A\u05C3:\⁄\u01C3!\uFF1F\u2E2E?;\u00B4\u2018-\u201F\u200C\U200D\u2060\u303F\u005F\]\[\(\)\s\uFEFF\27E9\2329]/g, changePunctuation));
-    } while (--strLen);
-    stringBeingFixed = newString.reverse()
-                                .join("")
-                                .replace(/\-{1,}/g,"-") // Remove extra hyphens when more than one are adjacent to each other
-                                .replace(/\'{2,}/g,'"') // Swap doubled+ ' apostrophe for a single " apostrophe (509 in the English database!)
-                                .replace(/\s?[\+#\\\*]\*?$/,"") // Remove trailing *, **, \, +, and # (Normally used for bonus or other note info)
-                                .replace(/\.\s?(aac|ape|fla|flac|mp3|ogg|shn|wav)$/,"") // Remove file types that might make it into the string
-                                .replace(new RegExp("([" + allFoldableChars + "]\/|\/[" + allFoldableChars + "])", "g"),  // Protect non-separator /'s from our screwing up the spacing
-                                    function (str, p1) {
-                                        return p1.replace("/","\uDBC0\uDC01");  // U+100001 is guaranteed to never be a valid character in *anything*
-                                    }
-                                );
-    /* ---------------------------------------------------------------------*/
-    /* Standardize spellings of some words.                                 */
-    /* ---------------------------------------------------------------------*/
-    if (new RegExp("w\\/\\s|\\s\\/w").test(stringBeingFixed)) {
-        storeError(text.inclFeat, type, number);
-    }
-    stringBeingFixed = stringBeingFixed.replace(/(?:w\/\s|\s\/w)/gi, " feat. ") // Foo w/Tom Bar → Foo feat. Tom Bar
-                                       .replace(/(?:re?(?:\-|\‐)?mi?x)(e?(?:s|d))?/gi, " remix$1 ")
-                                       .replace(/(?:re-?make)(s)?/gi, " remake$1 ")
-                                       .replace(/(?:re[\‐\-]?edit)(s|ed)?/gi, " re-edit$1 ")
-                                       .replace(/\bext(en)?d?(et|ed)?\.?(?:\b|$)/gi, " extended ")
-                                       .replace(/(?:\b)trad\.?/gi, " traditional ")
-                                       .replace(/(\b|^|\()a\s?(?:\.?|\/)?(?:\\|\s)?\s?k\s?(?:\.?|\/)(?:\\|\s)?\s?a\s?(?:\.|\s|$)/gi, "$1a.k.a. ") // aka but not aka'aar
-                                       .replace(/(?:\s|^)ver\(?:?\.?(?:s)\)?\.?(?:\s|$)/gi, " versions ")
-                                       .replace(/(?:\b|^)ver\.?(?:\s|\)|$)/gi, " version ")
-                                       .replace(/(?:\b|^)f(?:ea|eat|t|\.)(?:uring)?[\:\.]?(?:\s|\))(?:\s?[\-\-])?/gi, " feat. ")
-                                       .replace(/(\s|^|\()(7|10|12)(?:\s?|\s\")\'\'/g,' $2" ') // 12'' and 12 " → 12"
-                                       .replace(/(\s|^|(\())(7|10|12)(\s|\-|\‐)?in(ch)?(\s|$)/gi,' $1$3" ') // 12in → 12"
-                                       .replace(/(?:\b|^)u\.?\s?s\.?\s?a\.?(?:\s|$)/gi," U.S.A. ")
-                                       .replace(/(?:\b|^)u\.?k\.?(?:\s|$)/gi," U.K. ")
-                                       .replace(/(?:\b|^)u\.?\s?s\.?\s?s\.?\s?r\.?(?:\s|$)/gi," U.S.S.R. ")
-                                       .replace(/(?:\b|^)p\.?\s?s\.?(?:\s|$)/gi," P.S. ")
-                                       .replace(/(?:\b|^)alt(?:ern)?[\.']?(?:\s|$)/gi," alternate ")
-                                       .replace(/(?:\b|^|\"|\()instr?\.?(?:\s|$|\)|\")/gi," instrumental ")
-                                       .replace(/(?:\b|^)ori?g\.?(inal)?(?:\s|$)/gi," original ")
-                                       .replace(/(?:\b|^)pres\.?(?:\s|$)/gi," presents ")
-                                       .replace(/(?:\b|^)v(?:ersu)?r?s\.?(?:\s|$)/gi," vs. ")
-                                       .replace(/(?:\b|^)\bentr[èée\s\'\-|\‐]{0,2}act[èée]?/gi,"Entr'acte") // Entr'acte
-                                       .replace(/\s(?:\‐|\-)\>\s/g," / ");  // Normally > and -> when surrounded by spaces indicates MultipleTracks.
-    /* ---------------------------------------------------------------------*/
-    /* Fix extraneous spaces before punctuation marks.                      */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(new RegExp('\\s' + ruleSet.punctuationCharacters, "g"),
-    function(str, p1) {
-        return jQuery.trim(p1);
-    });
-    /* ---------------------------------------------------------------------*/
-    /* Fix missing spaces before punctuation marks.                         */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/–(\d+)/g,"\uDBC0\uDCFD$1") // Preserve spacing around number ranges
-                                       .replace(/(\d+)–/g,"$1\uDBC0\uDCFD") // Preserve spacing around number ranges
-                                       .replace(/\-(\d+)/g,"\uDBC0\uDCFE$1") // Preserve spacing around number ranges
-                                       .replace(/(\d+)\-/g,"$1\uDBC0\uDCFE") // Preserve spacing around number ranges
-                                       .replace(/\s…/g,"\uDBC0\uDCFF…") // Preserve spacing around ellipses
-                                       .replace(/…\s/g,"…\uDBC0\uDCFF") // Preserve spacing around number ranges
-                                       .replace(new RegExp(ruleSet.spaceBeforePunctuation, "g"), " $1")
-                                       .replace(/\uDBC0\uDCFD/g,"–") // Preserve spacing around number ranges
-                                       .replace(/\uDBC0\uDCFE/g,"-") // Preserve spacing around number ranges
-                                       .replace(/\uDBC0\uDCFF/g," "); // Preserve spacing around elipses
-    /* ---------------------------------------------------------------------*/
-    /* Fix missing spaces after punctuation marks.                          */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(new RegExp(ruleSet.spaceAfterPunctuation + "([\\w\\.]+\\s)?", "g"),
-        function (str, p1, p2) {
-            if (typeof(p2) !== "undefined") {  // Don't add spaces in 'good' acronyms - they'd be fixed later on, but we'd have no way to catch "U.S.A. Y.M.C.A."
-                return p1 + p2;
-            } else {
-                return p1 + " ";
-            }
-        }
-    );
-    /* ---------------------------------------------------------------------*/
-    /* Remove redundant whitespace.                                         */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = jQuery.trim(stringBeingFixed.replace(/\s+/g, " "));
-    /* ---------------------------------------------------------------------*/
-    /* Find and store positions for any all CAPS words.                     */
-    /* This is not ruleset dependant, so it must break the separation       */
-    /* between stages 1 and 2.                                              */
-    /* ---------------------------------------------------------------------*/
-    if (keepUpperCased) {
-        AllCapsPositions = stringBeingFixed.split(" ");
-        for (var n in AllCapsPositions) {
-            if (AllCapsPositions[n].toMusicBrainzUpperCase() == AllCapsPositions[n]) {
-                AllCapsPositions[n] = true;
-            } else {
-                AllCapsPositions[n] = false;
-            }
-        }
-    }
-    /* ---------------------------------------------------------------------*/
-    /* Make the input string all lowercase.                                 */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.toMusicBrainzLowerCase();
-    /* ---------------------------------------------------------------------*/
-    /* Fix the spacing of number ranges.                                    */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/\b(\d+)[\-|\‐|\–]{1,3}(\d+)\b/g,"$1"+ruleSet.dashRange+"$2");
-    /* ---------------------------------------------------------------------*/
-    /* Fix the spacing and dash type of phone numbers.                      */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/(\(?)(\d{3})(\))?\s?(?:.\s)?(\d{3})(?:\s?.\s?)(\d{4})\b/g, // North American phone numbers
-        function(str,p1,p2,p3,p4,p5) {
-            return p1+p2+p3+" "+p4+ruleSet.dashFigure+p5;
-        }
-    );
-    /* ---------------------------------------------------------------------*/
-    /* Fix the spacing and dash type around quotation marks.                */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/([\-\‐\―])?(\s?\"\s?)/g,
-        function(str,p1,p2) {
-            if (null !== p1 && typeof(p1) !== "undefined" && p1 !== " " && p1 !== "") {
-                return " "+ruleSet.dashQuotation+' "';
-            } else {
-                return p2;
-            }
-        }
-    );
-    stringBeingFixed = stringBeingFixed.replace(/\s\s/g," ");
-    /* ---------------------------------------------------------------------*/
-    /* Fix the spacing and punctuation of times.                            */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/\s(\d{1,2})[:\.]\s(\d{1,2})\s?(a|p)\.?m\.?/gi,
-        function(str,p1,p2,p3) {
-            return " "+p1+":"+p2+" "+p3.toMusicBrainzLowerCase()+".m.";
-        }
-    );
-    /* ---------------------------------------------------------------------*/
-    /* Fix commonly misspelled words.                                       */
-    /* ---------------------------------------------------------------------*/
-    var misspelledWords = "(acaroling|absense|acapela|acapella|accapela|acapella|acappella|acappela|accappella|occapella|a\\scapella|" +
-                           "accoustic|accordian|adagioallegro|adago|adiago|agagio|adantino|afroamerican|agression|agressive|airbourne|" +
-                           "aligator|alladin|allergro|allgro|alegro|allogro|allego|allegetto|alegretto|aleegretto|allegreto|allamerican|" +
-                           "allien|allive|alnaafiysh|aminor|andate|adante|andate|andatne|annointed|artifical|asai|attaca|bachorchester|" +
-                           "ballbreaker|bangabang|bbbbaby|beautifull|beatiful|bebopalula|begining|belive|beleive|besame|browneyed|bflat|" +
-                           "bibbidibobbidiboo|bizzare|bouree|bourree|brazillian|brillant|buisness|burried|buhleaguer|bmv|bmw|bwm|wbv|bvw|" +
-                           "cafe|carnaval|carribean|chickaboom|chrismas|clavierubung|clavierübung|comming|concious|cont\\'d|concierto|" +
-                           "contabile|contabile|copywrite|crucifiction|cflat|csharp|desparate|\\'?divertimento\\'\\'?|eflat|eightyone|" +
-                           "eightytwo|eightythree|eightyfour|eightyfive|eightysix|eightyseven|eightyeight|eightynine|esharp|embracable|" +
-                           "enviromental|enlightment|espanolas|etoiles|etude|etudes|etudestableaux|étudestableaux|etudetableau|etudetableaux|" +
-                           "étudetableaux|everthing|exerpt|existance|facist|fantaisieimpromptu|fantasiestucke|fiftyfifty|fiftysecond|fiftyone|" +
-                           "fiftytwo|fiftythree|fiftyfour|fiftyfive|fiftysix|fiftyseven|fiftyeight|fiftynine|finacial|fmoll|fourty|fortyone|" +
-                           "fortytwo|fortythree|fortyfour|fortyfive|fortysix|fortyseven|fortyeight|fortynine|fourtyone|fourtytwo|fourtythree|" +
-                           "fourtyfour|fourtyfive|fourtysix|fourtyseven|fourtyeight|fourtynine|fflat|fictiondouble|francais|francaise|frandance|" +
-                           "fsharp|ganster|ghandi|graziozo|guiness|gymnopedie|gymnopedies|happend|happines|hvw|im|inbetween|independance|" +
-                           "independant|indestructable|instrmental|instumental|intrumental|intango|intencity|intermezo|juxtapozed|kinderscenen|" +
-                           "l\\'apresmidi|l\\'aprèsmidi|l\\'arlesienne|largetto|lefthanded|lovin|manysplendored|meastoso|maetoso|minuett|menuet|" +
-                           "minutetto|minuetto|mariage|marmelade|martininthefields|metamorphoses|miserables|mezzosoprano|missisippi|missle|movt|" +
-                           "mov|mvt|n\\'estce|ntrance|ninetyone|ninetytwo|ninetythree|ninetyfour|ninetyfive|ninetysix|ninetyseven|ninetyeight|" +
-                           "ninetynine|nothern|oppus|orchestrasymphony|orchetsra|orginal|outbloodyrageous|overturefantasy|perfomance|philarmonic|" +
-                           "pocco|pokemon|pollaca|polonaisefantaisie|prarie|pronounciation|qball|quassi|r\\'n\\'b|r\\'n\\'r|" +
-                           "radiosymphonieorchester|rambunkshush|rebopboombam|rednosed|rehersal|remeber|rememberance|rendezvu|rendevous|" +
-                           "resurection|ressurection|rimskykorsakov|rockafella|rondoburleske|roneau|satelite|saxaphone|schoneberg|selffulfilling|" +
-                           "seperate|seperation|sestenuto|seventyone|seventytwo|seventythree|seventyfour|seventyfive|seventysix|seventyseven|" +
-                           "seventyeight|seventynine|sherzo|sixtyone|sixtytwo|sixtythree|sixtyfour|sixtyfive|sixtysix|sixtyseven|sixtyeight|" +
-                           "sixtynine|soley|someting|somwhere|sonate|sould|strat|stratfordonguy|strenght|suprise|symphoy|tennesee|tennesse|" +
-                           "tenessee|theif|ther|thirtyone|thirtytwo|thirtythree|thirtyfour|thirtyfive|thirtysix|thirtyseven|thirtyeight|" +
-                           "thirtynine|throught|tiltawhirl|tocatta|tommorow|tommorrow|tounge|trampolene|trancendental|transcendance|tremelo|" +
-                           "turangalîlasymphonie|twelth|twentyone|twentytwo|twentythree|twentyfour|twentyfive|twentysix|twentyseven|twentyeight|" +
-                           "twentynine|unforgetable|unkown|vallecillogray|variatio|vengence|vicace|viscious|villian|voulezvous|welltempered|wholy|" +
-                           "withdrawl|wonderfull|wunderhornlieder|yerself|youself|zauberflote|p'yongyang|pyongyang)",
-        fixAndReportMisspelling = function(badWord, goodWord, goodSpelling) {
-            if (typeof(goodSpelling) === "undefined") {
-                goodSpelling = goodWord;
-            }
-        storeError(text.CommonlyMisspelled+" "+badWord+" → "+goodSpelling, type, number);
-        return goodWord;
-    };
-    stringBeingFixed = stringBeingFixed.replace(new RegExp("\\b" + misspelledWords + "\\b","gi"),
-        function (str, p1) {
-            switch (p1) {
-                /* Nothing here that needs to become 2+ words should - it will break "keep all caps" option.         */
-                /* Add them here without the space, we'll fix that after the keep all caps handled.  Putting it      */
-                /* here, though, the editor gets a heads up warning about the correction.                            */
-                case "acaroling"         : return fixAndReportMisspelling(p1,"a-caroling"); 
-                case "absense"           : return fixAndReportMisspelling(p1,"absence");           // 11
-                case "acapela"           :
-                case "acapella"          :                                                         // 19
-                case "accapela"          :
-                case "acapella"          :
-                case "acappella"         :
-                case "acappela"          :
-                case "accappella"        :
-                case "occapella"         :                                                         // 12
-                case "a capella"         : return fixAndReportMisspelling(p1,"acappella","a cappella");
-                case "accoustic"         : return fixAndReportMisspelling(p1,"acoustic");          // 18
-                case "accordian"         : return fixAndReportMisspelling(p1,"accordion");         // 28
-                case "adagioallegro"     : return fixAndReportMisspelling(p1,"adagioallegro","adagio allegro"); // 19
-                case "adago"             :                                                      
-                case "adiago"            :
-                case "agagio"            : return fixAndReportMisspelling(p1,"adagio");
-                case "adantino"          : return fixAndReportMisspelling(p1,"andantino");
-                case "afroamerican"      : return fixAndReportMisspelling(p1,"afro-american");     // 35
-                case "agression"         : return fixAndReportMisspelling(p1,"aggression");        // 21
-                case "agressive"         : return fixAndReportMisspelling(p1,"aggressive");        // 25
-                case "airbourne"         : return fixAndReportMisspelling(p1,"airborne");          // 16
-                case "aligator"          : return fixAndReportMisspelling(p1,"alligator");         // 35
-                case "alladin"           : return fixAndReportMisspelling(p1,"aladdin  ");         // 12
-                case "allergro"          :
-                case "allgro"            :
-                case "alegro"            :                                                         // 15
-                case "allogro"           :
-                case "allego"            : return fixAndReportMisspelling(p1,"allegro");           // 25
-                case "allegetto"         :
-                case "alegretto"         :                                                         // 11
-                case "aleegretto"        :
-                case "allegreto"         : return fixAndReportMisspelling(p1,"allegretto");        // 12
-                case "allamerican"       : return fixAndReportMisspelling(p1,"all-american");      // 23
-                case "allien"            : return fixAndReportMisspelling(p1,"alien");             // 30
-                case "allive"            : return fixAndReportMisspelling(p1,"alive");
-                case "alnaafiysh"        : return fixAndReportMisspelling(p1,"al-naafiysh");       // 24 (song title by Hashim)
-                case "aminor"            : return fixAndReportMisspelling(p1,"A-minor");           // 25
-                case "andate"            :
-                case "adante"            :                                                         // 48
-                case "andate"            :                                                         // 12
-                case "andatne"           : return fixAndReportMisspelling(p1,"andante");
-                case "annointed"         : return fixAndReportMisspelling(p1,"anointed");          // 11
-                case "artifical"         : return fixAndReportMisspelling(p1,"artificial");        // 20
-                case "asai"              : return fixAndReportMisspelling(p1,"assai");
-                case "attaca"            : return fixAndReportMisspelling(p1,"attacca");           // 15
-                case "bachorchester"     : return fixAndReportMisspelling(p1,"bach-orchester"); 
-                case "ballbreaker"       : return fixAndReportMisspelling(p1,"ball-breaker"); 
-                case "bangabang"         : return fixAndReportMisspelling(p1,"bang-a-bang"); 
-                case "bbbbaby"           : return fixAndReportMisspelling(p1,"b-b-b-baby"); 
-                case "beautifull"        :
-                case "beatiful"          : return fixAndReportMisspelling(p1,"beautiful");         // 12
-                case "bebopalula"        : return fixAndReportMisspelling(p1,"be-bop-a-lula"); 
-                case "begining"          : return fixAndReportMisspelling(p1,"beginning");         // 23
-                case "belive"            : 
-                case "beleive"           : return fixAndReportMisspelling(p1,"believe");           // 12
-                case "besame"            : return fixAndReportMisspelling(p1,"bésame");
-                case "browneyed"         : return fixAndReportMisspelling(p1,"brown-eyed");
-                case "bflat"             : return fixAndReportMisspelling(p1,"B-flat");            // 3699 in database!
-                case "bibbidibobbidiboo" : return fixAndReportMisspelling(p1,"bibbidi-bobbidi-boo"); 
-                case "bizzare"           : return fixAndReportMisspelling(p1,"bizarre");           // 30
-                case "bouree"            :                                                         // 74
-                case "bourree"           : return fixAndReportMisspelling(p1,"bourrée");           // 87
-                case "brazillian"        : return fixAndReportMisspelling(p1,"brazilian"); 
-                case "brillant"          : return fixAndReportMisspelling(p1,"brilliant");         // 11
-                case "buisness"          : return fixAndReportMisspelling(p1,"business");          // 11
-                case "burried"           : return fixAndReportMisspelling(p1,"buried");            // 12
-                case "buhleaguer"        : return fixAndReportMisspelling(p1,"bu$hleaguer"); 
-                case "bmv"               :
-                case "bmw"               :                                                         // Every instance in the db related to Bach, not the car.
-                case "bwm"               :
-                case "wbv"               :
-                case "bvw"               : return fixAndReportMisspelling(p1,"BWV");        
-                case "cafe"              : return fixAndReportMisspelling(p1,"café");
-                case "carnaval"          : return fixAndReportMisspelling(p1,"carnival");          // 328
-                case "carribean"         : return fixAndReportMisspelling(p1,"caribbean");         // 35
-                case "chickaboom"        : return fixAndReportMisspelling(p1,"chick-a-boom"); 
-                case "chrismas"          : return fixAndReportMisspelling(p1,"christmas");         // 40
-                case "clavierubung"      : 
-                case "clavierübung"      : return fixAndReportMisspelling(p1,"clavier-übung"); 
-                case "comming"           : return fixAndReportMisspelling(p1,"coming");            // 56
-                case "concious"          : return fixAndReportMisspelling(p1,"conscious");         // 20
-                case "cont'd"            : return fixAndReportMisspelling(p1,"continued");         // AbbreviationStyle, 49 in db
-                case "concierto"         : return fixAndReportMisspelling(p1,"concerto");          // 190 in db
-                case "contabile"         :
-                case "contabile"         : return fixAndReportMisspelling(p1,"cantabile");
-                case "copywrite"         : return fixAndReportMisspelling(p1,"copyright");         // 23
-                case "crucifiction"      : return fixAndReportMisspelling(p1,"crucifixion");       // 29
-                case "cflat"             : return fixAndReportMisspelling(p1,"C-flat");
-                case "csharp"            : return fixAndReportMisspelling(p1,"C-sharp");
-                case "desparate"         : return fixAndReportMisspelling(p1,"desperate");         // 14
-                case "'divertimento''"   :
-                case "'divertimento'"    : return fixAndReportMisspelling(p1,"divertimento");      // 11
-                case "eflat"             : return fixAndReportMisspelling(p1,"E-flat");            // 3943 in database!
-                case "eightyone"         : return fixAndReportMisspelling(p1,"eighty-one"); 
-                case "eightytwo"         : return fixAndReportMisspelling(p1,"eighty-two"); 
-                case "eightythree"       : return fixAndReportMisspelling(p1,"eighty-three"); 
-                case "eightyfour"        : return fixAndReportMisspelling(p1,"eighty-four"); 
-                case "eightyfive"        : return fixAndReportMisspelling(p1,"eighty-five"); 
-                case "eightysix"         : return fixAndReportMisspelling(p1,"eighty-six"); 
-                case "eightyseven"       : return fixAndReportMisspelling(p1,"eighty-seven"); 
-                case "eightyeight"       : return fixAndReportMisspelling(p1,"eighty-eight"); 
-                case "eightynine"        : return fixAndReportMisspelling(p1,"eighty-nine"); 
-                case "esharp"            : return fixAndReportMisspelling(p1,"E-sharp");
-                case "embracable"        : return fixAndReportMisspelling(p1,"embraceable"); 
-                case "enviromental"      : return fixAndReportMisspelling(p1,"environmental");     // 15
-                case "enlightment"       : return fixAndReportMisspelling(p1,"enlightenment"); 
-                case "espanolas"         : return fixAndReportMisspelling(p1,"españolas"); 
-                case "etoiles"           : return fixAndReportMisspelling(p1,"étoiles");
-                case "etude"             : return fixAndReportMisspelling(p1,"étude");             // 725 in database
-                case "etudes"            : return fixAndReportMisspelling(p1,"études");            // 293
-                case "etudestableaux"    : 
-                case "étudestableaux"    : return fixAndReportMisspelling(p1,"études-tableaux"); 
-                case "etudetableau"      : 
-                case "etudetableaux"     : 
-                case "étudetableaux"     : return fixAndReportMisspelling(p1,"étude-tableaux"); 
-                case "everthing"         : return fixAndReportMisspelling(p1,"everything");        // 38
-                case "exerpt"            : return fixAndReportMisspelling(p1,"excerpt");           // 20
-                case "existance"         : return fixAndReportMisspelling(p1,"existence");         // 19
-                case "facist"            : return fixAndReportMisspelling(p1,"fascist");           // 16
-                case "fantaisieimpromptu": return fixAndReportMisspelling(p1,"fantaisie-impromptu"); 
-                case "fantasiestucke"    : return fixAndReportMisspelling(p1,"fantasiestücke"); 
-                case "fiftyfifty"        : return fixAndReportMisspelling(p1,"fifty-fifty"); 
-                case "fiftysecond"       : return fixAndReportMisspelling(p1,"fifty-second"); 
-                case "fiftyone"          : return fixAndReportMisspelling(p1,"fifty-one"); 
-                case "fiftytwo"          : return fixAndReportMisspelling(p1,"fifty-two"); 
-                case "fiftythree"        : return fixAndReportMisspelling(p1,"fifty-three"); 
-                case "fiftyfour"         : return fixAndReportMisspelling(p1,"fifty-four"); 
-                case "fiftyfive"         : return fixAndReportMisspelling(p1,"fifty-five"); 
-                case "fiftysix"          : return fixAndReportMisspelling(p1,"fifty-six"); 
-                case "fiftyseven"        : return fixAndReportMisspelling(p1,"fifty-seven"); 
-                case "fiftyeight"        : return fixAndReportMisspelling(p1,"fifty-eight"); 
-                case "fiftynine"         : return fixAndReportMisspelling(p1,"fifty-nine"); 
-                case "finacial"          : return fixAndReportMisspelling(p1,"financial");         // 17
-                case "fmoll"             : return fixAndReportMisspelling(p1,"f-Moll");            // 16
-                case "fourty"            : return fixAndReportMisspelling(p1,"forty");             // 14
-                case "fortyone"          : return fixAndReportMisspelling(p1,"forty-one"); 
-                case "fortytwo"          : return fixAndReportMisspelling(p1,"forty-two"); 
-                case "fortythree"        : return fixAndReportMisspelling(p1,"forty-three"); 
-                case "fortyfour"         : return fixAndReportMisspelling(p1,"forty-four"); 
-                case "fortyfive"         : return fixAndReportMisspelling(p1,"forty-five"); 
-                case "fortysix"          : return fixAndReportMisspelling(p1,"forty-six"); 
-                case "fortyseven"        : return fixAndReportMisspelling(p1,"forty-seven"); 
-                case "fortyeight"        : return fixAndReportMisspelling(p1,"forty-eight"); 
-                case "fortynine"         : return fixAndReportMisspelling(p1,"forty-nine"); 
-                case "fourtyone"         : return fixAndReportMisspelling(p1,"forty-one"); 
-                case "fourtytwo"         : return fixAndReportMisspelling(p1,"forty-two"); 
-                case "fourtythree"       : return fixAndReportMisspelling(p1,"forty-three"); 
-                case "fourtyfour"        : return fixAndReportMisspelling(p1,"forty-four"); 
-                case "fourtyfive"        : return fixAndReportMisspelling(p1,"forty-five"); 
-                case "fourtysix"         : return fixAndReportMisspelling(p1,"forty-six"); 
-                case "fourtyseven"       : return fixAndReportMisspelling(p1,"forty-seven"); 
-                case "fourtyeight"       : return fixAndReportMisspelling(p1,"forty-eight"); 
-                case "fourtynine"        : return fixAndReportMisspelling(p1,"forty-nine"); 
-                case "fflat"             : return fixAndReportMisspelling(p1,"F-flat");
-                case "fictiondouble"     : return fixAndReportMisspelling(p1,"fictiondouble","fiction double");
-                case "francais"          : return fixAndReportMisspelling(p1,"français");
-                case "francaise"         : return fixAndReportMisspelling(p1,"française"); 
-                case "frandance"         : return fixAndReportMisspelling(p1,"fran-dance"); 
-                case "fsharp"            : return fixAndReportMisspelling(p1,"F-sharp");           // 627 in database
-                case "ganster"           : return fixAndReportMisspelling(p1,"gangster");          // 11
-                case "ghandi"            : return fixAndReportMisspelling(p1,"Gandhi");            // 17
-                case "graziozo"          : return fixAndReportMisspelling(p1,"grazioso");
-                case "guiness"           : return fixAndReportMisspelling(p1,"Guinness");          // 13
-                case "gymnopedie"        : return fixAndReportMisspelling(p1,"gymnopédie"); 
-                case "gymnopedies"       : return fixAndReportMisspelling(p1,"gymnopédies"); 
-                case "happend"           : return fixAndReportMisspelling(p1,"happened");          // 16
-                case "happines"          : return fixAndReportMisspelling(p1,"happiness");
-                case "hvw"               : return fixAndReportMisspelling(p1,"HWV");
-                case "im"                : return fixAndReportMisspelling(p1,"I'm");
-                case "inbetween"         : return fixAndReportMisspelling(p1,"inbetween","in between"); // 136
-                case "independance"      : return fixAndReportMisspelling(p1,"independence");      // 37
-                case "independant"       : return fixAndReportMisspelling(p1,"independent");       // 16
-                case "indestructable"    : return fixAndReportMisspelling(p1,"indestructible"); 
-                case "instrmental"       : 
-                case "instumental"       : 
-                case "intrumental"       : return fixAndReportMisspelling(p1,"instrumental");      // 38
-                case "intango"           : return fixAndReportMisspelling(p1,"in-tango"); 
-                case "intencity"         : return fixAndReportMisspelling(p1,"intensity"); 
-                case "intermezo"         : return fixAndReportMisspelling(p1,"intermezzo"); 
-                case "juxtapozed"        : return fixAndReportMisspelling(p1,"juxtaposed"); 
-                case "kinderscenen"      : return fixAndReportMisspelling(p1,"kinderszenen"); 
-                case "l'apresmidi"       : 
-                case "l'aprèsmidi"       : return fixAndReportMisspelling(p1,"l'après-midi"); 
-                case "l'arlesienne"      : return fixAndReportMisspelling(p1,"l'arlésienne"); 
-                case "largetto"          : return fixAndReportMisspelling(p1,"larghetto");
-                case "lefthanded"        : return fixAndReportMisspelling(p1,"left-handed"); 
-                case "lovin"             : return fixAndReportMisspelling(p1,"lovin'");            // 322
-                case "manysplendored"    : return fixAndReportMisspelling(p1,"many-splendored"); 
-                case "meastoso"          :
-                case "maetoso"           : return fixAndReportMisspelling(p1,"maestoso");
-                case "minuett"           :                                                         // 11
-                case "menuet"            : return fixAndReportMisspelling(p1,"minuet");
-                case "minutetto"         :                                                         // 14
-                case "minuetto"          : return fixAndReportMisspelling(p1,"menuetto");
-                case "mariage"           : return fixAndReportMisspelling(p1,"marriage");          // 25
-                case "marmelade"         : return fixAndReportMisspelling(p1,"marmalade");         // 29
-                case "martininthefields" : return fixAndReportMisspelling(p1,"Martin-in-the-Fields'"); // 39
-                case "metamorphoses"     : return fixAndReportMisspelling(p1,"métamorphoses"); 
-                case "miserables"        : return fixAndReportMisspelling(p1,"misérables"); 
-                case "mezzosoprano"      : return fixAndReportMisspelling(p1,"mezzo-soprano'");
-                case "missisippi"        : return fixAndReportMisspelling(p1,"Mississippi");       // 11
-                case "missle"            : return fixAndReportMisspelling(p1,"missile");           // 14
-                case "movt"              :                                                         // 25
-                case "mov"               :
-                case "mvt"               : return fixAndReportMisspelling(p1,"movement");
-                case "n'estce"           : return fixAndReportMisspelling(p1,"n'est ce"); 
-                case "ntrance"           : return fixAndReportMisspelling(p1,"n-trance"); 
-                case "ninetyone"         : return fixAndReportMisspelling(p1,"ninety-one"); 
-                case "ninetytwo"         : return fixAndReportMisspelling(p1,"ninety-two"); 
-                case "ninetythree"       : return fixAndReportMisspelling(p1,"ninety-three"); 
-                case "ninetyfour"        : return fixAndReportMisspelling(p1,"ninety-four"); 
-                case "ninetyfive"        : return fixAndReportMisspelling(p1,"ninety-five"); 
-                case "ninetysix"         : return fixAndReportMisspelling(p1,"ninety-six"); 
-                case "ninetyseven"       : return fixAndReportMisspelling(p1,"ninety-seven"); 
-                case "ninetyeight"       : return fixAndReportMisspelling(p1,"ninety-eight"); 
-                case "ninetynine"        : return fixAndReportMisspelling(p1,"ninety-nine"); 
-                case "nothern"           : return fixAndReportMisspelling(p1,"northern");          // 18
-                case "oppus"             : return fixAndReportMisspelling(p1,"opus");
-                case "orchestrasymphony" : return fixAndReportMisspelling(p1,"symphonyorchestra"); // 12
-                case "orchetsra"         : return fixAndReportMisspelling(p1,"orchestra");
-                case "orginal"           : return fixAndReportMisspelling(p1,"original");          // 71
-                case "outbloodyrageous"  : return fixAndReportMisspelling(p1,"out-bloody-rageous"); 
-                case "overturefantasy"   : return fixAndReportMisspelling(p1,"overturefantasy"); 
-                case "perfomance"        : return fixAndReportMisspelling(p1,"performance");
-                case "philarmonic"       : return fixAndReportMisspelling(p1,"philharmonic");
-                case "pocco"             : return fixAndReportMisspelling(p1,"poco");
-                case "pokemon"           : return fixAndReportMisspelling(p1,"pokémon");           // 27
-                case "pollaca"           : return fixAndReportMisspelling(p1,"polacca");
-                case "polonaisefantaisie": return fixAndReportMisspelling(p1,"polonaise-fantaisie"); 
-                case "prarie"            : return fixAndReportMisspelling(p1,"prairie");           // 25
-                case "pronounciation"    : return fixAndReportMisspelling(p1,"pronunciation");     // 15
-                case "pyongyang"         :
-                case "p'yongyang"        : return fixAndReportMisspelling(p1,"p'yŏngyang"); 
-                case "qball"             : return fixAndReportMisspelling(p1,"q-ball"); 
-                case "quassi"            : return fixAndReportMisspelling(p1,"quasi");
-                case "r'n'b"             : return fixAndReportMisspelling(p1,"R&B");
-                case "r'n'r"             : return fixAndReportMisspelling(p1,"Rock 'n' Roll"); 
-                case "radiosymphonieorchester": return fixAndReportMisspelling(p1,"radio-symphonie-orchester"); 
-                case "rambunkshush"      : return fixAndReportMisspelling(p1,"ram-bunk-shush");
-                case "rebopboombam"      : return fixAndReportMisspelling(p1,"re-bop-boom-bam"); 
-                case "rednosed"          : return fixAndReportMisspelling(p1,"red-nosed");         // Rudolf is in the top 20 mis-spelled English release words, with 376 in the db
-                case "rehersal"          : return fixAndReportMisspelling(p1,"rehearsal");         // 32
-                case "remeber"           : return fixAndReportMisspelling(p1,"remember");          // 29
-                case "rememberance"      : return fixAndReportMisspelling(p1,"remembrance");       // 49
-                case "rendezvu"          : return fixAndReportMisspelling(p1,"rendez-vu"); 
-                case "rendevous"         : return fixAndReportMisspelling(p1,"rendezvous");        // 24
-                case "resurection"       : 
-                case "ressurection"      : return fixAndReportMisspelling(p1,"resurrection");      // 38
-                case "rimskykorsakov"    : return fixAndReportMisspelling(p1,"rimsky-korsakov"); 
-                case "rockafella"        : return fixAndReportMisspelling(p1,"rockafeller"); 
-                case "rondoburleske"     : return fixAndReportMisspelling(p1,"rondo-burleske"); 
-                case "roneau"            : return fixAndReportMisspelling(p1,"rondeau");
-                case "satelite"          : return fixAndReportMisspelling(p1,"satellite");         // 28
-                case "saxaphone"         : return fixAndReportMisspelling(p1,"saxophone");         // 15
-                case "schoneberg"        : return fixAndReportMisspelling(p1,"schöneberg"); 
-                case "selffulfilling"    : return fixAndReportMisspelling(p1,"self-fulfilling"); 
-                case "seperate"          : return fixAndReportMisspelling(p1,"separate");          // 18
-                case "seperation"        : return fixAndReportMisspelling(p1,"separation");        // 53
-                case "sestenuto"         : return fixAndReportMisspelling(p1,"sostenuto");
-                case "seventyone"        : return fixAndReportMisspelling(p1,"seventy-one"); 
-                case "seventytwo"        : return fixAndReportMisspelling(p1,"seventy-two"); 
-                case "seventythree"      : return fixAndReportMisspelling(p1,"seventy-three"); 
-                case "seventyfour"       : return fixAndReportMisspelling(p1,"seventy-four"); 
-                case "seventyfive"       : return fixAndReportMisspelling(p1,"seventy-five"); 
-                case "seventysix"        : return fixAndReportMisspelling(p1,"seventy-six"); 
-                case "seventyseven"      : return fixAndReportMisspelling(p1,"seventy-seven"); 
-                case "seventyeight"      : return fixAndReportMisspelling(p1,"seventy-eight"); 
-                case "seventynine"       : return fixAndReportMisspelling(p1,"seventy-nine"); 
-                case "sherzo"            : return fixAndReportMisspelling(p1,"scherzo");
-                case "sixtyone"          : return fixAndReportMisspelling(p1,"sixty-one"); 
-                case "sixtytwo"          : return fixAndReportMisspelling(p1,"sixty-two"); 
-                case "sixtythree"        : return fixAndReportMisspelling(p1,"sixty-three"); 
-                case "sixtyfour"         : return fixAndReportMisspelling(p1,"sixty-four"); 
-                case "sixtyfive"         : return fixAndReportMisspelling(p1,"sixty-five"); 
-                case "sixtysix"          : return fixAndReportMisspelling(p1,"sixty-six"); 
-                case "sixtyseven"        : return fixAndReportMisspelling(p1,"sixty-seven"); 
-                case "sixtyeight"        : return fixAndReportMisspelling(p1,"sixty-eight"); 
-                case "sixtynine"         : return fixAndReportMisspelling(p1,"sixty-nine"); 
-                case "soley"             : return fixAndReportMisspelling(p1,"solely");            // 40
-                case "someting"          : return fixAndReportMisspelling(p1,"something"); 
-                case "somwhere"          : return fixAndReportMisspelling(p1,"somewhere");         // 11
-                case "sonate"            : return fixAndReportMisspelling(p1,"sonata");            // 555 in the database
-                case "sould"             : return fixAndReportMisspelling(p1,"should");            // 20
-                case "strat"             : return fixAndReportMisspelling(p1,"start");             // 15
-                case "stratfordonguy"    : return fixAndReportMisspelling(p1,"stratford-on-guy"); 
-                case "strenght"          : return fixAndReportMisspelling(p1,"strength");          // 18
-                case "suprise"           : return fixAndReportMisspelling(p1,"surprise");          // 36
-                case "symphoy"           : return fixAndReportMisspelling(p1,"symphony");
-                case "tennesee"          : 
-                case "tennesse"          : 
-                case "tenessee"          : return fixAndReportMisspelling(p1,"Tennessee");         // 18
-                case "theif"             : return fixAndReportMisspelling(p1,"thief");             // 14
-                case "ther"              : return fixAndReportMisspelling(p1,"there");             // 14
-                case "thirtyone"         : return fixAndReportMisspelling(p1,"thirty-one"); 
-                case "thirtytwo"         : return fixAndReportMisspelling(p1,"thirty-two"); 
-                case "thirtythree"       : return fixAndReportMisspelling(p1,"thirty-three"); 
-                case "thirtyfour"        : return fixAndReportMisspelling(p1,"thirty-four"); 
-                case "thirtyfive"        : return fixAndReportMisspelling(p1,"thirty-five"); 
-                case "thirtysix"         : return fixAndReportMisspelling(p1,"thirty-six"); 
-                case "thirtyseven"       : return fixAndReportMisspelling(p1,"thirty-seven"); 
-                case "thirtyeight"       : return fixAndReportMisspelling(p1,"thirty-eight"); 
-                case "thirtynine"        : return fixAndReportMisspelling(p1,"thirty-nine"); 
-                case "throught"          : return fixAndReportMisspelling(p1,"through");           // 31
-                case "tiltawhirl"        : return fixAndReportMisspelling(p1,"tilt-a-whirl"); 
-                case "tocatta"           : return fixAndReportMisspelling(p1,"toccata");
-                case "tommorow"          :
-                case "tommorrow"         : return fixAndReportMisspelling(p1,"tomorrow");          // 38
-                case "tounge"            : return fixAndReportMisspelling(p1,"tongue");            // 28
-                case "trampolene"        : return fixAndReportMisspelling(p1,"trampoline");        // 11
-                case "trancendental"     : return fixAndReportMisspelling(p1,"transcendental");    // 13
-                case "transcendance"     : return fixAndReportMisspelling(p1,"transcendence");     // 13
-                case "tremelo"           : return fixAndReportMisspelling(p1,"tremolo");           // 27
-                case "turangalîlasymphonie": return fixAndReportMisspelling(p1,"turangalîla-symphonie"); 
-                case "twelth"            : return fixAndReportMisspelling(p1,"twelfth");           // 14
-                case "twentyone"         : return fixAndReportMisspelling(p1,"twenty-one"); 
-                case "twentytwo"         : return fixAndReportMisspelling(p1,"twenty-two"); 
-                case "twentythree"       : return fixAndReportMisspelling(p1,"twenty-three"); 
-                case "twentyfour"        : return fixAndReportMisspelling(p1,"twenty-four"); 
-                case "twentyfive"        : return fixAndReportMisspelling(p1,"twenty-five"); 
-                case "twentysix"         : return fixAndReportMisspelling(p1,"twenty-six"); 
-                case "twentyseven"       : return fixAndReportMisspelling(p1,"twenty-seven"); 
-                case "twentyeight"       : return fixAndReportMisspelling(p1,"twenty-eight"); 
-                case "twentynine"        : return fixAndReportMisspelling(p1,"twenty-nine"); 
-                case "unforgetable"      : return fixAndReportMisspelling(p1,"unforgettable");     // 13
-                case "unkown"            : return fixAndReportMisspelling(p1,"unknown");           // 16
-                case "vallecillogray"    : return fixAndReportMisspelling(p1,"vallecillo-gray"); 
-                case "variatio"          : return fixAndReportMisspelling(p1,"variation");
-                case "vengence"          : return fixAndReportMisspelling(p1,"vengeance");         // 28
-                case "vicace"            : return fixAndReportMisspelling(p1,"vivace");
-                case "viscious"          : return fixAndReportMisspelling(p1,"vicious"); 
-                case "villian"           : return fixAndReportMisspelling(p1,"villain");           // 14
-                case "voulezvous"        : return fixAndReportMisspelling(p1,"voulez-vous"); 
-                case "welltempered"      : return fixAndReportMisspelling(p1,"well-tempered");     // 561 in database
-                case "wholy"             : return fixAndReportMisspelling(p1,"wholly");            // 13
-                case "withdrawl"         : return fixAndReportMisspelling(p1,"withdrawal");        // 11
-                case "wonderfull"        : return fixAndReportMisspelling(p1,"wonderful");         // 67
-                case "wunderhornlieder"  : return fixAndReportMisspelling(p1,"wunderhorn-lieder"); 
-                case "yerself"           :
-                case "youself"           : return fixAndReportMisspelling(p1,"yourself");          // 15
-                case "zauberflote"       : return fixAndReportMisspelling(p1,"zauberflöte");
-                default                  : return p1;
-            }
-        }
-    );
-    return stringBeingFixed;
-}
-/****************************************************************************************
- * Function: fixCapitalization ( language ruleset object, GC group type,                *
- *                               track number / event number, string to be processed )  *
- *                                                                                      *
- * Stage 2 of Guess Case, handles the capitalization changes                            *
- *                                                                                      *
- * First while loop is modified from Title Caps                                         *
- * Ported to JavaScript By John Resig - http://ejohn.org/ - 21 May 2008 (revised ver.)  *
- * Original by John Gruber - http://daringfireball.net/projects/titlecase/TitleCase.pl  *
- * License: http://www.opensource.org/licenses/mit-license.php                          *
- * Modified and extended by BrianFreud                                                  *
- ****************************************************************************************/
-(function() {
-    this.fixCapitalization = function(ruleSet, type, number, stringBeingFixed, mode, keepUpperCased) {
-        var lower = function(word) {
-                return word.toMusicBrainzLowerCase();
-        },
-            upper = function(word) {
-                return titleCaseString(word);
-        },
-            allUpper = function(word) {
-                return word.toMusicBrainzUpperCase();
-        },
-            upperPunct = function(all, punct, word) {
-                return punct + upper(word);
-        },
-            testWord = function(all, punct, word) {
-                characterListRegExp = new RegExp("[" + allFoldableChars + "]\\.[" + allFoldableChars + "]");
-                return (characterListRegExp).test(word) ? punct+word: punct+upper(word);
-        };
-        /* Capitalize individual words. */
-        if (ruleSet.changeCapitalization) {
-            var punct = ruleSet.punctuationCharacters,
-                smallwords = "("+ruleSet.lowerCaseWords.join("|")+")", // Convert data array to a regexp-friendlier format
-                bigwords = ruleSet.alwaysUppercasedWords,
-                parts = [],
-                split = /[:.;?!]|(?: |^)["Ò]/g, index = 0,
-                charMapRegExp = new RegExp("(\\b|\\-|\\‐||\\s)([" + allFoldableChars + "][" + allFoldableChars + ".']*)\\b", "g");
-            while (true) {
-                var m = split.exec(stringBeingFixed);
-                parts.push(stringBeingFixed.substring(index, m ? m.index: stringBeingFixed.length)
-                     .replace(charMapRegExp,testWord)
-                     .replace(new RegExp("\\b" + smallwords + "\\b", "ig"), lower)
-                     .replace(new RegExp("^" + punct + smallwords + "\\b", "ig"), upperPunct)
-                     .replace(new RegExp("\\b" + bigwords + "\\b", "ig"), allUpper)
-                     .replace(new RegExp("\\b" + smallwords + punct + "$", "ig"), upper)
-                     .replace(new RegExp("\\'[" + allFoldableChars + "]\\s"), lower)
-                     );
-                index = split.lastIndex;
-                if (m) {
-                    parts.push(m[0]);
-                } else {
-                    break;
-                }
-            }
-            stringBeingFixed = parts.join("");
-            /* ---------------------------------------------------------------------*/
-            /* Find and store ambiguous always UPPERCASE words.                     */
-            /* ---------------------------------------------------------------------*/
-            if (reportErrors) {
-                var ambigWord = stringBeingFixed.match(new RegExp("\\b" + ruleSet.ambiguousUppercasedWords + "\\b", "ig"));
-                if (ambigWord !== null) {
-                    for (var i = 0; i < ambigWord.length; i++) {
-                        if (ambigWord[i].length > 0) {
-                            storeError('Caution: This word should possibly be all UPPERCASE: ' + ambigWord[i], type, number);
-                        }
-                    }
-                }
-            }
-        }
-        /* ---------------------------------------------------------------------*/
-        /* Find and all-capitalize Roman numerals.                              */
-        /* Don't convert Roman to special unicode symbols, see                  */
-        /*   http://www.unicode.org/versions/Unicode5.1.0/ (Search on "roman")  */
-        /* ---------------------------------------------------------------------*/
-        var upperAll = function(str) {
-            return str.toMusicBrainzUpperCase();
-        };
-        if (ruleSet.usesRomanNumerals) {
-            var romanparts = [];
-            romanparts = stringBeingFixed.split(" ");
-            for (var n in romanparts) {
-                if (romanparts.hasOwnProperty(n)) {
-                    romanparts[n] = jQuery.trim(romanparts[n]).replace(/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i,upperAll);
-                }
-            }
-            stringBeingFixed = romanparts.join(" ");
-        }
-        /* ---------------------------------------------------------------------*/
-        /* Find and un-all-capitalize Roman numerals that happen to be words.   */
-        /* ---------------------------------------------------------------------*/
-        var romanParts = [];
-        romanParts = stringBeingFixed.split(" ");
-        for (var s in romanParts) {
-            if (romanParts.hasOwnProperty(s)) {
-                for (var q in ruleSet.romanWordsLower) {
-                    if (ruleSet.romanWordsLower.hasOwnProperty(q)) {
-                        if (ruleSet.romanWordsLower[q] === romanParts[s]) {
-                            romanParts[s] = romanParts[s].toMusicBrainzLowerCase();
-                        }
-                    }
-                }
-                for (var qq in ruleSet.romanWordsNormal) {
-                    if (ruleSet.romanWordsNormal.hasOwnProperty(qq)) {
-                        if (ruleSet.romanWordsNormal[qq] === romanParts[s]) {
-                            romanParts[s] = titleCaseString(romanParts[s]);
-                        }
-                    }
-                }
-            }
-        }
-        stringBeingFixed = romanParts.join(" ");
-        /* ---------------------------------------------------------------------*/
-        /* Find and re-all-capitalize initial ALLCAPS words.                    */
-        /* AllCapsPositions was caught and stored in stage 1.                   */
-        /* ---------------------------------------------------------------------*/
-        if (keepUpperCased) {
-            var allcapsparts = stringBeingFixed.split(" ");
-            for (var p in allcapsparts) {
-                if (AllCapsPositions[p]) {
-                    allcapsparts[p] = allcapsparts[p].toMusicBrainzUpperCase();
-                }
-            }
-            stringBeingFixed = allcapsparts.join(" ");
-        }
-        /* ---------------------------------------------------------------------*/
-        /* alwayslowercased is the superior rule to the ALLCAPS option for      */
-        /* single letter alwayslowercased words.                                */
-        /* ---------------------------------------------------------------------*/
-        var lowercasedparts = [];
-        lowercasedparts = stringBeingFixed.split(" ");
-        for (var st in lowercasedparts) {
-            if (lowercasedparts.hasOwnProperty(st)) {
-                for (var v in ruleSet.lowerCaseWords) {
-                    if (ruleSet.lowerCaseWords.hasOwnProperty(v)) {
-                        if (ruleSet.lowerCaseWords[v].length === 1) {
-                            if (ruleSet.lowerCaseWords[v] === lowercasedparts[st].toMusicBrainzLowerCase()) {
-                                lowercasedparts[st] = lowercasedparts[st].toMusicBrainzLowerCase();
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        stringBeingFixed = lowercasedparts.join(" ");
-        /* ---------------------------------------------------------------------*/
-        /* Clear extraneous whitespace that pops up if a punctuation character  */
-        /* which is spaceAfterPunctuation is the last character inside a ().    */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(/\((.+)\)/g,
-            function(str, p1) {
-                return "("+jQuery.trim(p1)+")";
-            }
-        );
-        /* ---------------------------------------------------------------------*/
-        /* Capitalize first word inside parenthesis, brackets, and / separated  */
-        /* substrings.                                                          */
-        /* ---------------------------------------------------------------------*/
-        if (ruleSet.capitalizeFragments) {
-            stringBeingFixed = stringBeingFixed.replace(new RegExp(ruleSet.fragmentPunctuation + "\\s?.", "g"),
-            function(a) {
-                return a.toMusicBrainzUpperCase();
-            });
-            /* ---------------------------------------------------------------------*/
-            /* This next has to be separate from the above, in order to catch all   */
-            /* instances in 'foo / (foo (foo) foo / foo'.  Otherwise, '/ (' gets    */
-            /* snagged, and the first '(f' gets missed.                             */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(new RegExp("\\/\\s.", "g"),
-            function(a) {
-                return a.toMusicBrainzUpperCase();
-            });
-        }
-        /* ---------------------------------------------------------------------*/
-        /* Make lowercase any non-starting alwayslowercase words which still    */
-        /* are uppercased (starting and ending words inside () mainly).         */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(new RegExp("\\b" + smallwords + "\\b", "ig"), lower)
-                                           .replace(/\(a\s/g,"(A "); // except for "A", as it is pretty much never a continuation of a thought
-        /* ---------------------------------------------------------------------*/
-        /* Make all UPPERCASE any commaUppercasedWords, if applicable.          */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(new RegExp(",\\s?" + ruleSet.commaUppercasedWords + "\\s?,", "ig"), allUpper);
-        /* ---------------------------------------------------------------------*/
-        /* Capitalize sentences.                                                */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(/(\w\.(\w\.)+)/g,  // Protect acronyms from spacing, to avoid U.S.A.Y.M.C.A. later on
-            function (str, p1) {
-                return p1.replace(/\./g,"\uDBC0\uDC00");  // U+100000 is guaranteed to never be a valid character in *anything*
-            }
-        );
-        if (ruleSet.capitalizeSentences) {
-            var sentenceparts = [],
-                splitFix = function(stringBeingFixed, mark) {
-                    sentenceparts = stringBeingFixed.split(mark);
-                    for (var n in sentenceparts) {
-                        if (sentenceparts.hasOwnProperty(n)) {
-                            sentenceparts[n] = titleCaseString(jQuery.trim(sentenceparts[n]));
-                        }
-                    }
-                    /* ---------------------------------------------------------------------*/
-                    /* Check if this punctuation mark is one that should be followed by a   */
-                    /* space and/or preceeded by a space.                                   */
-                    /* ---------------------------------------------------------------------*/
-                    if (new RegExp(ruleSet.spaceAfterPunctuation).test(mark)) {
-                        if (new RegExp(ruleSet.spaceBeforePunctuation).test(mark)) {
-                            return sentenceparts.join(" " + mark + " ");
-                        } else {
-                            return sentenceparts.join(mark + " ");
-                        }
-                    } else {
-                        if (new RegExp(ruleSet.spaceBeforePunctuation).test(mark)) {
-                            return sentenceparts.join(" " + mark);
-                        } else {
-                            return sentenceparts.join(mark);
-                        }
-                    }
-                };
-            for (i in ruleSet.sentenceEndingPunctuation) {
-                if (ruleSet.sentenceEndingPunctuation.hasOwnProperty(i)) {
-                    if (new RegExp(stringBeingFixed).test(ruleSet.sentenceEndingPunctuation[i])) {
-                        stringBeingFixed = splitFix(stringBeingFixed, ruleSet.sentenceEndingPunctuation[i]);
-                    }
-                }
-            }
-        }
-        stringBeingFixed = stringBeingFixed.replace(/\uDBC0\uDC00/g,".");
-        stringBeingFixed = stringBeingFixed.replace(/\s(\)|\])/g,"$1");  // Remove space before ). Happens when you have spaceAfterPunctuation ending a ().
-        /* ---------------------------------------------------------------------*/
-        /* Turn spaced out acronyms into space-less acronyms, also capitalize   */
-        /* the first letter of an acronym, if that acronym had whitespace       */
-        /* before it.                                                           */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(/((^|\s|\()(?:\"|\')?(\w\.\s?)+)/g,
-            function(str, p1) {
-                if (new RegExp(/(^|\s)((?:\w\.)(?:\s\w\.)+)/).test(p1)) {
-                    return " "+p1.replace(/\s/g, "").toMusicBrainzUpperCase()+" ";
-                } else {
-                    return p1.toMusicBrainzUpperCase();
-                }
-            }
-        );
-        /* ---------------------------------------------------------------------*/
-        /* Find and store possibly missed acronyms.                             */
-        /* ---------------------------------------------------------------------*/
-        if (reportErrors) {
-            var missedAcronyms = stringBeingFixed.match(new RegExp("([" + allUpperCaseChars + "]\\.)+\\s[" + allUpperCaseChars + "]($|\\s)"));
-            if (missedAcronyms !== null) {
-                storeError('Caution: Possible acronym with missing final period: "' + missedAcronyms[0] + '"', type, number);
-            }
-        }
-        /* ---------------------------------------------------------------------*/
-        /* Fix words like Y'all, I'll, C'mon, ( 1 char ' 2+ chars).             */
-        /* ---------------------------------------------------------------------*/
-        if (ruleSet.fixApostropheWords) {
-            stringBeingFixed = stringBeingFixed.replace(new RegExp("(\\b\\w'[" + allFoldableChars + "]{2,})" ,"g"),
-            function(str, p1) {
-                return titleCaseString(p1);
-            });
-            /* ---------------------------------------------------------------------*/
-            /* Exception to the above: O'Clock, O'Leary, O'Henry, and Vulcan names. */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/\b([to]\'\w)(\w+)\b/gi,
-                function(str, p1, p2) {
-                    return p1.toMusicBrainzUpperCase() + p2.toMusicBrainzLowerCase();
-                }
-            );
-            /* ---------------------------------------------------------------------*/
-            /* And d'Arcy, d'Foo, etc.                                              */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/\bd\'(\w)(\w+)\b/gi,
-                function(str, p1, p2) {
-                    return "d'" + p1.toMusicBrainzUpperCase() + p2.toMusicBrainzLowerCase();
-                }
-            );
-        }
-        /* ---------------------------------------------------------------------*/
-        /* Fix words like 'round.                                               */
-        /* ---------------------------------------------------------------------*/
-        if (ruleSet.lowerCaseApostropheWords) {
-            stringBeingFixed = stringBeingFixed.replace(/((?:^|\s)'\w)/g,
-            function(str, p1) {
-                return p1.toMusicBrainzLowerCase();
-            });
-        }
-        /* ---------------------------------------------------------------------*/
-        /* Special capitalizations.                                             */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace("Djs", "DJs");
-        /* ---------------------------------------------------------------------*/
-        /* Don't space around / or . in dates.                                  */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(/(\d{1,2})\s\/\s(\d{1,2})/g,"$1/$2")
-                                           .replace(/(\d{1,2})\s\/\s(\d{2,4})/g,"$1/$2")
-                                           .replace(/(\d{2,4})\.\s(\d{1,2})(?:\.\s(\d{1,2}))?/g,
-            function (str, p1, p2, p3) {
-                var separator = "";
-                if (p1.length === 4) {
-                    separator = ruleSet.dashFigure;
-                } else {
-                    separator = ".";
-                }
-                if (typeof(p3) === "undefined" || p3 === "") {
-                    return p1+separator+p2;
-                } else {
-                    return p1+separator+p2+separator+p3;
-                }
-            }
-        );
-        /* ---------------------------------------------------------------------*/
-        /* Capitalize first word of the track title, no matter what it is.      */
-        /* ---------------------------------------------------------------------*/
-        if (new RegExp("\\s").test(stringBeingFixed)) {
-            var sections = stringBeingFixed.split(" ");
-            stringBeingFixed = titleCaseString(sections.shift()) + " " + sections.join(" ");
-        } else {
-            stringBeingFixed = titleCaseString(stringBeingFixed);
-        }
-        /* ---------------------------------------------------------------------*/
-        /* Fix lowercase sigma to correct word-ending lowercased sigma.         */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(/(.+)σ(\s|$)/g,"$1ς$2");
-        /* ---------------------------------------------------------------------*/
-        /* Handle Mc/Mac names.                                                 */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(/(\s|^)(ma?c)([A-Za-z]+)(\s|$)/gi,
-            function(str,p1,p2,p3) {
-                if (p3.slice(0,1) != "x" && p3.slice(0,1) != "z") {  // Neither letter has any MacNames
-                    if (p3.match(new RegExp("\\b" + namesDict.macNames[p3.slice(0,1)] + "\\b", "ig")) !== null) {
-                        p3 = titleCaseString(p3);
-                    }
-                }
-                return p1 + p2 + p3 + " ";
-            }
-        );
-        /* ---------------------------------------------------------------------*/
-        /* Handle * used as character replacement (normally expletives).        */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(/\*(\w)/g,
-            function (str, p1) {
-                return "*"+p1.toMusicBrainzLowerCase();
-            }
-        );
-        /* ---------------------------------------------------------------------*/
-        /* Handle German es-zed (which JavaScript ignores in a toUpper!)        */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(/([\s$])ß(.*(?:\s|$))/g,
-            function(str, p1, p2) {
-                return p1+"SS"+p2.toMusicBrainzLowerCase();
-            }
-        );
-        /* ---------------------------------------------------------------------*/
-        /* Fix odd acronym ownership cases like O.D.'d.                         */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(/\.\s\'d\s/g,".'d ");
-        /* ---------------------------------------------------------------------*/
-        /* Floating point numbers are not sentences.                            */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(/(\d+)\.\s(\d+)/g,"$1.$2");
-        /* ---------------------------------------------------------------------*/
-        /* #1 not # 1.                                                          */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(/#\s(\d+)/g,"#$1");
-        /* ---------------------------------------------------------------------*/
-        /* Capitalize first-word-of-quote alwayslowercased words.               */
-        /* ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(new RegExp('\\"(' + ruleSet.lowerCaseWords.join("|") + ")", "g"),
-            function(str, p1) {
-                return '"' + titleCaseString(p1);
-            }
-        );
-        /* ---------------------------------------------------------------------*
-         * Fix DJ, MC, composers
-         * ---------------------------------------------------------------------*/
-        stringBeingFixed = stringBeingFixed.replace(/(?:\b|^)d\.?\s?j\.?(?:\s|$)/gi," DJ ")
-                                           .replace(/(?:\b|^)m\.?\s?c\.?(?:\s|$)/gi," MC ")
-                                           .replace(/\sop\s?(\d{1,2})(?:\s|$)/gi," Op. $1 ")        // 'Op. 123'
-                                           .replace(/\sbwv\s?(\d{1,3})(?:\s|$)s/gi," BWV$1 ")       // 'Classical catalog: BWV (Bach)'
-                                           .replace(/\srv\s?(\d{1,3})(?:\s|$)/gi," RV$1 ")          // 'Classical catalog: RV (Vivaldi)'
-                                           .replace(/\shob\s?(\d{1,3})(?:\s|$)/gi," Hob$1 ")        // 'Classical catalog: Hob (Haydn)'
-                                           .replace(/\shwv\s?(\d{1,3})(?:\s|$)/gi," HWV$1 ")        // 'Classical catalog: HWV (Handel)'
-                                           .replace(/\shwwo\s?(\d{1,3})(?:\s|$)/gi," WwO$1 ")       // 'Classical catalog: WwO'
-                                           .replace(/\shkv\s?(\d{1,3})(?:\s|$)/gi," KV$1 ")         // 'Classical catalog: KV (Mozart)'
-                                           .replace(/\shph\.?d\s/gi," Ph.D ");                      // Capitalize Ph.D correctly
-        return stringBeingFixed;
-    };
-})();
-/*************************************************************************************
- * Function: applyGuidelines ( language ruleset object, GC group type,               *
- *                             track number / event number, string to be processed ) *
- *                                                                                   *
- * Stage 3 of Guess Case, applies style guidelines to the text.                      *
- *************************************************************************************/
-function applyGuidelines(ruleSet, type, number, stringBeingFixed, mode) {
-    /* ---------------------------------------------------------------------*/
-    /* Bang + pound is almost always character explitive replacement,       */
-    /* ignore normal spacing rules.                                         */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/!\s?#\s?/g,"!#");
-    /* ---------------------------------------------------------------------*/
-    /* Fix explicit interrobangs, if the language uses them.                */
-    /* ---------------------------------------------------------------------*/
-    if (ruleSet.punctuationCharacters.match("‽") !== "null") {
-        stringBeingFixed = stringBeingFixed.replace(/!\s\?\s?/g, "!?")
-                                           .replace(/\?\s!\s?/g, "?!");
-    }
-    /* ---------------------------------------------------------------------*/
-    /* Use non-breaking spaces, if there's a space in that position.        */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/\s([»\:;?!])/g,
-        function (str, p1) {
-            return ruleSet.spaceChar + p1;
-        }
-    );
-    stringBeingFixed = stringBeingFixed.replace(/«\s/g,
-        function (str, p1) {
-            return p1 + ruleSet.spaceChar;
-        }
-    );
-    /* ---------------------------------------------------------------------*/
-    /* Style-mandated artists and titles.                                   */
-    /* ---------------------------------------------------------------------*/
-            var testString = stringBeingFixed.toMusicBrainzLowerCase().replace(/[\[\(\{](.+)[\]\)\}]/,"$1");
-            switch (testString) {
-                /* DataTrackStyle */
-                case "äèñê ñ äàííûìè":
-                case "beveiliging":
-                case "bonus cd rom content":
-                case "bonus data track":
-                case "bonus data-track":
-                case "bonus-data track":
-                case "cccd":
-                case "cd media":
-                case "cd plus":
-                case "cd track":
-                case "cd-extra":
-                case "cd-maximum catalogue":
-                case "cd-rom":
-                case "cd+":
-                case "copy control":
-                case "copy protection":
-                case "copycontrol":
-                case "dados":
-                case "data track":
-                case "data":
-                case "dataspår":
-                case "dataspor":
-                case "daten-cd":
-                case "daten":
-                case "datentrack":
-                case "datos":
-                case "do not rip":
-                case "dodatki multimedialne":
-                case "données":
-                case "enhanced":
-                case "gegevens":
-                case "kopibeskyttelse":
-                case "kopieerbeveiliging":
-                case "kopieringsskydd":
-                case "Kopierschutz":
-                case "lgcd":
-                case "multimedia":
-                case "open disc":
-                case "opendisc":
-                case "prezentacja multimedialna":
-                case "quicktime":
-                case "video clip":
-                case "video track":
-                case "video":
-                case "videoclip":
-                case "videos":
-                case "videotrack":
-                case "στοιχεία":
-                case "данные":
-                case "диск с данными":
-                case "データ":
-                    stringBeingFixed = "[data track]";
-                    storeError(text.DataTrack, type, number);
-                    break;
-                default:
-            }
-    /* ---------------------------------------------------------------------*/
-    /* Fix comma-spaced numbers, like 1,000,000 and 1,000                   */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/((?:\d{1,3},\s)+\d{3})/g,
-        function(str, p1) {
-            return p1.replace(/\s/, "");
-        }
-    );
-    /* ---------------------------------------------------------------------*/
-    /* Fix times, like 6: 00 and 12: 00.                                    */
-    /* ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/(\d{1,2}:\s\d{2})/g,
-        function(str, p1) {
-            return p1.replace(/\s/, "");
-        }
-    );
-    /* ---------------------------------------------------------------------*/
-    /* Type-specific changes per guidelines.                                */
-    /* ---------------------------------------------------------------------*/
-    switch (type) {
-        case "title":
-        case "text":
-            /* ---------------------------------------------------------------------*/
-            /* Standardize foreign words prior to applying style rules.             */
-            /* ---------------------------------------------------------------------*/
-            if (ruleSet.wordForPt.length > 0) {
-                stringBeingFixed = stringBeingFixed.replace(new RegExp("\\b" + ruleSet.wordForPt + "\\b"), "part"); // Multi-language support for "pt." before standardizing
-            }
-            if (ruleSet.wordForPart.length > 0) {
-                stringBeingFixed = stringBeingFixed.replace(new RegExp("\\b" + ruleSet.wordForPart + "\\b"), "part"); // Multi-language support for "part" before standardizing
-            }
-            if (ruleSet.wordForParts.length > 0) {
-                stringBeingFixed = stringBeingFixed.replace(new RegExp("\\b" + ruleSet.wordForParts + "\\b"), "parts"); // Multi-language support for "parts" before standardizing
-            }
-            if (ruleSet.wordForVolumeA.length > 0) {
-                stringBeingFixed = stringBeingFixed.replace(new RegExp("\\b" + ruleSet.wordForVolumeA + "\\b"), "volume"); // Multi-language support for "volume" before standardizing
-            }
-            if (ruleSet.wordForVolumeB.length > 0) {
-                stringBeingFixed = stringBeingFixed.replace(new RegExp("\\b" + ruleSet.wordForVolumeB + "\\b"), "volume"); // Multi-language support for "vol." before standardizing
-            }
-            if (ruleSet.wordForDisc.length > 0) {
-                stringBeingFixed = stringBeingFixed.replace(new RegExp("\\b" + ruleSet.wordForDisc + "\\b"), "disc"); // Multi-language support for "disc" before standardizing
-            }
-            if (ruleSet.wordForBox.length > 0) {
-                stringBeingFixed = stringBeingFixed.replace(new RegExp("\\b" + ruleSet.wordForBox + "\\b"), "box"); // Multi-language support for "box" before standardizing
-            }
-            /* ---------------------------------------------------------------------*/
-            /* VolumeNumberStyle.                                                   */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(new RegExp(",?(^|\\s)[\\(\\[]?vol(?:\\.|(?:ume\\.?))\\s?([" + allFoldableChars + "\\d]+):?(.*)?", "gi"),
-                function(all, p1,p2,p3) {
-                    var startOfString;
-                    if (p1 == " ") {
-                        startOfString = ", ";
-                    } else {
-                        startOfString = "";
-                    }
-                    if (p3 === "" || p3 == "]") {
-                        return startOfString+"Volume "+p2;
-                    } else if (p3 == ")") {
-                        return startOfString+"Volume "+p2+p3;
-                    } else {
-                        return startOfString+"Volume "+jQuery.trim((p2).replace(/[\]\)]/g,"").replace(/#/g,"")+": "+p3);
-                    }
-                }
-            );
-            stringBeingFixed = stringBeingFixed.replace(/\:$/,"");
-            /* ---------------------------------------------------------------------*/
-            /* PartNumberStyle.                                                     */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/\s\(?p(?:ar)?ts?\.?\s(\d+)\sof\s\d+\)?/gi, " part $1 ");  //  Change "Foo Part 1 of 4" into "Foo Part 1"
-            var partsInTitleRegExp = new RegExp("([" + AllPunctuation + "\\s])?\\s?\\,?[\\-?\\s\\[\\(]p(?:ar)?ts?s?\\.?\\b\\s?#?(?:\\.\\s)?([" + allFoldableChars + "\\d]+),?(?:\\s?((?:to)|(?:through)|(?:and)|&|\\-|\\‐|\\–|\\)\\s&\\s\\(p(?:ar)?ts?s?|\\+)\\s?)?#?(?:|\\s-|\\s|\\,|&|and|\\‐|\\-|\\–)+#?([" + allFoldableChars + "\\d]+)?[,:]?\\b,?\\s?(?:and|&)?\\s?([" + allFoldableChars + "\\d]+)?,?\\)?\\s?(.+)?", "gi");
-            stringBeingFixed = stringBeingFixed.replace(/\s?\,?[\s\[\(]p(?:ar)?ts?s?\.?(\d+)/g," part $1")  // Catch pt1 but not pterodactyl.
-                                               .replace(partsInTitleRegExp,
-                function(str, beforepunct, p1, p2, p3, p4, p5) {
-                         var notASentence = false,
-                             numberTextStrings = "(" + ruleSet.numberWords.join("|") + ")";
-                         if (typeof(beforepunct) === "undefined") {
-                             beforepunct = "";
-                         }
-                         if (typeof(p4) !== "undefined") {
-                             if  (p4 === "" && typeof(p5) !== "undefined") {
-                                 p4 = p5;    // Handle cases like "This Is a Song, Parts 1 & 2, 3 the Subtitle" and "This Is a Song, Part 1, 2, & 3 the
-                                 p5 = "";    // Subtitle", where data *still* gets trapped in the wrong field.
-                             }
-                         }
-                         /*******************************************************************/
-                         /* Return true if p1 and p2 have sequential final letters.         */
-                         /* Make them both uppercase to advoid a false negative on a and B. */
-                         /*******************************************************************/
-                         function checkAlphabeticalOrder(numberOfLetters) {
-                             if (parseInt(p1.toMusicBrainzUpperCase().charCodeAt(numberOfLetters-1), 10) + 1 == parseInt(p3.toMusicBrainzUpperCase().charCodeAt(numberOfLetters-1), 10) && p1.toMusicBrainzUpperCase().charCodeAt(numberOfLetters-1) == p3.toMusicBrainzUpperCase().charCodeAt(numberOfLetters-1)) {
-                                 return true;
-                             } else {
-                                 return false;
-                             }
-                         }
-                         /***************************************************************************/
-                         /* Fingerprint, with increasing risk of error and slowness at each step,   */
-                         /* to identify if this is a PartNumberStyle case, or the word 'Part'.      */
-                         /***************************************************************************/
-                         if (typeof(p2) !== "undefined") {
-                             if (p2 !== "") { // p2 is always empty when it is a sentence, so if p2 is not empty, this is not a sentence.
-                                 notASentence = true;
-                             }
-                         }
-                         if (!notASentence) {
-                             if (typeof(p3) !== "undefined") {
-                                 if (p3 === "") {
-                                     notASentence = true; // p2 is never empty when it is a sentence, so if p3 is empty, this is not a sentence.
-                                 }
-                             } else {
-                                 notASentence = true; // p2 is never empty when it is a sentence, so if p3 == undefined, this is not a sentence.
-                             }
-                             if (!notASentence) {
-                                 if (typeof(p3) !== "undefined") {
-                                     if (new RegExp(/^[\d]$/).test(p2)) {  // Look for a number in p3.
-                                         notASentence = true; // Makes the assumption that one would never use numbers right in front of "Part" unless referencing a PartNumber.  (Part 1 Foo Bar)
-                                     }
-                                     if (!notASentence) {
-                                         if (typeof(p4) !== "undefined") {  // Look for a number in p4.
-                                             if (new RegExp(/^[\d]$/).test(p3)) {
-                                                 notASentence = true; // Makes the assumption that one would almost never use numbers one word in front of "Part" unless referencing a PartNumber.  (Part Foo 1 Bar)
-                                             }
-                                         }
-                                     }
-                                     if (!notASentence) {
-                                         if (typeof(p2) !== "undefined" && typeof(p3) !== "undefined") {
-                                             if (validateRoman(p2.toMusicBrainzUpperCase()) && validateRoman(p3.toMusicBrainzUpperCase())) { // Test if both are Roman numerals.
-                                                 notASentence = true; // Makes the assumption that one would rarely use two Roman numerals in front of "Part" unless referencing a PartNumber.  (Part III VI Bar)
-                                             }
-                                             if (!notASentence) {
-                                                 if (p1.length === 1 && p3.length === 1) {
-                                                     notASentence = true; // Makes the assumption that if there is a 1 letter string each in p1 and p3, this is not a sentence.  (Part A B Bar)
-                                                 }
-                                                 if (!notASentence) {
-                                                     if (p1.length === 2 && p3.length === 2) {
-                                                         if (checkAlphabeticalOrder(1)) {
-                                                             notASentence = true; // Makes the assumption that if there is a 2 letter string each in p1 and p3, and they are sequential, this is not a sentence.  (Part AA AB Bar)
-                                                         }
-                                                     }
-                                                     if (!notASentence) {
-                                                         if (p1.length === 3 && p3.length === 3) {
-                                                             if (checkAlphabeticalOrder(1)) {
-                                                                 notASentence = true; // If there is a 3 letter string each in p1 and p3, and they are sequential, this is not a sentence.  (Part AAA AAB Bar)
-                                                             }
-                                                         }
-                                                         if (!notASentence) {
-                                                             if (p1.length === 4 && p3.length === 4) {
-                                                                 if (checkAlphabeticalOrder(1)) {
-                                                                     notASentence = true; // If there is a 4 letter string each in p1 and p3, and they are sequential, this is not a sentence.  (Part AAAA AAAB Bar)
-                                                                 }
-                                                             }
-                                                             if (!notASentence) {
-                                                                 if (typeof(p4) != "undefined") {
-                                                                     if (validateRoman(p2.toMusicBrainzUpperCase()) && validateRoman(p4.toMusicBrainzUpperCase().replace(/^&\s(.+)\)/,"$1"))) {
-                                                                         notASentence = true; // Makes the assumption that one would rarely use two Roman numerals within the three words following "Part".  (Part III Foo VI)
-                                                                     }                        // p4 would only still be present at this point as sentence text, text in a subtitle, or in a '& VI)' form, hence the regexp.
-                                                                 }
-                                                                 /* Finally, by this point, we have only two groups left: sentences and subtitles.  Time to go back to str. */
-                                                                 if (!notASentence) {
-                                                                     if (str.match("Part:")) {  // Note the colon.
-                                                                         notASentence = true;   // Assume it's a part number.    (Part: 2 Foo Bar)
-                                                                     }
-                                                                     if (!notASentence) {
-                                                                         if (str.match("Pt")) {
-                                                                             notASentence = true;  // Abbreviated "Pt" almost certainly indicates PartNumberStyle.  (Pt. Foo Bar)
-                                                                         }
-                                                                         if (!notASentence) {
-                                                                             if (str.slice(0,7).match(new RegExp("[\\.\\:]"))) {
-                                                                                 notASentence = true;  // Period or colon within reasonable range of the word "Part".  Take that to indicate PartNumberStyle.  (Part: 4 Foo Bar)
-                                                                             }
-                                                                             if (!notASentence) {
-                                                                                 if (str.slice(0,9).match(new RegExp("\\d+"))) {
-                                                                                     notASentence = true;  // A number within reasonable range of the word "Part".  Take that to indicate PartNumberStyle.  (Part   4 Foo Bar)
-                                                                                 }
-                                                                                 if (!notASentence) {
-                                                                                     if (!(new RegExp("(^[" + ruleSet.romanWordsNormal.join("|") + "|" + ruleSet.romanWordsLower.join("|") + "]$)", "i").test(p1)) || p1 == "I" || p1 == "VI") {  // Make sure it's not a Roman numeral that also happens to be a valid word in the language.
-                                                                                         if (validateRoman(p1.toMusicBrainzUpperCase())) {
-                                                                                             if (validateRoman(p3.match(new RegExp("[A-Za-z]+")).join().toUpperCase()) || validateRoman(p4.match(new RegExp("[A-Za-z]+")).join().toUpperCase())) {  // Check for a I II sequence, avoid a false positive
-                                                                                                 notASentence = true;  // The first word after "Part" is a Roman numeral, assume PartNumberStyle.  (Part II Foo Bar)
-                                                                                             }
-                                                                                         }
-                                                                                         if (!notASentence) {
-                                                                                             if (new RegExp(numberTextStrings, "i").test(p1)) {
-                                                                                                 notASentence = true;  // We matched to a written out number.  (Part One Foo Bar)
-                                                                                             }
-                                                                                             if (!notASentence) {
-                                                                                                 if ((p1.length == p2.length || p2.length == p3.length) && (new RegExp("\\d").test(p1)) || new RegExp("\\d").test(p3)) {
-                                                                                                     notASentence = true;  // Look for mixed letter/number part numbers, like A1, A1a, etc.
-                                                                                                 }
-                                                                                             }
-
-                                                                                         } // At this point, give up, and assume it's a sentence.
-                                                                                     }
-                                                                                 }
-                                                                             }
-                                                                         }
-                                                                     }
-                                                                 }
-                                                             }
-                                                         }
-                                                     }
-                                                 }
-                                             }
-                                         }
-                                     }
-                                 }
-                             }
-                         }
-                         if (!notASentence) {
-                             return str;  // It *is* a sentence.  Return it unchanged.
-                         }
-                         if (typeof(p2) === "undefined") {
-                             p2 = "";
-                         }
-                         if (typeof(p3) === "undefined") {
-                             p3 = "";
-                         }
-                         if (typeof(p4) === "undefined") {
-                             p4 = "";
-                         }
-                         if (typeof(p5) === "undefined") {
-                             p5 = "";
-                         }
-                        /***********************************************************
-                         * Now we know we have a real PartNumberStyle case.
-                         * The data is currently split amidst p1-p4, as we are so
-                         * permissive in the PartNumberStyle guidelines (and
-                         * how lousy a lot of the pre-Guess Case data can be).
-                         ***********************************************************
-                         *    |    p1  |       p2     |   p3    |     p4
-                         *    |-------------------------------------------------------
-                         *    |    1   |              |         |
-                         *    |    1   |              |         |
-                         *    |    1   |              |         |    / Bar
-                         *    |    1   |              |         |   : Bar
-                         *    |    1   |              |         |   : Parttitle
-                         *    |    1   |              |         |   )
-                         *    |    1   |              |         |   ) ‐ (Part 3)
-                         *    |    1   |              |         |   ) / Bar
-                         *    |    1   |              |   2     |
-                         *    |    1   |              |   2     |    & 3)
-                         *    |    1   |              |   2     |   )
-                         *    |    1   |              |   the   |    Subtitle
-                         *    |    1   |   ‐          |   2     |
-                         *    |    1   |   ‐          |   2     |   )
-                         *    |    1   |   ‐          |   3     |
-                         *    |    1   |   ‐          |   3     |    & 5)
-                         *    |    1   |   ‐          |   3     |   , & 5)
-                         *    |    1   |   ‐          |   3     |   )
-                         *    |    1   |   –          |   2     |
-                         *    |    1   |   ) & (Part  |   2     |   )
-                         *    |    1   |   ) & (Part  |   3     |   )
-                         *    |    1   |   &          |   2     |
-                         *    |    1   |   &          |   2     |   )
-                         *    |    1   |   &          |   3     |
-                         *    |    1   |   &          |   Pt    |   . 2
-                         *    |    1   |   and        |   2     |   )
-                         *    |    1B  |              |         |
-                         *    |    3   |              |         |
-                         *    |    3   |              |         |   )
-                         *    |   One  |              |         |
-                         *    |   One  |              |         |
-                         *    |   One  |              |         |    / Bar
-                         *    |   One  |              |         |   : Bar
-                         *    |   One  |              |         |   : Parttitle
-                         *    |   One  |              |         |   )
-                         *    |   One  |              |         |   ) ‐ (Part Three)
-                         *    |   One  |              |         |   ) / Bar
-                         *    |   One  |              |  Two    |
-                         *    |   One  |              |  Two    |    & Three)
-                         *    |   One  |              |  Two    |   )
-                         *    |   One  |              |   the   |    Subtitle
-                         *    |   One  |   ‐          |  Two    |
-                         *    |   One  |   ‐          |  Two    |   )
-                         *    |   One  |   ‐          | Three   |
-                         *    |   One  |   ‐          | Three   |    & Five)
-                         *    |   One  |   ‐          | Three   |   , & Five)
-                         *    |   One  |   ‐          | Three   |   )
-                         *    |   One  |   –          |  Two    |
-                         *    |   One  |   ) & (Part  |  Two    |   )
-                         *    |   One  |   ) & (Part  | Three   |   )
-                         *    |   One  |   &          |  Two    |
-                         *    |   One  |   &          |  Two    |   )
-                         *    |   One  |   &          | Three   |
-                         *    |   One  |   &          |   Pt    |   . Two
-                         *    |   One  |   and        |  Two    |   )
-                         *    |    a   |              |         |
-                         *    |    a   |              |         |   ) ‐ (Part C)
-                         *    |    a   |              |   B     |
-                         *    |    a   |              |   B     |    & C)
-                         *    |    a   |              |   B     |   )
-                         *    |    a   |   ‐          |   B     |
-                         *    |    a   |   ‐          |   B     |   )
-                         *    |    A   |   ‐          |   B     |   )
-                         *    |    a   |   ‐          |   C     |
-                         *    |    A   |   ‐          |   C     |    & E)
-                         *    |    A   |   ‐          |   C     |   , & E)
-                         *    |    A   |   ‐          |   C     |   )
-                         *    |    a   |   ) & (Part  |   B     |   )
-                         *    |    a   |   ) & (Part  |   C     |   )
-                         *    |    a   |   &          |   B     |
-                         *    |    a   |   &          |   C     |
-                         *    |    A   |   &          |   Pt    |   . B
-                         *    |    a   |   and        |   B     |   )
-                         *    |    B   |              |         |
-                         *    |    I   |              |         |   ) ‐ (Part Iii)
-                         *    |    I   |              |   Ii    |
-                         *    |    I   |              |   Ii    |    & Iii)
-                         *    |    I   |              |   Ii    |   )
-                         *    |    I   |   ‐          |   Ii    |
-                         *    |    I   |   ‐          |   Ii    |   )
-                         *    |    I   |   ‐          |   Iii   |
-                         *    |    I   |   ‐          |   Iii   |    & v)
-                         *    |    I   |   ‐          |   Iii   |   , & v)
-                         *    |    I   |   ‐          |   Iii   |   )
-                         *    |    I   |   ) & (Part  |   Ii    |   )
-                         *    |    I   |   ) & (Part  |   Iii   |   )
-                         *    |    I   |   &          |   Ii    |
-                         *    |    I   |   &          |   Iii   |
-                         *    |    I   |   &          |   Pt    |   . Ii
-                         *    |    I   |   and        |   Ii    |   )
-                         *    |    Ii  |              |         |    (the Text)
-                         *    |    Ii  |              |   the   |    Subtitle
-                         *    |    X   |              |         |   )
-                         *    |    Xi  |              |         |
-                         ************************************************************
-                         * Happily, all of p2 is worthless for the moment, so we
-                         * can ignore p2 for now.  Ignoring what the part number type
-                         * is for the moment, here are the patterns that leaves:
-                         **********************************************************
-                         *               1   |         |
-                         *               1   |   1     |
-                         *               1   |   1     |   1
-                         *               1   |         |    (the Text)
-                         *               1   |         |    / Bar
-                         *               1   |         |   : Parttitle
-                         *               1   |         |   )
-                         *               1   |         |   ) ‐ (Part 1)
-                         *               1   |         |   ) / Bar
-                         *               1   |   1     |    & 1)
-                         *               1   |   1     |   , & 1)
-                         *               1   |   1     |   )
-                         *               1   |   Pt    |   . 1
-                         *               1   |   the   |    Subtitle
-                         ***********************************************************
-                         * First, to clean out p4...
-                         ***********************************************************/
-                          p4 = jQuery.trim(p4.replace(/[\(\.,&\)]/g,"")            // Do not remove the colons or dashes, but remove all ( . , & )
-                                     .replace(/\bp(?:ar)?ts?\.?\s/i,""));           // and all those unneeded "Part"s.
-                         /***********************************************************
-                          *               1    |       |
-                          *               1    |  1    |
-                          *               1    |   1   |  1
-                          *               1    |       |  1
-                          *               1    |       |  - 1
-                          *               1    |       |  : bar
-                          *               1    |       |  : Parttitle
-                          *               1    |       |  bar
-                          *               1    |       |  the Text
-                          *               1    |  Pt   |  1
-                          *               1    |  the  |  Subtitle
-                          *               1    |  the  |  Subtitle
-                          ***********************************************************
-                          * and then p1 and p3...
-                          ***********************************************************/
-                          p1 = jQuery.trim(p1);                                        // Any spaces that happen to be hanging around.
-                          p3 = jQuery.trim(p3.replace(/\bp(?:ar)?ts?\.?\s?/i,""));     // All those unneeded "Part"s.
-                         /***********************************************************
-                          *                 1    |     |
-                          *                 1    |  1  |
-                          *                 1    |  1  |  1
-                          *                 1    |     |  1
-                          *                 1    |     |  - 1
-                          *                 1    |     |  : Bar
-                          *                 1    |     |  , - 3: the Subtitle
-                          *                 1    |     |  : Parttitle
-                          *                 1    |     |  Bar
-                          *                 1    |     |  the Text
-                          *                 1    | the |  Subtitle
-                          ***********************************************************
-                          * Now we need to split out Subtitles.  It's assumed that
-                          * each part does not have its own subtitle.
-                          ***********************************************************/
-                          var partSubtitle = "";
-                          if (new RegExp("^[\\/:]").test(p4)) {
-                              partSubtitle = jQuery.trim(p4.replace(/:/," "));  // Found a colon or slash starting p4, store p4,
-                              p4 = "";                                          // then empty out p4.
-                          }
-                         /***********************************************************
-                          * Now check p2 and p4, looking for range
-                          * indicators: to, through, -, ‐, –
-                          ***********************************************************/
-                          var RangeBetweenOneTwo = false,
-                              RangeBetweenTwoThree = false,
-                              RangeIndicator = new RegExp("^((?:to)|(?:through)|\\-|\\‐|\\–)");
-                           if (RangeIndicator.test(p2)) {
-                               RangeBetweenOneTwo = true;                         // Found a range indicator in p2, store that info.
-                           }
-                           p4 = jQuery.trim(p4.replace(new RegExp("^[,&]?\\s?"), ""));  // Remove any extra crud from p4 that would cause the next check to fail.  (", - 3: the Subtitle", etc.)
-                           if (RangeIndicator.test(p4)) {
-                               RangeBetweenTwoThree = true;                       // Found a range indicator in p4, store that info,
-                               p4 = jQuery.trim(p4.replace(RangeIndicator," "));  // then remove it.
-                           }
-                         /***********************************************************
-                          * More subtitle detection, protection, and capture.
-                          ***********************************************************/
-                           if (new RegExp("\uDBC0\uDC01").test(p4)) {  // If \uDBC0\uDC01 is in p4, we have a protected slash, plus all of the next part title(s) in p4.
-                               partSubtitle = " \uDBC0\uDC01 " + partSubtitle;
-                               p4 = p4.replace("\uDBC0\uDC01","");
-                           }
-                           if (new RegExp("\\s","g").test(p4)) {  // If p4 still has a space in it, there's at least part of the subtitle stuck in there.
-                               var tempP4 = p4.split(" ");
-                               p4 = tempP4.shift().replace(":","");
-                               partSubtitle = partSubtitle + tempP4.join(" ");
-                           }
-                         /***********************************************************
-                          *                 1    |     |
-                          *                 1    |  1  |
-                          *                 1    |  1  |  1
-                          *                 1    |     |  1
-                          *                 1    |     |  : Bar
-                          *                 1    |     |  : Parttitle
-                          *                 1    |     |  Bar
-                          *                 1    |     |  the Text
-                          *                 1    | the |  Subtitle
-                          ***********************************************************
-                          * Now to test for any of the valid part formations:
-                          *
-                          * Roman Numerals
-                          * Numbers
-                          * Letters
-                          * Letters + Numbers
-                          * Spelled out numbers (if applicable for the language)
-                          *
-                          ***********************************************************/
-                          var Part1 = "",
-                              Part2 = "",
-                              Part3 = "",
-                              Part1Type = "",
-                              Part2Type = "",
-                              Part3Type = "";
-                         /***********************************************************
-                          * Roman Numbers
-                          ***********************************************************/
-                          if (ruleSet.usesRomanNumerals) {  // Does the currently set language use Roman numerals?
-                              if (typeof(p1) != "undefined") {
-                                  var toTest = p1.toMusicBrainzUpperCase();
-                                  if (validateRoman(toTest)) {
-                                      if (convertRomanToArabic(toTest) < 49) {  // It's much more likely that L and C are used as letters, not Roman numerals.
-                                          Part1 = toTest;
-                                          p1 = "";
-                                          Part1Type = "Roman";
-                                      }
-                                  }
-                              }
-                              if (typeof(p3) != "undefined") {
-                                  toTest = p3.toMusicBrainzUpperCase();
-                                  if (validateRoman(toTest)) {
-                                      if (convertRomanToArabic(toTest) < 49) {  // It's much more likely that L and C are used as letters, not Roman numerals.
-                                          Part2 = p3.toMusicBrainzUpperCase();
-                                          p3 = "";
-                                          Part2Type = "Roman";
-                                      }
-                                  }
-                              }
-                              if (typeof(p4) != "undefined") {
-                                  toTest = p4.toMusicBrainzUpperCase();
-                                  if (validateRoman(toTest)) {
-                                      if (convertRomanToArabic(toTest) < 49) {  // It's much more likely that L and C are used as letters, not Roman numerals.
-                                          if (Part2 === "") {
-                                              Part2 = p4.toMusicBrainzUpperCase();
-                                              p4 = "";
-                                              Part2Type = "Roman";
-                                          } else {
-                                              Part3 = p4.toMusicBrainzUpperCase();
-                                              p4 = "";
-                                              Part3Type = "Roman";
-                                          }
-                                      }
-                                  }
-                              }
-                          }
-                         /***********************************************************/
-                          function searchForType(pattern, partType, searchSwitch) {
-                              var searchRange = new RegExp(pattern, searchSwitch);
-                              if (p1.length > 0) {
-                                  if (searchRange.test(p1)) {
-                                      if (Part1 === "") {
-                                          Part1 = p1;
-                                          p1 = "";
-                                          Part1Type = partType;
-                                      } else {
-                                          Part2 = p1;
-                                          p1 = "";
-                                          Part2Type = partType;
-                                      }
-                                  }
-                              }
-                              if (p3.length > 0) {
-                                  if (searchRange.test(p3)) {
-                                      if (Part2 === "") {
-                                          Part2 = p3;
-                                          p3 = "";
-                                          Part2Type = partType;
-                                      } else {
-                                          Part3 = p3;
-                                          p3 = "";
-                                          Part3Type = partType;
-                                      }
-                                  }
-                              }
-                              if (p4.length > 0) {
-                                  if (searchRange.test(p4)) {
-                                      if (Part2 === "") {
-                                          Part2 = p4;
-                                          p4 = "";
-                                          Part2Type = partType;
-                                      } else if (Part3 === "") {
-                                          Part3 = p4;
-                                          p4 = "";
-                                          Part3Type = partType;
-                                      } else { // Should never actually happen, but protects the data in case it does.
-                                          Part3 = Part3+", "+p4;
-                                          p4 = "";
-                                      }
-                                  }
-                              }
-                          }
-                         /***********************************************************
-                          * Numbers
-                          ***********************************************************/
-                          searchForType("^[\\d]+$", "Arabic", "");
-                         /***********************************************************
-                          * Spelled out numbers (if applicable for the language)
-                          ***********************************************************/
-                          if (ruleSet.numberWords.length > 0) {
-                              searchForType("^" + numberTextStrings + "$", "Spelled", "i");
-                          }
-                         /***********************************************************
-                          * Letters + Numbers
-                          ***********************************************************/
-                          searchForType("^[" + allFoldableChars + "\\d]+$", "Mixed", "i");
-                          if (Part1Type == "Mixed" && !new RegExp("\\d").test(Part1)) {
-                              Part1Type = "Letters";  // Avoid mismatch between Part 1a & 1b, Part A: The Subtitle, and Part A: 1b
-                          }
-                          if (Part2Type == "Mixed" && !new RegExp("\\d").test(Part2)) {
-                              Part2Type = "Letters";
-                          }
-                          if (Part3Type == "Mixed" && !new RegExp("\\d").test(Part3)) {
-                              Part3Type = "Letters";
-                          }
-                          if (typeof(Part1) == "undefined") {
-                              Part1 = "";
-                          }
-                          if (typeof(Part2) == "undefined") {
-                              Part2 = "";
-                          }
-                          if (typeof(Part3) == "undefined") {
-                              Part3 = "";
-                          }
-                          if (typeof(Part1Type) == "undefined") {
-                              Part1Type = "";
-                          }
-                          if (typeof(Part2Type) == "undefined") {
-                              Part2Type = "";
-                          }
-                          if (typeof(Part3Type) == "undefined") {
-                              Part3Type = "";
-                          }
-                         /***************************************************************************
-                          * Now to filter those into text to return.
-                          ***************************************************************************
-                          *      Part 1    Part 2   Part 3      Pt 1 Type     Pt 2 Type   Pt3 Type
-                          *    ---------------------------------------------------------------------
-                          *    |    1    |        |          |    Arabic    |           |          |
-                          *    |    X    |        |          |    Roman     |           |          |
-                          *    |    XI   |        |          |    Roman     |           |          |
-                          *    |    1B   |        |          |    Mixed     |           |          |
-                          *    |    3    |        |          |    Arabic    |           |          |
-                          *    |    B    |        |          |    Letters   |           |          |
-                          *    |    a    |        |          |    Letters   |           |          |
-                          *    |    II   |        |          |    Roman     |           |          |
-                          *    |    One  |        |          |    Spelled   |           |          |
-                          *    ---------------------------------------------------------------------
-                          *    |    1    |  2     |          |    Arabic    | Arabic    |          |
-                          *    |    1    |  3     |          |    Arabic    | Arabic    |          |
-                          *    |    a    |  B     |          |    Letters   | Letters   |          |
-                          *    |    A    |  B     |          |    Letters   | Letters   |          |
-                          *    |    I    |  II    |          |    Roman     |  Roman    |          |
-                          *    |    I    |  III   |          |    Roman     |  Roman    |          |
-                          *    |    One  |  Two   |          |    Spelled   | Spelled   |          |
-                          *    |    A    |  C     |          |    Letters   | Letters   |          |
-                          *    |    a    |  C     |          |    Letters   | Letters   |          |
-                          *    |    A    |  Bar   |          |    Letters   | Letters   |          |
-                          *    ---------------------------------------------------------------------
-                          *    |    1    |  Bar   |          |    Arabic    | Letters   |          |
-                          *    ---------------------------------------------------------------------
-                          *    |    1    |  2     |   3      |    Arabic    | Arabic    | Arabic   |
-                          *    |    1    |  3     |   5      |    Arabic    | Arabic    | Arabic   |
-                          *    |    a    |  B     |   C      |    Letters   | Letters   | Letters  |
-                          *    |    A    |  C     |   E      |    Letters   | Letters   | Letters  |
-                          *    |    I    |  III   |   V      |    Roman     |  Roman    | Roman    |
-                          *    |    One  |  Two   | Three    |    Spelled   | Spelled   | Spelled  |
-                          *    ---------------------------------------------------------------------
-                          *    |    II   |  the   | Subtitle |    Roman     | Letters   | Letters  |
-                          *    |    1    |  the   | Subtitle |    Arabic    | Letters   | Letters  |
-                          *    |    1    |  2     |  Live    |    Arabic    | Arabic    | Letters  |
-                          ***************************************************************************/
-                         /***********************************************************
-                          * testChronological: true if partA + 1 == partB, else false.
-                          ***********************************************************/
-                          var testChronological = function(partType, partA, partB) {
-                              switch (partType) {
-                                  case "Arabic":
-                                      if ((parseInt(partA, 10) + 1) == parseInt(partB, 10)) {
-                                          return true;
-                                      } else {
-                                          return false;
-                                      }
-                                      return false;
-                                  case "Roman":
-                                      if ((convertRomanToArabic(partA) + 1) == convertRomanToArabic(partB)) {
-                                          return true;
-                                      } else {
-                                          return false;
-                                      }
-                                      return false;
-                                  case "Spelled":
-                                      if ((jQuery.inArray(partA.toMusicBrainzLowerCase(), ruleSet.numberWords) + 1) == jQuery.inArray(partB.toMusicBrainzLowerCase(), ruleSet.numberWords)) {
-                                          return true;
-                                      }
-                                      return false;
-                                  case "Letters":
-                                      /* Note: This next check is not very Unicode friendly, but the second check at least avoids our accidentally */
-                                      /* possibly adding 1 to "B" and getting "A" as the next *higher* letter in sequence in various scripts.      */
-                                      if ((parseInt(partA.charCodeAt(partA.length-1), 10) + 1) == parseInt(partB.charCodeAt(partB.length-1), 10) && partA < partB) {
-                                          if (partA.length == partB.length) {
-                                              return true;
-                                          } else if (partA[0] == partB[0]) {
-                                              return true;
-                                          } else {
-                                              return false;
-                                          }
-                                      }
-                                      return false;
-                                  case "Mixed":
-                                      if (partA.slice(0,1) == partB.slice(0,1)) {
-                                          if (partA.length == partB.length) {
-                                              if (partA.length > 1) {
-                                                  var lenA, bitA, bitB;
-                                                  lenA = partA.length;
-                                                  if (lenA > 1) {  // Check for 2 byte character input.
-                                                      if (partA.slice(lenA-2,lenA-1).charCodeAt(0) >= NON_BMP_CHAR_CODES.BOTTOM && partA.slice(lenA-2,lenA-1).charCodeAt(0) <= NON_BMP_CHAR_CODES.TOP) {
-                                                          bitA = partA.slice(lenA-2,lenA);
-                                                          bitB = partB.slice(lenA-2,lenA);
-                                                      } else {
-                                                          bitA = partA.slice(lenA-1,lenA);
-                                                          bitB = partB.slice(lenA-1,lenA);
-                                                      }
-                                                  } else {
-                                                      bitA = partA.slice(lenA-1,lenA);
-                                                      bitB = partB.slice(lenA-1,lenA);
-                                                  }
-                                                  return testChronological("Letters", bitA, bitB);  // Even if it's a case ending in a number,  like
-                                                                                                    // A1, A2, the letters test will still work here.
-                                              } else {
-                                                  return true;  // Self-identification match - parts A & A should use &, not -.
-                                              }
-                                          }
-                                      }
-                                      return false;
-                                  default:
-                                      return false;
-                                }
-                          },
-                              fixCaps = function(str) {  // Turn variations on "a1a1a" into "A1A1a"
-                                if (new RegExp("\\d").test(str)) {
-                                    str = jQuery.trim(str.toMusicBrainzUpperCase())
-                                                .replace(/^((?:.+)?\d+)([^\d]+)$/i,
-                                                    function (str, sliceA, sliceB) {
-                                                         return sliceA + sliceB.toMusicBrainzLowerCase();
-                                                     }
-                                                );
-                                }
-                                          return str;
-                          },
-                              twoParts = function(spacer) {
-                              if (typeof(spacer) == "undefined") {
-                                  spacer = " ";
-                              }
-                              if (RangeBetweenOneTwo || RangeBetweenTwoThree) {
-                                  if (testChronological(Part1Type,Part1,Part2)) {  // Parts 1 & 2
-                                      return partString + "s " + Part1 + " & " + Part2;
-                                  } else { // Parts 1 - 3
-                                      return partString + "s " + Part1 + spacer + ruleSet.dashRange + spacer + Part2;
-                                  }
-                              } else {
-                                  return partString + "s " + Part1 + " & " + Part2;
-                              }
-                          },
-                              threeParts = function(partType, spacer) {
-                              if (typeof(spacer) == "undefined") {
-                                  spacer = " ";
-                              }
-                              if (RangeBetweenOneTwo) {
-                                  if (RangeBetweenTwoThree) {  // Parts 1 - 3 - 5 => Parts 1 - 5
-                                      return partString + "s " + Part1 + spacer + ruleSet.dashRange + spacer + Part3;
-                                  } else {
-                                      if (testChronological(partType,Part2,Part3)) {  // Parts 1 - 3, 4 => Parts 1 - 4
-                                          return partString + "s " + Part1 + spacer + ruleSet.dashRange + spacer + Part3;
-                                      } else {  // Parts 1 - 3, 5
-                                          return partString + "s " + Part1 + spacer + ruleSet.dashRange + spacer + Part2 + ", " + Part3;
-                                      }
-                                  }
-                              } else if (RangeBetweenTwoThree) {
-                                  if (testChronological(partType,Part1,Part2)) {  // Parts 1, 2 - 5 => // Parts 1 - 5
-                                      return partString + "s " + Part1 + spacer + ruleSet.dashRange + spacer + Part3;
-                                  } else {  // Parts 1, 3 - 5
-                                      return partString + "s " + Part1 + ", " + Part2 + spacer + ruleSet.dashRange + spacer + Part3;
-                                  }
-                              } else if (testChronological(partType,Part1,Part2)) {
-                                  if (testChronological(partType,Part2,Part3)) {  // Parts 1, 2, & 3 => Parts 1 - 3
-                                      return partString + "s " + Part1 + spacer + ruleSet.dashRange + spacer + Part3;
-                                  } else {  // Parts 1, 2, & 5
-                                      return partString + "s " + Part1 + ", " + Part2 + ", & " + Part3;
-                                  }
-                              } else {  // Parts 1, 3, & 5
-                                  return partString + "s " + Part1 + ", " + Part2 + ", & " + Part3;
-                              }
-                          },
-                          partString;
-                          if (beforepunct !== "") {
-                              partString = " Part";  // Avoid adding the comma to a case like Foo... - Part 3
-                          } else {
-                              partString = ", Part";
-                          }
-                          if (Part1Type == "Roman") {
-                              Part1 = Part1.toMusicBrainzUpperCase();
-                          }
-                          if (Part2Type == "Roman") {
-                              Part2 = Part2.toMusicBrainzUpperCase();
-                          }
-                          if (Part3Type == "Roman") {
-                              Part3 = Part3.toMusicBrainzUpperCase();
-                          }
-                          PartFilter:
-                          switch (Part1Type) {
-                              case "":  // Should never happen, but just in case
-                                 return str;  // If have still have no part number 1, then somehow a non-part "Part" slipped through, so simply return it.
-                              case "Arabic":
-                                  // Valid PartNumberStyle outputs for part numbers starting with an arabic number first part number are:
-                                  //     1: Part 1
-                                  //     2: Part 1 & 2
-                                  //     3: Part 1 - 3
-                                  //     4: Part 1 & 3
-                                  //     6: Part 1 - 3, 4
-                                  //     5: Part 1, 3 - 4
-                                  //     7: Part 1, 3 & 4
-                                  switch (Part2Type) {
-                                      case "":
-                                          if (Part3Type === "") { //  Part 1 is Arabic, Parts 2 and 3 are empty
-                                              partString = partString +  " " + Part1;  // Part 1
-                                              break PartFilter;
-                                          } else {
-                                              /* These next only might happen if the input was REALLY poor, such that      */
-                                              /* a one-word-only subtitle slipped into the p4 column, and if that one-word */
-                                              /* happened to also be a valid number type.                                  */
-                                                  partSubtitle = jQuery.trim(Part2 + " " + Part3 + " " + partSubtitle);
-                                                  partString = partString + " " + Part1;
-                                              break PartFilter;
-                                          }
-                                          break PartFilter;
-                                      case "Arabic":
-                                          switch (Part3Type) {
-                                              case "":  // Arabic, Arabic, empty
-                                                  partString = twoParts();
-                                                  break PartFilter;
-                                              case "Arabic":  // Arabic, Arabic, Arabic
-                                                  partString = threeParts(Part3Type);
-                                                  break PartFilter;
-                                              default:
-                                                  partSubtitle = jQuery.trim(Part3 + " " + partSubtitle);
-                                                  partString = twoParts();
-                                                  break PartFilter;
-                                          }
-                                          break PartFilter;
-                                     /* Anything for Part1Type = Arabic, but Part2Type and/or Part3Type != Arabic     *
-                                      * is not a valid Part number*s* formulation.  Combine Part2 and Part3, add them *
-                                      * to p4, and set that as the value for partSubtitle.                            *
-                                      * Note, not using partSubtitle directly, as it would inset an extra colon       *
-                                      * between Part3 and partSubtitle.                                               */
-                                      default:
-                                          partSubtitle = jQuery.trim(Part2 + " " + Part3 + " " + partSubtitle);
-                                          partString = partString + " " + Part1;
-                                          break PartFilter;
-                                  }
-                                  break PartFilter;
-                              case "Roman":
-                                  Part1 = Part1.toMusicBrainzUpperCase();
-                                  switch (Part2Type) {
-                                  // Valid PartNumberStyle outputs for part numbers starting with a Roman numeral first part number are:
-                                  //     1: Part I
-                                  //     2: Parts I & II
-                                  //     3: Parts I - III
-                                  //     4: Parts I & III
-                                  //     6: Parts I - III, V
-                                  //     5: Parts I, III - IV
-                                  //     7: Parts I, III & IV
-                                      case "":
-                                          if (Part3Type === "") {  //  Part 1 is Roman, Parts 2 and 3 are empty
-                                              partString = partString +  " " + Part1;  // Part 1
-                                              break PartFilter;
-                                          } else {
-                                              partSubtitle = jQuery.trim(Part2 + " " + Part3 + " " + partSubtitle);
-                                              partString = partString + " " + Part1;
-                                              break PartFilter;
-                                          }
-                                          break PartFilter;
-                                      case "Roman":
-                                          Part2 = Part2.toMusicBrainzUpperCase();
-                                          switch (Part3Type) {
-                                              case "":  // Roman, Roman, empty
-                                                  partString = twoParts();
-                                                  break PartFilter;
-                                              case "Roman":  // Roman, Roman, Roman
-                                                  Part3 = Part3.toMusicBrainzUpperCase();
-                                                  partString = threeParts(Part3Type);
-                                                  break PartFilter;
-                                              default:
-                                                  partSubtitle = jQuery.trim(Part3 + " " + partSubtitle);
-                                                  partString = twoParts();
-                                                  break PartFilter;
-                                          }
-                                          break PartFilter;
-                                     /* Anything for Part1Type = Roman, but Part2Type and/or Part3Type != Roman       *
-                                      * is not a valid Part number*s* formulation.  Combine Part2 and Part3, add them *
-                                      * to p4, and set that as the value for partSubtitle.                            *
-                                      * Note, not using partSubtitle directly, as it would inset an extra colon       *
-                                      * between Part3 and partSubtitle.                                               */
-                                      default:
-                                          partSubtitle = jQuery.trim(Part2 + " " + Part3 + " " + partSubtitle);
-                                          partString = partString + " " + Part1;
-                                          break PartFilter;
-                                  }
-                                  break PartFilter;
-                              case "Letters":
-                                      Part1 = Part1.toMusicBrainzUpperCase();
-                                      if (Part2Type == "Letters") {
-                                          switch (Part3Type) {
-                                          case "":
-                                              // Letters, Letters, empty
-                                              if (Part1.length == Part2.length) { // Part A The should become Part A: The, not Parts A & The
-                                                  Part2 = Part2.toMusicBrainzUpperCase();
-                                                  partString = twoParts();
-                                                  break PartFilter;
-                                              } else {
-                                                  partSubtitle = jQuery.trim(Part2 + " " + partSubtitle);
-                                                  partString = partString + " " + Part1;
-                                                  break PartFilter;
-                                              }
-                                              break PartFilter;
-                                          case "Letters":
-                                              // Letters, Letters, Letters
-                                              if (Part1.length == Part2.length) { // Part A The Foo should become Part A: The Foo, not Parts A, The, & Foo
-                                                  Part2 = Part2.toMusicBrainzUpperCase();
-                                                  if (Part1.length != Part3.length) { // Part A B The should become Parts A & B: The, not Parts A, B & The
-                                                      partString = twoParts();
-                                                      partSubtitle = jQuery.trim(Part3 + " " + partSubtitle);
-                                                      break PartFilter;
-                                                  } else { // Parts A, B, & D or Parts A, B & C --> Parts A - C
-                                                      Part3 = Part3.toMusicBrainzUpperCase();
-                                                      partString = threeParts(Part3Type);
-                                                      break PartFilter;
-                                                  }
-                                              } else {
-                                                  partSubtitle = jQuery.trim(Part2 + " " + Part3 + " " + partSubtitle);
-                                                  partString = partString + " " + Part1;
-                                                  break PartFilter;
-                                              }
-                                              break PartFilter;
-                                          default:
-                                              partSubtitle = jQuery.trim(Part2 + " " + Part3 + " " + partSubtitle);
-                                              partString = partString + " " + Part1;
-                                              break PartFilter;
-                                          }
-                                      } else {
-                                         /* Anything for Part1Type = Letters, but Part2Type and/or Part3Type != Letters   *
-                                          * is not a valid Part number*s* formulation.  Combine Part2 and Part3, add them *
-                                          * to p4, and set that as the value for partSubtitle.                            *
-                                          * Note, not using partSubtitle directly, as it would inset an extra colon       *
-                                          * between Part3 and partSubtitle.                                               */
-                                          partSubtitle = jQuery.trim(Part2 + " " + Part3 + " " + partSubtitle);
-                                          partString = partString + " " + Part1;
-                                          break PartFilter;
-                                      }
-                                      break PartFilter;
-                              case "Spelled":
-                                  switch (Part2Type) {
-                                      case "":
-                                          if (Part3Type === "") {  //   Spelled, empty, empty
-                                              partString = partString +  " " + Part1;  // Part 1
-                                              break PartFilter;
-                                          } else {
-                                              partSubtitle = jQuery.trim(Part3 + " " + partSubtitle);
-                                              partString = partString + " " + Part1;
-                                              break PartFilter;
-                                          }
-                                          break PartFilter;
-                                      case "Spelled":
-                                          switch (Part3Type) {
-                                              case "":
-                                                  partString = twoParts();
-                                                  break PartFilter;
-                                              case "Spelled":
-                                                  partString = threeParts(Part3Type);
-                                                  break PartFilter;
-                                              default:
-                                                  partSubtitle = jQuery.trim(Part3 + " " + partSubtitle);
-                                                  partString = twoParts();
-                                                  break PartFilter;
-                                          }
-                                          break PartFilter;
-                                     /* Anything for Part1Type = Spelled, but Part2Type and/or Part3Type != Spelled   *
-                                      * is not a valid Part number*s* formulation.  Combine Part2 and Part3, add them *
-                                      * to p4, and set that as the value for partSubtitle.                            *
-                                      * Note, not using partSubtitle directly, as it would inset an extra colon       *
-                                      * between Part3 and partSubtitle.                                               */
-                                      default:
-                                          partSubtitle = jQuery.trim(Part2 + " " + Part3 + " " + partSubtitle);
-                                          partString = partString + " " + Part1;
-                                          break PartFilter;
-                                  }
-                                  break PartFilter;
-                              case "Mixed":
-                                  Part1 = fixCaps(Part1);
-                                  switch (Part2Type) {
-                                      case "":
-                                          if (Part3Type === "") {  //  Part 1 is mixed, Parts 2 and 3 are empty
-                                              partString = partString +  " " + Part1;  // Part 1
-                                              break PartFilter;
-                                          } else {
-                                              partSubtitle = jQuery.trim(Part2 + " " + Part3 + " " + partSubtitle);
-                                              partString = partString + " " + Part1;
-                                              break PartFilter;
-                                          }
-                                          break PartFilter;
-                                      case "Arabic":
-                                      case "Mixed":
-                                          if (!new RegExp("\\d").test(Part3)) {
-                                              Part3Type = "Letters";  // We check for Mixed type before we check for Letters type - avoid 
-                                          }                           // a mis-match on Parts 1a 1b The Subtitle
-                                          Part2 = fixCaps(Part2);
-                                          switch (Part3Type) {
-                                              case "":
-                                                  partString = twoParts();
-                                                  break PartFilter;
-                                              case "Arabic":   // Parts 1a, 1b, & 3
-                                              case "Mixed":    // Parts 1a, 1b, & 1d
-                                                  Part3 = fixCaps(Part3);
-                                                  partString = threeParts(Part3Type);
-                                                  break PartFilter;
-                                              default:
-                                                  Part2 = fixCaps(Part2);
-                                                  partSubtitle = jQuery.trim(Part3 + " " + partSubtitle);
-                                                  partString = twoParts();
-                                                  break PartFilter;
-                                          }
-                                          break PartFilter;
-                                      default:
-                                          Part1 = fixCaps(Part1);
-                                          partSubtitle = jQuery.trim(Part2 + " " + Part3 + " " + partSubtitle);
-                                          partString = partString + " " + Part1;
-                                          break PartFilter;
-                                  }
-                                  break PartFilter;
-                          }
-                          partSubtitle = jQuery.trim(jQuery.trim(partSubtitle) + " " + p5).replace(/^\s*[\-‐]+\s*/,"");
-                          partSubtitle = jQuery.trim(partSubtitle).replace(/^:[\s\‐]*/,"");
-                          if (partSubtitle !== "") {
-                              if (partSubtitle.slice(0,1) == "/") {
-                                  partString += " " + partSubtitle;
-                              } else  {
-                                  if (partSubtitle.length > 1) {
-                                      if (partSubtitle.slice(0,2) == "\uDBC0\uDC01") {
-                                          partString += " " + partSubtitle;
-                                      } else if (partString.charCodeAt(0) >= NON_BMP_CHAR_CODES.BOTTOM && partString.charCodeAt(0) <= NON_BMP_CHAR_CODES.TOP) { 
-                                          partString += titleCaseString(partSubtitle.slice(0,2)) + partSubtitle.slice(2);
-                                      } else {
-                                          partString += ": " + titleCaseString(partSubtitle.slice(0,1)) + partSubtitle.slice(1);
-                                      }
-                                  } else {
-                                      partString += ": " + titleCaseString(partSubtitle.slice(0,1));
-                                  }
-                                  partString = partString.replace(": :",":");
-                              }        // Capitalize the first word of the subtitle, in case it wasn't already (words like "the"), and get rid
-                          }            // of the duplicated colon, if there is one.  (In case one got caught in p5, plus the one we just added.)
-                          partString = jQuery.trim(partString.replace(/\s\s/g," "))
-                                             .replace(/:\s\//,"/");  // Slash separators were protected, but still had the colon added.  Remove it.
-                          if (beforepunct == ":") {  // Ticket 1518
-                              return ", " + partString;
-                          } else {
-                              return beforepunct + " " + partString;
-                          }
-                     }
-                );
-            /* ---------------------------------------------------------------------*/
-            /* Remove the comma before Part or Volume, if it would be right after   */
-            /* other punctuation marks.  Also remove hyphen between that            */
-            /* and Part or Volume, if present.                                      */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(new RegExp("([" + AllPunctuation + "]),\\s(Part|Volume)", "g"),"$1 $2")
-                                               .replace(new RegExp("([" + AllPunctuation + "])\\s?(?:\\-|\\–|\\‐)\\s?(Part|Volume)", "g"),"$1 $2")
-                                               .replace(/\s\sPart/,", Part")  // Add the comma back in - gets lost in the above line for cases like This Is a Song - (Parts 1 2): The Subtitle
-            /* ---------------------------------------------------------------------*/
-            /* Remove the any punctuation that slipped in before the                */
-            /* part : subtitle colon separator.                                     */
-            /* ---------------------------------------------------------------------*/
-                                               .replace(new RegExp("([" + AllPunctuation + "])+:", "g"),":");
-            /* ---------------------------------------------------------------------*/
-            /* DiscNumberStyle.                                                     */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/\(cd(\d)/i,"(cd $1")  // Safer to do this than to try and catch it in the big regexp,
-                                               .replace(/\s(cd)\s?(\d)/gi," disc $2") // where removing this \/ \b would also then catch (disco)
-                                               .replace(new RegExp("\\b\\,?(\\s)?[\\(\\[]?(bonus\\s)?(?:(?:dis(?:c|k))|(?:cd))(?:(?:\\b:?\\s?([" + allFoldableChars + "\\d]+):?(?:\\s(.+))?[\\)\\]]?)|$)", "i"),
-                                                   function(str, p1, p2, p3, p4) {
-                                                       if (!isNaN(parseInt(p3, 10))) { // Strip leading zeros
-                                                           p3 = parseInt(p3, 10);
-                                                       }
-                                                       var tempString;
-                                                       if (typeof(p4) !== "undefined") {
-                                                           tempString = p4.replace(/[\(\)\[\]]/g, "");
-                                                           if (p4.length > 1) {
-                                                               tempString = titleCaseString(tempString);
-                                                           }
-                                                       }
-                                                       if (jQuery.trim(p2) == "Bonus" || jQuery.trim(p2) == "bonus") {
-                                                           var bonusName = jQuery.trim(p3 + " " + tempString);
-                                                           if (bonusName.length > 0) {  // The bonus disc has a title
-                                                               return p1 + "(bonus disc: " + bonusName + ")";
-                                                           } else {  // The bonus disc has no title
-                                                               return p1 + "(bonus disc)";
-                                                           }
-                                                       } else {
-                                                           if (p4 === "" || typeof(tempString) == "undefined") { // The disc has no title
-                                                               return p1 + "(disc " + p3 + ")";
-                                                           } else {  // The disc has a title
-                                                               return p1 + "(disc " + p3 + ": " + tempString + ")";
-                                                           }
-                                                       }
-                                                   }
-            ).replace(/:?\s+\(\s?\(/g," (").replace(/\s\)/g,")");
-            /* ---------------------------------------------------------------------*/
-            /* BoxSetStyle.                                                         */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/\,?(?:\s)?[\(\[]?box\s(\d+)[\:\,\s](.+)?\(/i,
-                function(str, p1, p2) {
-                    if (typeof(p2) === "undefined" || p2 === "" || p2 === " ") {
-                        return " (box "+p1+", ";
-                    } else {
-                        return " (box "+p1+": "+p2+", ";
-                    }
-                }
-            );
-            stringBeingFixed = stringBeingFixed.replace(/\s\,/,",");
-            /* ---------------------------------------------------------------------*/
-            /* Uppercase x's in date placeholders.                                  */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/(\d[\dx]{3}(?:-[\dx]{2}){2})/gi,
-                function(str,p1) {
-                    return p1.toMusicBrainzUpperCase();
-                }
-            );
-            /* ---------------------------------------------------------------------*/
-            /* Fix commonly misspelled musical terms.                               */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/(\b)[\s,]+(Op|Opus)[\s\.#]+($|\b)/i, ", Op. " ) // Opus
-                                               .replace("accoustic","acoustic")
-            /* Don't include # in the next regexp - it causes too many negative side effects. */
-                                               .replace(/\,?\s+(?:no\.|Nᵒ|№|n|num|nr)[\s\.]+(\d+)/gi, ", "+ruleSet.numberAbbreviation+" $1" ) // Number
-                                               .replace(/(\s|\()([A-H])(b|#|\sflat|\ssharp)(?:\s(major|minor)|\))/i,
-                function(str, p1, p2, p3, p4) {
-                    p2 = p2.toMusicBrainzUpperCase();
-                    if (p3 == "b" || p3 == " Flat") {
-                        return " "+p2+"-flat "+p4;
-                    } else {
-                        return " "+p2+"-sharp "+p4;
-                    }
-                }
-            );
-            /* ---------------------------------------------------------------------*/
-            /* Remove useless ExtraTitleInformation.                                */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/[\(\[]?bonus(\s+track)?s?\s*[\)\]]?$/i,"")
-                                               .replace(/[\(\[]?(previously\s)?unreleaseds?\s*[\)\]]?$/i,"")
-                                               .replace(/[\(\[]?secret(\s+track)?s?\s*[\)\]]?$/i,"")
-                                               .replace(/[\(\[]?hidden(\s+track)?s?\s*[\)\]]?$/i,"")
-                                               .replace(/[\(\[]?retail(\s+version)?\s*[\)\]]?$/i,"")
-                                               .replace(/[\(\[]?encores?\s*[\)\]]?$/i,"");
-            /* ---------------------------------------------------------------------*/
-            /* Lowercase roles.                                                     */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(new RegExp("(\\(.*)" + ruleSet.roleWords + ":\\s?", "ig"),
-                function(all, prior, word) {
-                    return prior + word.toMusicBrainzLowerCase() + ": ";
-                }
-             );
-
-            /* ---------------------------------------------------------------------*
-            * Handle "Live". 
-            * This next bit is a bit confusing.  It uses a statistical analysis
-            * based on a January 2009 dump of every single track with "Live" at the
-            * end of the title, breaking it into three categories:
-            * 1) "Live" is correct (non-ETI)
-            * 2) "Live" is a misspelling for "Life" or "Lives" (quite many of these!)
-            * 3) "Live" is ETI.
-            * This next bit captures all of #1 and #2, protects #1 and fixes #2
-            * before running the ETI section.  Then after the ETI section,
-            * we unprotect those in #1.  Testing this against the entire database,
-            * applicable section of the database, it had not a single mismatch.
-            * ---------------------------------------------------------------------*
-            * Patterns fitting #1:
-            *  & let live
-            *  & live
-            *  and let live
-            *  and live
-            *  as i live
-            *  broadcasting live
-            *  but live
-            *  can't live
-            *  foo's live
-            *  gonna live
-            *  gotta live
-            *  he won't live
-            *  i live
-            *  i'll live
-            *  is live
-            *  let me live
-            *  let's live
-            *  lets live
-            *  live, live
-            *  saturday night live
-            *  shall live
-            *  she won't live
-            *  ta live
-            *  that they may live
-            *  then you live
-            *  they live
-            *  to live
-            *  wanna live
-            *  want to live
-            *  we live
-            *  what they live
-            *  where i live
-            *  where u live
-            *  where you live
-            *  you never live
-            * 
-            * Patterns fitting #2 (or somehow otherwise misspelled):
-            *  all my live
-            *  for your live
-            *  goes my live
-            *  in my live
-            *  it's my live
-            *  livin' my live
-            *  living my live
-            *  of live
-            *  of my live
-            *  of our live
-            *  road of live
-            *  saturday nights' live
-            *  saturday nite live
-            *  save a live
-            *  saved my live
-            *  the good live
-            *  want from live
-            *  your live
-            * ---------------------------------------------------------------------*
-            * Fix #2 issues first:
-            * ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/\s((?:all\smy|for\syour|goes\smy|i(?:t\'s|n)\smy|livin[\'g]\smy|of(?:\s(?:my|our))?|road\sof|sa(?:turday\sni(?:ghts\'|te)|ve(?:\sa|d\smy))|the\sgood|want\sfrom|your))\slive($|\s\/|\s\()/gi,
-                function(str, p1, p2) {
-                    switch (p1.toLowerCase()) {
-                        case "of our":
-                            return " " + p1 + " Lives" + p2;
-                        case "saturday nights' live":
-                        case "saturday nite live":
-                            return " Saturday Night Live" + p2;
-                        default:
-                            return " " + p1 + " Life" + p2;
-                    }
-                }
-            );
-           /* ---------------------------------------------------------------------*
-            * Now protect those in #1.
-            * ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/\s((?:&(?:\slet)?|a(?:nd(?:\slet)?|s\si)|b(?:roadcasting|ut)|can\'t|foo\'s|go(?:nn|tt)a|he\swon\'t|i(?:\'ll|s)?|let(?:\sme|\'s|s)|s(?:aturday\snight|h(?:all|e\swon\'t))|t(?:h(?:at\sthey\smay|e(?:n\syou|y))|[ao])|w(?:an(?:na|t\sto)|h(?:at\sthey|ere\s(?:you|[iu]))|e)|you\snever)|live,)\slive($|\s\/|\s\()/gi, " $1 \uDBC0\uDC10 $2");
-            stringBeingFixed = stringBeingFixed.replace(/^Live$/,"\uDBC0\uDC10");  // Live as 1-word title of a track
-           /* ---------------------------------------------------------------------*
-            * And strip punctuation crud that typically preceeds ETI Live.
-            * ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/(([,-\/]\s?|→+|-+)l|\.L)ive$/," Live");
-            /* --------------------------------------------------------------------------------------- */
-            /* ExtraTitleInformationStyle.                                                             */
-            /* --------------------------------------------------------------------------------------- */
-            /* The only case which should still be missed is one that cannot be done programmatically, */
-            /* as we don't know where the artist's name ends and the other ExtraTitleInfo begins:      */
-            /* "Blah Ft. Erroll Flynn Some Remixname Remix" should become                              */
-            /* "Blah (feat. Erroll Flynn) (Some remix Name) (remix)", but the best we can do is        */
-            /* "Blah (feat. Erroll Flynn Some remix Name) (remix)".                                    */
-            /* *****************************************************************************************/
-            /* Create a new var stringInProgress.                                                      */
-            /* ----------------------------------------------------------------------------------------*/
-            /* Start with       Foo (bar) (baz) bap tim (bit) boo bum / Fuz (fam)                      */
-            /* ----------------------------------------------------------------------------------------*/
-            /* Split on /       Foo (bar) (baz) bap tim (bit) boo bum => stringPieces[0]               */
-            /* ----------------------------------------------------------------------------------------*/
-            /* For each in stringPieces[], create a new array stringBits[].                            */
-            /* ----------------------------------------------------------------------------------------*/
-            /* Split on (       Foo |bar) |baz) bap tim |bit) boo bum => stringBits[]                  */
-            /* ----------------------------------------------------------------------------------------*/
-            /* For each in stringBits[], create a new array spaceBits[].                               */
-            /* ----------------------------------------------------------------------------------------*/
-            /* Split on space:  Foo   stringPieces[0] stringBits[0] spaceBits[0]                       */
-            /*                  bar)  stringPieces[0] stringBits[1] spaceBits[0]                       */
-            /*                  baz)  stringPieces[0] stringBits[2] spaceBits[0]                       */
-            /*                  bap   stringPieces[0] stringBits[2] spaceBits[1]                       */
-            /*                  tim   stringPieces[0] stringBits[2] spaceBits[2]                       */
-            /*                  bit)  stringPieces[0] stringBits[3] spaceBits[0]                       */
-            /*                  boo   stringPieces[0] stringBits[3] spaceBits[1]                       */
-            /*                  bum   stringPieces[0] stringBits[3] spaceBits[2]                       */
-            /*                  Fuz   stringPieces[1] stringBits[0] spaceBits[0]                       */
-            /*                  fam)  stringPieces[1] stringBits[1] spaceBits[0]                       */
-            /* ----------------------------------------------------------------------------------------*/
-            /* Create a new array etiBits[].                                                           */
-            /* ----------------------------------------------------------------------------------------*/
-            /* Walk through stringPieces[], starting from 0 and moving up.                             */
-            /* Walk through stringBits[], starting from 0 and moving up.                               */
-            /* Walk through spaceBits[], starting from the top and moving down to 0.                   */
-            /* If the word does not end in a ), as long as the word in spaceBits[n] is an              */
-            /* ExtraTitleInformation word, pop it from spaceBits[] and push it into etiBits[].         */
-            /* When spaceBits[n] contains a word not in the ExtraTitleInformation list, stop.          */
-            /* ----------------------------------------------------------------------------------------*/
-            /* If spaceBits.length > 0, append it to stringInProgress.                                 */
-            /* ----------------------------------------------------------------------------------------*/
-            /* Now, if etiBits.length > 0, reverse() etiBits[], then .join(" ") it.                    */
-            /* Then wrap it in () and append it to stringInProgress.                                   */
-            /* ----------------------------------------------------------------------------------------*/
-            /* Set stringBeingFixed equal to the newly built stringInProgress string.                  */
-            /* *****************************************************************************************/
-            stringBeingFixed = stringBeingFixed.replace(/(takes?)\s?(\d+)/gi,"$1$2"); // turn it into a single word, for the moment
-            /* Use etiRemixerNames for compound words, like remixer names.  (Don't forget to add a bit down below to reverse it!)  */
-            var etiRemixerNames = "a cappella|bonus beats|armand van helden|dirty south|ferry corsten|flip & fill|paul oakenfield",
-                etiRemixers = etiRemixerNames.replace(/\s/g,""),
-                /* Use notAloneETIWords for words that only appear if other ETI words from extraTitleInformationWords follow them. */
-                notAloneETIWords = "dance|dialogue|disco|clean|extract|house|long|original|radio|short|studio|video|take|club",
-                extraTitleInformationWords = "(acoustic|airplay|album|alternative|bonus|clubmix|composition|compositions|cut|" +
-                                              "cuts|demo|demos|dirty|dub|dubs|edit|edits|excerpt|excerpts|extended|feat.|instrumental|" +
-                                              "interlude|interludes|intro|karaoke|live|main|maxi|medley|megamix|megamixes|mix|mixes|" +
-                                              "orchestral|outro|outtake|outtakes|re-edit|re-edited|re-edits|rehearsal|reinterpreted|" +
-                                              "reinterpretation|reinterpretations|remake|remakes|remix|remixes|remixed|reprise|reprises|" +
-                                              "rework|reworked|session|sessions|single|skit|skits|unplugged|version|versions|vocal|vs.|" +
-                                              '12"|10"|7"|incomplete|interrupted|traditional|loop|interview|' +
-                                              "takes?\\d+|" + notAloneETIWords + "|" + etiRemixers + "|" + ruleSet.extraTitleInfoWords,
-                compoundETIWords = "(" + notAloneETIWords + ")";
-                /* Prep the string for etiRemixerNames listings. */
-                stringBeingFixed = stringBeingFixed.replace(new RegExp("(\\b|^|\\s|\\()(" + etiRemixerNames.replace(/\s/g,"\\s") + ")(\\b|$|\\s|\\))", "gi"),
-                                                   function(str, p1, p2, p3) {
-                                                       return p1+p2.toMusicBrainzLowerCase().replace(/\s/g,"")+p3;
-                                                   }
-                                               );
-            var wordsToMatch = new RegExp("^"+extraTitleInformationWords+"(?:\\)|$)", "i"),
-                stringInProgress = "",
-                stringPieces = stringBeingFixed.split("/");
-            jQuery.each(stringPieces, function(i) {
-                var stringBits = jQuery.trim(stringPieces[i]).split("(");
-                jQuery.each(stringBits, function(j) {
-                    var spaceBits = jQuery.trim(stringBits[j]).split(" "),
-                        etiBits = [];
-                    for (var y = spaceBits.length-1; y > -1; y--) {
-                        if (spaceBits[y].charAt(spaceBits[y].length-1) != ")" && wordsToMatch.test(spaceBits[y])) {  // Word is ETI and we're not inside another ()
-                            etiBits.push(spaceBits.pop());
-                        } else {
-                            break;
-                        }
-                    }
-                    if (j > 0) {
-                        stringInProgress += " (";  // Add back the parentheses
-                    }
-                    if (spaceBits.length > 0) {  // Put the non ETI part back together.
-                        var inETI = false,
-                            lastWord = spaceBits[spaceBits.length-1],
-                            nonETIString = "";
-                        if (lastWord.charAt(lastWord.length-1) == ")" && wordsToMatch.test(spaceBits[y])) {  // Fix that final "ETIword)" that was already in ().
-                            spaceBits[spaceBits.length-1] = lastWord.toMusicBrainzLowerCase();
-                            inETI = true;
-                        }
-                        if (spaceBits.length > 0) {  // If the entire track title section was not wrapped in a () to begin with.
-                            nonETIString = spaceBits.join(" ")  // Add it to stringInProgress.
-                                                    .replace(/\sfeat\.\s(.+)/i,
-                                                        function(str, p1) {
-                                                            return " (feat. "+p1+")";
-                                                        }
-                                                    );
-                        }
-                        if (!inETI) { // TitleCaps-style
-                            if (ruleSet.changeCapitalization) {
-                                nonETIString = nonETIString.replace(/\bacappella\b/gi,"A Cappella"); // Turn it back into two words (non-ETI)
-                            } else {  // Sentence-style
-                                nonETIString = nonETIString.replace(/\bacappella\b/gi,"a cappella"); // Turn it back into two words (ETI)
-                            }
-                        } else {
-                                nonETIString = nonETIString.replace(/\bacappella\b/gi,"a cappella"); // Turn it back into two words (ETI)
-                        }
-                        stringInProgress += nonETIString.replace(/bonusbeats/gi,"Bonus Beats"); // Turn it back into 2 words. - bonus beats
-                    }
-                    if (etiBits.length > 0) {  // Put the ETI part back together.
-                        etiBits.reverse();     // We were pushing into the array while working backwards. Reverse the array to put the words back in the right order.
-                        var tempHolder = " (" + etiBits.join(" ")  // Add it to stringInProgress.
-                                                          .replace(/\bacappella\b/gi,"a cappella") // Turn it back into two words
-                                                          .replace(/bonusbeats/gi,"bonus beats") // Turn it back into 2 words. - bonus beats
-                                                          .toMusicBrainzLowerCase();  // And lowercase all the ETI.
-                        if (j == (stringBits.length-1)) {
-                            tempHolder += ")";
-                        }
-                        stringInProgress += tempHolder;
-                    }
-                });
-                if (i != (stringPieces.length-1)) {
-                    stringInProgress += " / ";  // Add back the slash
-                }
-            });
-            stringBeingFixed = stringInProgress.replace(/([\b\s\(])(\d+)\"\)/,'$1$2" mix)') // Don't leave vinyl types dangling as (12")
-                                               .replace(/\(\)/g,"") // "Foo (" becomes "Foo ()" - get rid of the empty ().
-                                               .replace(/(?:\-|\‐)(acoustic|electric|Acoustic|Electric)(?:\-|\‐)/gi,
-                                                   function (str,p1) {
-                                                       return " ("+p1.toMusicBrainzLowerCase()+")";
-                                                   }
-                                               )
-                                               /* Lowercase ETI words right up against a (. (Fixes those which were  */
-                                               /* already in (), and thus got handled as if nonETI above.)           */
-                                               .replace(new RegExp("(\\(" + extraTitleInformationWords + "[\\s\\)])", "gi"),
-                                                   function(str, p1) {
-                                                       return p1.toMusicBrainzLowerCase();
-                                                   }
-                                               );
-
-//            stringBeingFixed = stringBeingFixed.replace("\\(([" + allFoldableChars + "])",
-  //              function(str, p1) {
-    //                return "(" + p1.toMusicBrainzUpperCase();
-      //          }
-        //    );
-
-            if (ruleSet.changeCapitalization) {
-                stringBeingFixed = stringBeingFixed.replace(new RegExp(compoundETIWords + "\\s(?!" + extraTitleInformationWords + ")", "gi"),
-                    function(str, p1, p2) {
-                        return p1.substr(0, 1).toMusicBrainzUpperCase() + p1.substr(1) + " " + p2;  // Titlecase ETI compound words if not followed by another ETI word
-                    }
-                );
-//.replace(new RegExp(compoundETIWords + "\\s" + extraTitleInformationWords, "gi"),
-  //                  function(str, p1, p2) {
-    //                    return p1.toMusicBrainzLowerCase() + " " + p2;  // lowercase ETI compound words that are ETI if not followed by another ETI word
-      //              }
-        //        );
-            }
-            stringBeingFixed = stringBeingFixed.replace(/\(A\sCappella\)\svs\./g, "(a cappella) vs.")  // Treat vs. as a sentence split for A Cappella
-                                               .replace(/\(feat\./gi, "(feat.")  // Don't capitalize feat.'s that already had () around them...
-                                               .replace(/\(a\scappella\s\(/gi, "A Cappella (")  // Fix (a cappella (
-                                               .replace(/\s(7|10|12)\"\s/gi, ' ($1" ')  // Fix 7/10/12" remix) (paren on the right, but not on the left, in original input)
-                                               .replace(/\(remix/gi, "(remix")  // ...same for Remixes that already had () around them.
-                                               .replace(/\((and|$)\)/gi, "$1")  // "and" isn't ETI when by itself.
-                                               .replace(/\(megamix(es)?\)/gi, "Megamix$1")  // Megamix isn't ETI when by itself.
-                                               .replace(/\(session(s)?\)/gi, "Session$1")  // Session(s) isn't ETI when by itself.
-                                               .replace(/\(composition(s)?\)/gi, "Composition$1")  // Composition(s) isn't ETI when by itself.
-                                               .replace(/(\((?:dance\s?)+\))$/gi,  // Dance isn't ETI when by itself.
-                                                   function (str, p1) {
-                                                       return p1.replace(/dance/g,"Dance").replace(/[\(\)]/g,"");
-                                                   }
-                                               ).replace(/\(dance\s\(/gi,"Dance (")
-                                               .replace(/\)\)/g, ")")
-                                               .replace(new RegExp("(\\b|^|\\s|\\()(" + etiRemixers + ")(\\b|$|\\s|\\))", "gi"),
-                                                   function(str, p1, p2, p3) {
-                                                       switch(p2) {
-                                                           case "armandvanhelden" : return p1+"Armand van Helden"+p3;
-                                                           case "dirtysouth"      : return p1+"Dirty South"+p3;
-                                                           case "ferrycorsten"    : return p1+"Ferry Corsten"+p3;
-                                                           case "flip&fill"       : return p1+"Flip & Fill"+p3;
-                                                           case "pauloakenfold"   : return p1+"Paul Oakenfield"+p3;
-                                                           default                : return p1+p2+p3;
-                                                       }
-                                                   }
-                                               )
-                                               .replace(/(takes?)(\d+)/gi,"$1 $2")    // Re-space the number.
-                                               .replace("Oc (remix)", "OC ReMix")    // Fix OC ReMixes
-                                               .replace("Encore (live)", "(live encore)")    // Fix word order
-                                               .replace(/\(\s\(/gi, "(")  // '( (' -> '(' Happens if the entire title was ETI and wrapped in () to begin with.
-                                               .replace(/(\([^\)]+)\s\(feat\./g,"$1 feat.")  //  Don't add extra ('s before feat. if the feat. is already inside a ().
-                                               .replace(new RegExp("\\b" + ruleSet.lowerCaseWordsEndWords +  // fix lowerCaseWordsEndWords.  (Now I've Come *O*n, I'll Go)
-                                                        "(\\" + ruleSet.sentenceEndingPunctuation.join("|\\") + "|,|$)", "ig"),
-                                                        function (str, p1, p2) {
-                                                            return titleCaseString(p1) + p2;
-                                                        }
-                                                    ).replace(new RegExp("(\\" + ruleSet.sentenceEndingPunctuation.join("|\\") + "|,|$)\\s" + 
-                                                        ruleSet.lowerCaseWordsEndWords + "\\b", "ig"),  // fix lowerCaseWordsEndWords.   (Now I've Come, *O*n I'll Go)
-                                                        function (str, p1, p2) {
-                                                            return p1 + " " + titleCaseString(p2);
-                                                        }
-                                                    ).replace(new RegExp("\\b" + ruleSet.lowerCaseWordsEndWords +  // fix lowerCaseWordsEndWords.  (Now I've Come *O*n and I'll Go)
-                                                        "\\s(and|&|or|vs.)", "ig"),
-                                                        function (str, p1, p2) {
-                                                            return titleCaseString(p1) + " " + p2;
-                                                        }
-                                                    );
-           /* ---------------------------------------------------------------------*
-            * Now unprotect those in "Live" group #1.
-            * ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/\uDBC0\uDC10/g, "Live");
-            /* ---------------------------------------------------------------------*/
-            /* Warn about "incl."                                                   */
-            /* ---------------------------------------------------------------------*/
-            if (new RegExp("Incl.", "i").test(stringBeingFixed)) {
-                storeError(text.including, type, number);
-            }
-            /* ---------------------------------------------------------------------*/
-            /* Warn about covers.                                                   */
-            /* ---------------------------------------------------------------------*/
-            if (new RegExp("Cover\\)", "i").test(stringBeingFixed)) {
-                storeError(text.covers, type, number);
-            }
-            /* ---------------------------------------------------------------------*/
-            /* Fix the Netherlands.                                                 */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/,\sthe\snetherlands/i, ", The Netherlands");
-            /* ---------------------------------------------------------------------*/
-            /* A-flat and A-sharp are not the word A.                               */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/a(.Flat|Sharp)/,"A$1")
-                                               .replace(/in\sa\,/,"in A,");
-            /* ---------------------------------------------------------------------*/
-            /* -flat and -sharp should always be lowercase.                         */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/(\-|\‐)sharp/gi,"$1sharp")
-                                               .replace(/(\-|\‐)flat/gi,"$1flat");
-            /* ---------------------------------------------------------------------*/
-            /* Remove times trapped in the track title.                             */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/\((\d{1,2})\:\s?(\d{2})\)$/,
-                function (str,p1,p2) {
-                    storeError(text.timeRemoved+" "+p1+":"+p2, type, number);
-                    return "";
-                }
-            );
-            /* ---------------------------------------------------------------------*/
-            /* Remove years included at the end of the track title.                 */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/\(((?:19|20)\d{2})\)$/,
-                function (str,p1) {
-                    storeError(text.yearIncludedA+" ("+p1+") "+text.yearIncludedB, type, number);
-                    return "";
-                }
-            );
-            /* ---------------------------------------------------------------------*/
-            /* Remove extra space between doubled periods.                          */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/\.\s\./g,"..");
-            /* ---------------------------------------------------------------------*/
-            /* Fix square bracketed cases - ending [remix], [mix] and [feat. Foo].  */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/\[\sRemix\]$/,"(remix)")
-                                               .replace(/\[\sMix\]$/,"(mix)")
-                                               .replace(/\[\s\(feat\.(.+)\]\)/,"(feat.$1)");
-            /* ---------------------------------------------------------------------*/
-            /* Various other cleanup.                                               */
-            /* ---------------------------------------------------------------------*/
-            stringBeingFixed = stringBeingFixed.replace(/(\s(\-|\‐|\:)|(\-|\‐|\:)\s)\s\(/," (")  // foo: (bar) and foo - live
-                                               .replace(/(Symphony|Concerto),/g,"$1") // Symphony No. 1, not Symphony, No. 1
-                                               .replace(/[\/:](?:\s+)?$/,"") // Trailing / and :
-                                               .replace(/:\s\(/g," (") // Foo: (Bar
-                                               .replace(/\(\s/g,"(") // ( Foo
-                                               .replace(/\ba\.k\.a\.\b/gi,"a.k.a.");  // a.k.a. (Bypass *every* other acronym and "a" and "A" rule.)
-            /* ---------------------------------------------------------------------*/
-            /* UntitledTrackStyle                                                   */
-            /* ---------------------------------------------------------------------*/
-            switch (testString) {
-                /* UntitledTrackStyle: untitled */
-                case "":
-                case "n/a":
-                case "no title":
-                case "none":
-                case "untitled":
-                case "untitled track":
-                case "untitled blues":
-                case "untitled i":
-                case "untitled ii":
-                case "untitled no.1":
-                case "untitled no.2":
-                case "untitled no.3":
-                case "untitled no. 1":
-                case "untitled no. 2":
-                case "untitled no. 3":
-                case "untitled one":
-                case "(bonus live)":
-                case "(bonus)":
-                    stringBeingFixed = "[untitled]";
-                    storeError(text.UntitledTrackUntitled, type, number);
-                    break;
-            /* UntitledTrackStyle: guitar solo */
-                case "guitar solo":
-                    stringBeingFixed = "[guitar solo]";
-                    break;
-            /* UntitledTrackStyle: applause */
-                case "applause":
-                case "clapping":
-                    stringBeingFixed = "[applause]";
-                    break;
-            /* UntitledTrackStyle: crowd noise */
-                case "‐‐ encore break‐‐":
-                case "- encore break-":
-                case "-encore break-":
-                case "encore break":
-                case "break":
-                    stringBeingFixed = "[break]";
-                    break;
-                case "audience":
-                case "crowd":
-                case "crowd noise":
-                case "encore crowd":
-                    stringBeingFixed = "[crowd noise]";
-                    break;
-            /* UntitledTrackStyle: silence */
-                case "silent track":
-                case "blank":
-                case "unused":
-                case "no audio":
-                case "silence":
-                case "silent":
-                    stringBeingFixed = "[silence]";
-                    storeError(text.UntitledTrackSilence, type, number);
-                    break;
-            /* UntitledTrackStyle: unknown */
-                case '"Unknown"':
-                case "bonus track":
-                case "bonus":
-                case "hidden track":
-                case "hidden":
-                case "not known":
-                case "unknown":
-                case "[hidden bonus track]":
-                case "hidden track 1":
-                case "hidden track 2":
-                case "hidden track 3":
-                case "?":
-                case "??":
-                case "???":
-                case "untitled hidden track":
-                    stringBeingFixed = "[unknown]";
-                    storeError(text.UntitledTrackUnknown, type, number);
-                    break;
-            /* UntitledTrackStyle: various common untitled track encapsulations */
-                case "band introduction":
-                case "band intro":
-                case "band intro.":
-                    stringBeingFixed = "[band introductions]";
-                    break;
-                case "introduction":
-                case "-intro-":
-                case "intro":
-                case "intro.":
-                    stringBeingFixed = "[introduction]";
-                    break;
-                case "outro":
-                    stringBeingFixed = "[outro]";
-                    break;
-                case "encore":
-                case '"encore"':
-                    stringBeingFixed = "[encore]";
-                    break;
-                case "[ intermission ]":
-                    stringBeingFixed = "[intermission]";
-                    break;
-                case "interview":
-                    stringBeingFixed = "[interview]";
-                    break;
-                case "discussion":
-                    stringBeingFixed = "[discussion]";
-                    break;
-                case "lecture":
-                    stringBeingFixed = "[lecture]";
-                    break;
-                case "dialog from movie":
-                case "dialog":
-                case "dialogue":
-                case "film dialogue":
-                case "movie dialogue":
-                    stringBeingFixed = "[dialogue]";
-                    break;
-                case "(banter)":
-                case "banter":
-                case "[banter]":
-                    stringBeingFixed = "[banter]";
-                    break;
-                case "dj banter":
-                    stringBeingFixed = "[DJ banter]";
-                    break;
-                case "announcements":
-                    stringBeingFixed = "[announcements]";
-                    break;
-                case "skit":
-                    stringBeingFixed = "[skit]";
-                    break;
-                case "speach":
-                case "speech":
-                    stringBeingFixed = "[speech]";
-                    break;
-                case "talk":
-                case "talking":
-                    stringBeingFixed = "[talking]";
-                    break;
-                case "radio skit":
-                    stringBeingFixed = "[radio skit]";
-                    break;
-                case "studio announcer":
-                    stringBeingFixed = "[studio announcer]";
-                    break;
-                case "radio announcer":
-                    stringBeingFixed = "[radio announcer]";
-                    break;
-                default:
-            }
-            break;
-        case "textartist":
-        case "artist":
-            switch (testString) {
-                /* SpecialPurposeArtist style: anonymous */
-                case "anon.":
-                case "anon.":
-                case "anon":
-                case "anoniem":
-                case "anonim":
-                case "anonimo":
-                case "anonym":
-                case "anonyme":
-                case "anonymous":
-                case "anonymus":
-                case "english anonymous":
-                case "佚名":
-                    stringBeingFixed = "[anonymous]";
-                    storeError(text.spaAnon, type, number);
-                    break;
-                case "bollywood":
-                    stringBeingFixed = "[bollywood]";
-                    storeError(text.spaBollywood, type, number);
-                    break;
-                /* SpecialPurposeArtist style: Christmas music */
-                case "christmas":
-                case "christmas music":
-                    stringBeingFixed = "[Christmas music]";
-                    storeError(text.spaXmas, type, number);
-                    break;
-                /* SpecialPurposeArtist style: dialogue */
-                case "announcer":
-                case "radio announcer":
-                case "banter":
-                case "announcements":
-                case "dj banter":
-                case "対話":
-                case "barfuss filmdialog":
-                case "dialog":
-                case "dialogue":
-                case "film dialogue":
-                case "movie dialogue":
-                case "radio skit":
-                case "skit":
-                case "speach":
-                case "speech":
-                case "studio announcer":
-                case "talk":
-                case "talking":
-                    stringBeingFixed = "[dialogue]";
-                    storeError(text.spaDialogue, type, number);
-                    break;
-                /* SpecialPurposeArtist style: Disney */
-                case "christmas with disney ":
-                case "classic disney":
-                case "disney babies":
-                case "disney big band":
-                case "disney cast":
-                case "disney channel circle of stars":
-                case "disney channel":
-                case "disney characters":
-                case "disney children's favorites":
-                case "disney choir":
-                case "disney pictures":
-                case "disney princesses":
-                case "disney records":
-                case "disney soundtrack":
-                case "disney soundtracks":
-                case "disney studio chorus":
-                case "disney's christmas":
-                case "disney":
-                case "disny":
-                case "The disney big band":
-                case "The disney chorus":
-                case "The disney studio chorus":
-                case "walt disney music company":
-                case "walt disney pictures":
-                case "walt disney records":
-                case "walt disney world":
-                case "walt disney's classic":
-                case "walt disney's":
-                case "walt disney":
-                    stringBeingFixed = "Disney";
-                    storeError(text.spaDisney, type, number);
-                    break;
-                /* SpecialPurposeArtist style: gregorian chant */
-                case "canto gregoriano":
-                case "chant":
-                case "gregorian chant":
-                case "gregorian chants":
-                case "gregorian monks":
-                case "gregoriano":
-                case "gregorien":
-                case "grégorien":
-                case "schola gregoriana mediolanensis":
-                    stringBeingFixed = "[gregorian chant]";
-                    storeError(text.spaChant, type, number);
-                    break;
-                /* SpecialPurposeArtist style: musical */
-                case "broadway cast recording":
-                case "broadway cast":
-                case "broadway":
-                case "cast recording":
-                case "ensemble":
-                case "ensemble cast":
-                case "london cast recording":
-                case "london cast":
-                case "new broadway cast recording":
-                case "orginal cast recording":
-                case "original australian cast recording":
-                case "original broadway cast recording":
-                case "original broadway cast":
-                case "original cast recording":
-                case "original cast recording":
-                case "original cast":
-                case "original london & broadway cast":
-                case "original london cast":
-                case "the musicals collection":
-                case "the orginal cast":
-                case "the original broadway cast":
-                case "the original cast":
-                case "the original caste":
-                    stringBeingFixed = "[musical]";
-                    storeError(text.spaMusical, type, number);
-                    break;
-                /* SpecialPurposeArtist style: nature sounds */
-                case "echoes of nature":
-                case "echos of nature":
-                case "escape to serenity":
-                case "gentle persuasion":
-                case "gentle persuation":
-                case "magic moods":
-                case "natural wonders":
-                case "nature":
-                case "nature music":
-                case "nature recordings":
-                case "nature's relaxing sounds":
-                case "natures ensemble":
-                case "new world company":
-                case "relax with":
-                case "relax with…":
-                case "relax with...":
-                case "relaxation collection":
-                case "relaxation soundscape":
-                case "sound of nature":
-                case "sounds of nature":
-                case "soundscape":
-                case "soundscapes":
-                case "the relaxation collection":
-                case "the sounds of nature":
-                    stringBeingFixed = "[nature sounds]";
-                    storeError(text.spaNature, type, number);
-                    break;
-                /* NoArtist style */
-                case "":
-                case "bass tones":
-                case "n / a":
-                case "n /a":
-                case "n/ a":
-                case "n/a":
-                case "no artist":
-                case "no-artist":
-                case "noartist":
-                case "none given":
-                case "none listed":
-                case "none":
-                case "sound effect":
-                case "sound effects":
-                case "sound ideas":
-                case "virtual audio environments":
-                case "芸術家はありません":
-                case "芸術家はない":
-                case "音響効果":
-                    stringBeingFixed = "[no artist]";
-                    storeError(text.NoArtist, type, number);
-                    break;
-                /* SpecialPurposeArtist style: soundtrack */
-                case "20th century fox":
-                case "b.o. film":
-                case "cartoni animati":
-                case "cartoon network":
-                case "cinema century":
-                case "film st":
-                case "full cast":
-                case "movie love songs":
-                case "movie score":
-                case "original motion picture cast":
-                case "original motion picture soundtrack":
-                case "original motion picture soundtrak":
-                case "original score":
-                case "original sound track":
-                case "original soundtack":
-                case "original soundtrack score":
-                case "original soundtrack":
-                case "ost":
-                case "TVサントラ":
-                case "ゲーム・ミュージック":
-                case "サウンドトラック":
-                case "サントラ":
-                case "soundtrack":
-                    stringBeingFixed = "[soundtrack]";
-                    storeError(text.spaSoundtrack, type, number);
-                    break;
-                /* SpecialPurposeArtist style: spiritual */
-                case "spiritual":
-                case "[spiritual]":
-                    stringBeingFixed = "[spiritual]";
-                    storeError(text.spaSpiritual, type, number);
-                    break;
-                /* SpecialPurposeArtist style: traditional */
-                case "geleneksel":
-                case "olde english carol":
-                case "tautas dziesma":
-                case "tautasdziesma":
-                case "trad":
-                case "trad.":
-                case "tradition":
-                case "traditional artists":
-                case "traditional english":
-                case "traditional native american music":
-                case "traditional prayer":
-                case "traditional":
-                case "traditionale":
-                case "traditionnel":
-                case "tradizionale":
-                    stringBeingFixed = "[traditional]";
-                    storeError(text.spaTrad, type, number);
-                    break;
-                /* UnknownArtistStyle */
-                case "hidden artist":
-                case "hòa tấu":
-                case "inconnu":
-                case "instr.":
-                case "instrumental music":
-                case "instrumental score":
-                case "instrumental version":
-                case "instrumental":
-                case "intro":
-                case "musical interlude":
-                case "neznámý":
-                case "nieznany":
-                case "ningún artista":
-                case "not known":
-                case "numerous artist":
-                case "onbekend":
-                case "originaldarsteller":
-                case "outro":
-                case "performers unknown":
-                case "several":
-                case "sierra on-line":
-                case "tuntematon":
-                case "tuntetamon":
-                case "ukjent":
-                case "unbekannt":
-                case "unidentified Performers":
-                case "unidentified":
-                case "unknown artist":
-                case "unknown group":
-                case "unknown guitarists":
-                case "unknown singer":
-                case "unknown trio":
-                case "unknown":
-                case "unknown":
-                case "unkown":
-                case "unlisted artist":
-                case "unlisted":
-                case "unnamed artist":
-                case "unown":
-                case "アーティスト情報なし":
-                case "ワンダーミンツ":
-                case "不詳":
-                case "佚名.":
-                case "書香音樂系列一":
-                case "未知":
-                case "未知の芸術家":
-                case "沒有歌星":
-                case "韓國群星":
-                    stringBeingFixed = "[unknown]";
-                    storeError(text.spaUnknown, type, number);
-                    break;
-                case "va":
-                case "various artists":
-                    stringBeingFixed = "Various Artists";
-                    break;
-                default:
-            }
-            break;
-        case "label":
-            switch (stringBeingFixed.toMusicBrainzLowerCase()) {
-                case "no label":
-                case "none":
-                case "n/a":
-                case "white label":
-                case "self release":
-                case "self-release":
-                case "self released":
-                case "self-released":
-                case "auto-release":
-                case "blank":
-                case "not on label":
-                case "auto-product":
-                    stringBeingFixed = "[no label]";
-                    storeError(text.NoLabel, type, number);
-                    break;
-                case "unknown":
-                    stringBeingFixed = "";
-                    storeError(text.UnknownLabel, type, number);
-                    break;
-                default:
-            }
-            break;
-        default:
-    }
-    var parenCount = [],
-        currentChar;
-    for (var z = 0; z < 38; z++) {
-        parenCount[z] = 0;
-    }
-    for (var i = 0; i < stringBeingFixed.length; i++) {
-        currentChar = stringBeingFixed.charAt(i);
-        switch (currentChar) {
-        case "(":
-            parenCount[0]++;
-            break;
-        case ")":
-            parenCount[1]++;
-            break;
-        case "{":
-            parenCount[2]++;
-            break;
-        case "}":
-            parenCount[3]++;
-            break;
-        case "[":
-            parenCount[4]++;
-            break;
-        case "]":
-            parenCount[5]++;
-            break;
-        case "<":
-            parenCount[6]++;
-            break;
-        case ">":
-            parenCount[7]++;
-            break;
-        case "〈":
-            parenCount[8]++;
-            break;
-        case "〉":
-            parenCount[9]++;
-            break;
-        case "《":
-            parenCount[10]++;
-            break;
-        case "》":
-            parenCount[11]++;
-            break;
-        case "«":
-            parenCount[12]++;
-            break;
-        case "»":
-            parenCount[13]++;
-            break;
-        case "‹":
-            parenCount[14]++;
-            break;
-        case "›":
-            parenCount[15]++;
-            break;
-        case "「":
-            parenCount[16]++;
-            break;
-        case "」":
-            parenCount[17]++;
-            break;
-        case "『":
-            parenCount[18]++;
-            break;
-        case "』":
-            parenCount[19]++;
-            break;
-        case "〔":
-            parenCount[20]++;
-            break;
-        case "〕":
-            parenCount[21]++;
-            break;
-        case "{":
-            parenCount[22]++;
-            break;
-        case "}":
-            parenCount[23]++;
-            break;
-        case "〈":
-            parenCount[24]++;
-            break;
-        case "〉":
-            parenCount[25]++;
-            break;
-        case "《":
-            parenCount[26]++;
-            break;
-        case "》":
-            parenCount[27]++;
-            break;
-        case "【":
-            parenCount[28]++;
-            break;
-        case "】":
-            parenCount[29]++;
-            break;
-        case "〖":
-            parenCount[30]++;
-            break;
-        case "〗":
-            parenCount[31]++;
-            break;
-        case "〘":
-            parenCount[32]++;
-            break;
-        case "〙":
-            parenCount[33]++;
-            break;
-        case "〚":
-            parenCount[34]++;
-            break;
-        case "〛":
-            parenCount[35]++;
-            break;
-        case "⁅":
-            parenCount[36]++;
-            break;
-        case "⁆":
-            parenCount[37]++;
-            break;
-        default:
-        }
-    }
-    if (reportErrors) {
-        var checkBalance = function(countA, countB, textName, charA, charB) {
-            if (parenCount[countA] > parenCount[countB]) {
-                storeError(text.TextContains+' ' + Math.abs((parenCount[countA] - parenCount[countB])) + ' '+textName+" "+charA, type, number);
-            } else if (parenCount[countB] > parenCount[countA]) {
-                storeError(text.TextContains+' ' + Math.abs((parenCount[countB] - parenCount[countA])) + ' '+textName+" "+charB, type, number);
-            }
-        };
-        checkBalance(0,1,text.Parens,"(",")");
-        checkBalance(2,3,text.Braces,"{","}");
-        checkBalance(4,5,text.SquareBrackets,"[","]");
-        checkBalance(6,7,text.Chevrons,"<",">");
-        checkBalance(8,9,text.Angle,"〈","〉");
-        checkBalance(10,11,text.DoubleAngle,"《","》");
-        if(ruleSet.mirroredGuillemets) {
-            checkBalance(12,13,text.Guillemets,"«","»");
-            checkBalance(14,15,text.Guillemets,"‹","›");
-        }
-        checkBalance(16,17,text.Hook,"「","」");
-        checkBalance(18,19,text.Corner,"『","』");
-        checkBalance(20,21,text.Tortoise,"〔","〕");
-        checkBalance(22,23,text.Braces,"{","}");
-        checkBalance(24,25,text.Hill,"〈","〉");
-        checkBalance(26,27,text.HillDouble,"《","》");
-        checkBalance(28,29,text.Kakko,"【","】");
-        checkBalance(30,31,text.Lenticular,"〖","〗");
-        checkBalance(32,33,text.TortoiseWhite,"〘","〙");
-        checkBalance(34,35,text.SquareWhite,"〚","〛");
-        checkBalance(34,35,text.SquareWhite,"〚","〛");
-        checkBalance(34,35,text.SquareQuill,"⁅","⁆");
-    }
-    /* ---------------------------------------------------------------------*
-     * Unprotect slashes.                                                   *
-     * ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/\uDBC0\uDC01(.?)/g,
-        function(str, p1) {
-            if (ruleSet.changeCapitalization) {
-                return "/" + p1.toMusicBrainzUpperCase();  // We protected the / as non-punctuation, so any letter just after it wouldn't have received the normal capitalization.
-            } else {
-                return "/" + p1;
-            }
-        }
-    );
-    /* ---------------------------------------------------------------------* 
-     * Special spacings / phrases.  Done last, to avoid case changes 
-     * at beginnings of sentences, etc.
-     * ---------------------------------------------------------------------*/
-    stringBeingFixed = stringBeingFixed.replace(/R&\sb/i, "R&B")            // R&B
-                                       .replace(/\so'\s/gi," o' ")          // o'
-                                       .replace(/'o'/gi,"'O'")              // 'O'
-                                       .replace(/\bt'\s/gi,"t' ")            // t'
-                                       .replace(/\b't\s/gi,"'t ")           // 't
-                                       .replace(/\'n\'/gi," 'n' ")          // 'n'
-                                       .replace(/\"a([\s\"])/gi,'"A$1')     // "A and "A"
-                                       .replace(/(\s)?$H/g,"$1$h")          // $H -> $h  (Ca$h, $hort, etc.)
-                                       .replace(/a([\-\‐])/gi,'A$1')        // A-
-                                       .replace(/\s{2,}/g," ");
-    return jQuery.trim(stringBeingFixed);
-}
-/*************************************************************************************
- * Function: fixDuration ( GC group type, track number / event number, string to be  *
- *                         processed, optional: string containing a duration from a  *
- *                         prior pass by fixDuration )                               *
- *                                                                                   *
- * Special mode of Guess Case, fixes common issues in track duration fields.         *
- *************************************************************************************/
-function fixDuration(type, number, stringBeingFixed, originalDuration) {
-    stringBeingFixed = stringBeingFixed.replace(/s/g, "");
-    /* --------------------------------------------------------------------- */
-    /* Carry over original string information, for reporting purposes,       */
-    /* when running recursively.                                             */
-    /* --------------------------------------------------------------------- */
-    if (typeof(originalDuration) == "undefined") {
-        originalDuration = stringBeingFixed;
-    }
-    /* --------------------------------------------------------------------- */
-    /* Test for an empty duration string.                                    */
-    /* --------------------------------------------------------------------- */
-    if (stringBeingFixed.length === 0) {
-        if (reportErrors) {
-            clearErrors(type, number);
-            storeError('Warning: The duration field cannot be left empty.', type, number);
-        }
-        return stringBeingFixed;
-    }
-    /* --------------------------------------------------------------------- */
-    /* Correct for invalid separator punctuation.                            */
-    /* --------------------------------------------------------------------- */
-    stringBeingFixed = stringBeingFixed.replace(/[,\.;\'\"~`]/, ":");
-    if (reportErrors) {
-        if (stringBeingFixed != originalDuration) {
-            storeError('Warning: track duration was corrected from ' + originalDuration + ' to ' + stringBeingFixed + ".", type, number);
-        }
-    }
-    /* --------------------------------------------------------------------- */
-    /* Test for a (hhhh:)(mmm)m:ss input string structure.                   */
-    /* --------------------------------------------------------------------- */
-    if (new RegExp(/^((:\d{0,4}|\d{0,4}:){0,2})?(\d{1,2})$/).test(stringBeingFixed)) {
-        var times = stringBeingFixed.split(":"),
-            seconds = 0;
-        switch (times.length) {
-        case 1:
-            seconds = parseInt(times[0], 10);
-            break;
-        case 2:
-            seconds = parseInt(times[0], 10) * 60 + parseInt(times[1], 10);
-            break;
-        case 3:
-            seconds = parseInt(times[0], 10) * 3600 + parseInt(times[1], 10) * 60 + parseInt(times[2], 10);
-            break;
-        default:
-            if (reportErrors) {
-                storeError('Caution: Invalid time format', type, number);
-            }
-            seconds = null;
-        }
-        if (seconds < 2147483 && seconds !== null) {
-            var minutes = Math.floor(seconds / 60);
-            seconds = seconds % 60;
-            if (seconds < 10) {
-                stringBeingFixed = minutes + ":0" + seconds;
-            } else {
-                stringBeingFixed = minutes + ":" + seconds;
-            }
-            if (reportErrors) {
-                if (originalDuration != stringBeingFixed) {
-                    clearErrors(type, number);
-                    storeError('Warning: track duration was corrected from ' + originalDuration + ' to ' + stringBeingFixed + ".", type, number);
-                }
-            }
-            return stringBeingFixed;
-        } else if (seconds !== null) {
-            if (reportErrors) {
-                clearErrors(type, number);
-                storeError('Sorry, the database cannot store track durations longer than 24 days, 20 hours, 31 minutes, and 23 seconds.', type, number);
-            }
-        }
-        /* --------------------------------------------------------------------- *
-         * Turn "111" and "1111" into "1:11" and "11:11".                       
-         *                                                                       
-         * Note: This uses slice in a way that  will break wide chars if run on them.     
-         * On the other hand, wide characters would not be valid durations anyhow.
-         * --------------------------------------------------------------------- */
-    } else if (new RegExp(/^\d{3,10}/).test(stringBeingFixed)) {
-        switch (stringBeingFixed.length) {
-        case 3:
-            stringBeingFixed = stringBeingFixed.slice(0, 1) + ":" + stringBeingFixed.slice(1);
-            if (reportErrors) {
-                clearErrors(type, number);
-                storeError('Warning: track duration was corrected from ' + originalDuration + ' to ' + stringBeingFixed + ".", type, number);
-            }
-            break;
-        case 4:
-            stringBeingFixed = stringBeingFixed.slice(0, 2) + ":" + stringBeingFixed.slice(2);
-            if (reportErrors) {
-                clearErrors(type, number);
-                storeError('Warning: track duration was corrected from ' + originalDuration + ' to ' + stringBeingFixed + ".", type, number);
-            }
-            break;
-        case 5:
-        case 6:
-        case 7:
-        case 8:
-        case 9:
-        case 10:
-            if (reportErrors) {
-                clearErrors(type, number);
-                storeError("Error: invalid track duration.");
-            }
-            return stringBeingFixed;
-        default:
-        }
-        /* --------------------------------------------------------------------- */
-        /* Recheck, to catch cases like "177".                                   */
-        /* --------------------------------------------------------------------- */
-        return fixDuration(type, number, stringBeingFixed, originalDuration);
-    } else {
-        if (reportErrors) {
-            clearErrors(type, number);
-            storeError('Caution: Invalid time format', type, number);
-        }
-    }
-    return stringBeingFixed;
-}
-/*************************************************************************************
- * Function: fixIotaSubstrings ( string )                                            *
- *                                                                                   *
- * Special mode of Guess Case, fixes varying character capitalization in   *
- * ancient Greek (not used in modern Greek, so safe to use on any string).           *
- *************************************************************************************/
-function fixIotaSubstrings(stringToFix) {
-    var iotaCharacters = "(ᾼ|ᾈ|ᾉ|ᾌ|ᾊ|ᾎ|ᾍ|ᾋ|ᾏ|ῌ|ᾘ|ᾙ|ᾜ|ᾚ|ᾞ|ᾝ|ᾛ|ᾟ|ῼ|ᾨ|ᾩ|ᾬ|ᾪ|ᾮ|ᾭ|ᾫ|ᾯ|αι|άι|ὰι|ᾶι|ἀι|" +
-                           "ἁι|ἄι|ἂι|ἆι|ἅι|ἃι|ἇι|ηι|ήι|ὴι|ῆι|ἠι|ἡι|ἤι|ἢι|ἦι|ἥι|ἣι|ἧι|ωι|ώι|ὼι|ῶι|" +
-                           "ὠι|ὡι|ὤι|ὢι|ὦι|ὥι|ὣι|ὧι)";
-    stringToFix = stringToFix.replace(new RegExp("([\\u0370-\\u03FF\\u1F00-\\u1FFF])" + iotaCharacters, "gi"),
-        function(str, p1, p2) {
-            switch (p2) {
-                case "ᾼ":
-                    return p1+"Αι";
-                case "ᾈ":
-                    return p1+"Ἀι";
-                case "ᾉ":
-                    return p1+"Ἁι";
-                case "ᾌ":
-                    return p1+"Ἄι";
-                case "ᾊ":
-                    return p1+"Ἂι";
-                case "ᾎ":
-                    return p1+"Ἆι";
-                case "ᾍ":
-                    return p1+"Ἅι";
-                case "ᾋ":
-                    return p1+"Ἃι";
-                case "ᾏ":
-                    return p1+"Ἇι";
-                case "ῌ":
-                    return p1+"Ηι";
-                case "ᾘ":
-                    return p1+"Ἠι";
-                case "ᾙ":
-                    return p1+"Ἡι";
-                case "ᾜ":
-                    return p1+"Ἤι";
-                case "ᾚ":
-                    return p1+"Ἢι";
-                case "ᾞ":
-                    return p1+"Ἦι";
-                case "ᾝ":
-                    return p1+"Ἥι";
-                case "ᾛ":
-                    return p1+"Ἣι";
-                case "ᾟ":
-                    return p1+"Ἧι";
-                case "ῼ":
-                    return p1+"Ωι";
-                case "ᾨ":
-                    return p1+"Ὠι";
-                case "ᾩ":
-                    return p1+"Ὡι";
-                case "ᾬ":
-                    return p1+"Ὤι";
-                case "ᾪ":
-                    return p1+"Ὢι";
-                case "ᾮ":
-                    return p1+"Ὦι";
-                case "ᾭ":
-                    return p1+"Ὥι";
-                case "ᾫ":
-                    return p1+"Ὣι";
-                case "ᾯ":
-                    return p1+"Ὧι";
-                case "αι":
-                    return p1+"ᾳ";
-                case "άι":
-                    return p1+"ᾴ";
-                case "ὰι":
-                    return p1+"ᾲ";
-                case "ᾶι":
-                    return p1+"ᾷ";
-                case "ἀι":
-                    return p1+"ᾀ";
-                case "ἁι":
-                    return p1+"ᾁ";
-                case "ἄι":
-                    return p1+"ᾄ";
-                case "ἂι":
-                    return p1+"ᾂ";
-                case "ἆι":
-                    return p1+"ᾆ";
-                case "ἅι":
-                    return p1+"ᾅ";
-                case "ἃι":
-                    return p1+"ᾃ";
-                case "ἇι":
-                    return p1+"ᾇ";
-                case "ηι":
-                    return p1+"ῃ";
-                case "ήι":
-                    return p1+"ῄ";
-                case "ὴι":
-                    return p1+"ῂ";
-                case "ῆι":
-                    return p1+"ῇ";
-                case "ἠι":
-                    return p1+"ᾐ";
-                case "ἡι":
-                    return p1+"ᾑ";
-                case "ἤι":
-                    return p1+"ᾔ";
-                case "ἢι":
-                    return p1+"ᾒ";
-                case "ἦι":
-                    return p1+"ᾖ";
-                case "ἥι":
-                    return p1+"ᾕ";
-                case "ἣι":
-                    return p1+"ᾓ";
-                case "ἧι":
-                    return p1+"ᾗ";
-                case "ωι":
-                    return p1+"ῳ";
-                case "ώι":
-                    return p1+"ῴ";
-                case "ὼι":
-                    return p1+"ῲ";
-                case "ῶι":
-                    return p1+"ῷ";
-                case "ὠι":
-                    return p1+"ᾠ";
-                case "ὡι":
-                    return p1+"ᾡ";
-                case "ὤι":
-                    return p1+"ᾤ";
-                case "ὢι":
-                    return p1+"ᾢ";
-                case "ὦι":
-                    return p1+"ᾦ";
-                case "ὥι":
-                    return p1+"ᾥ";
-                case "ὣι":
-                    return p1+"ᾣ";
-                case "ὧι":
-                    return p1+"ᾧ;";
-            }
-        }
-    );
-    return stringToFix;
-}
-/*************************************************************************************
- * Function: fixCommonItalianProblems ( string )                                     *
- *                                                                                   *
- * Special mode of Guess Case, fixes common minor accent issues with Italian.        *
- *************************************************************************************/
-function fixCommonItalianProblems(stringToFix, type, number) {
-    stringToFix = stringToFix.replace(/(\s|^)(p)erch(?:è|e\')(\W|$)/gi,"$1$2erché$3"); // perche', perchè -> perché
-    stringToFix = stringToFix.replace(/(\s|^)(p)oich(?:è|e\')(\W|$)/gi,"$1$2oiché$3"); // poiche', poichè -> poiché
-    stringToFix = stringToFix.replace(/(\s|^)(s)ara\'(\W|$)/gi,"$1$2arà$3"); // sara' -> sarà
-    stringToFix = stringToFix.replace(/(\s|^)(s)i\'(\W|$)/gi,"$1$2ì$3"); // si' -> sì
-    if (new RegExp("e\\'(\\W|$)", "i").test(stringToFix)) {  // -e' --> either -é or -è
-        storeError(text.WrongAccent, type, number);
-    }
-    return stringToFix;
-}
-/*************************************************************************************
- * Function: warnGerman ( string )                                                   *
- *                                                                                   *
- * Special mode of Guess Case, warns about making "SS" lowercased.                   *
- *************************************************************************************/
-function warnGerman(stringToFix, type, number) {
-    if (new RegExp("SS").test(stringToFix)) {
-        storeError(text.esGerman, type, number);
-    }
-}
-/*************************************************************************************
- * Function: guessMyCase (GC group type, track number / event number, string to      *
- *                        be processed )                                             *
- *                                                                                   *
- * Main interface function for the Guess Case routines.                              *
- *************************************************************************************/
-function guessMyCase(type, number, stringToFix, language, mode, keepUpperCased) {
-    if (typeof(mode) !== "undefined") {
-        $mode = mode;
-    }
-    if (typeof(keepUpperCased) !== "undefined") {
-        $gckeepUppercased = keepUpperCased;
-    }
-    stringToFix = fullWidthConverter(stringToFix);
-    switch (language) {
-        case "34":  //  Azerbaijani
-        case "94":  //  Crimean Tatar
-        case "211": //  Kazakh
-        case "408": //  Tatar
-        case "433": //  Turkish
-            TurkishI = true;
-            break;
-        default:
-            TurkishI = false;
-    }
-    // If Turkish I option is selected, override the default language setting for Turkish I mode.
-    if (typeof($gcTurkishI) != "undefined") {
-        if ($gcTurkishI == true) {
-            TurkishI = true;
-        }
-    }
-    if (stringToFix.length > 0) {
-        var ruleSet = loadRuleSet(type, $mode),
-            finalString;
-        if (type == "duration") {
-            finalString = fixDuration(type, number, stringToFix);
-            addErrorReport(type, number);
-            return finalString;
-        } else {
-            if (validateRuleSet(ruleSet, $mode) === true) {
-                switch (language) {
-                    case "145": // German
-                        warnGerman(stringToFix, type, number);
-                        break;
-                    case "195": // Italian
-                        finalString = fixCommonItalianProblems(finalString, type, number);
-                        break;
-                    default:
-                }
-                finalString = applyGuidelines(
-                    ruleSet,
-                    type,
-                    number,
-                    fixCapitalization(
-                        ruleSet,
-                        type,
-                        number,
-                        findBasicErrors(
-                            ruleSet,
-                            type,
-                            number,
-                            stringToFix,
-                            $mode,
-                            $gckeepUppercased),
-                        $mode,
-                        $gckeepUppercased),
-                    $mode);
-                finalString = fixIotaSubstrings(finalString);
-                addErrorReport(type, number);
-                return finalString;
-            }
-        }
-    }
-    return "";
-}
diff --git a/root/static/scripts/common/es_guess_case_panel.js b/root/static/scripts/common/es_guess_case_panel.js
deleted file mode 100644
index 9073c3d..0000000
--- a/root/static/scripts/common/es_guess_case_panel.js
+++ /dev/null
@@ -1,177 +0,0 @@
-/*************************************************************************************
- * BEGIN GUESS CASE PANEL AND BUTTONS SECTION                                        *
- *************************************************************************************
- * Function: (default)                                                               *
- *                                                                                   *
- * Loads on page ready, activates the Guess Case panel, attaches appropriate GC      *
- * buttons to the form.  (Button creation code is in es_functions.js.)               *
- *************************************************************************************/
-$(function() {
-/****************************************************************************************************************************************
- * Default Variables                                                                                                                    *
- ****************************************************************************************************************************************/
-    $modeSelection = $("#es-gc-selection"); // Mode select element
-    reportErrors = true; // Permit the storeError, clearError, and alertUser methods.
-    $mode = handleCookie("get", "es-gc-mode", "English"); // Persistent mode selection from cookie.
-    $gckeepUppercased = handleCookie("get", "es-gc-checkbox1", true); // Keep uppercase words uppercased.
-    $gcautoFixTitle = handleCookie("get", "es-gc-checkbox2", false);  // Automatically Guess Case track titles.
-    $gcTurkishI = handleCookie("get", "es-gc-checkbox3", false);      // Use Turkish rules for capitalization.
-    /* -------------------------------------------------------------------------*/
-    /* Turn on show/hide functionality
-    /* -------------------------------------------------------------------------*/
-    $("#js-fieldset-gc-trigger-show").click(function() {
-        $("#js-fieldset-gc").removeClass("hidden");
-        $("#js-fieldset-gc-trigger-hide").removeClass("hidden");
-        $("#js-fieldset-gc-trigger-show").addClass("hidden");
-    });
-    $("#js-fieldset-gc-trigger-hide").click(function() {
-        $("#js-fieldset-gc").addClass("hidden");
-        $("#js-fieldset-gc-trigger-show").removeClass("hidden");
-        $("#js-fieldset-gc-trigger-hide").addClass("hidden");
-    });
-    /* --------------------------------------------------------------------- */
-    /* Hook the blur event for all GC fields to enable storing after         */
-    /* manual changes and to enable automatic Guess Casing specifically      */
-    /* for durations and tracks ONLY if enabled in the menu.                 */
-    /* --------------------------------------------------------------------- */
-    var bindGuessCase = function(group, type, auto) {
-        $gcFieldsGroup[group].each(function(i) {
-            $(this).blur(function() {
-                storeHistory($(this).attr("value"), type, i);
-                if (auto === true) {
-                    $(this).attr("value", guessMyCase(type, i, $(this).attr("value")));
-                }
-            });
-        });
-    },
-    /* --------------------------------------------------------------------- */
-    /* Unhook the blur event for specified GC field type.                    */
-    /* --------------------------------------------------------------------- */
-    unbindGuessCase = function(group, type) {
-        $gcFieldsGroup[group].each(function(i) {
-            $(this).unbind('blur');
-        });
-    },
-    /* --------------------------------------------------------------------- */
-    /* Test and handle track durations auto-correction & history triggers.   */
-    /* --------------------------------------------------------------------- */
-    renewGCDurations = function() {
-        unbindGuessCase("2", "duration");
-        bindGuessCase("2", "duration", true);
-    },
-    /* --------------------------------------------------------------------- */
-    /* Test and handle track titles auto-correction & history triggers.      */
-    /* --------------------------------------------------------------------- */
-    renewGCTracks = function() {
-        unbindGuessCase("0", "title");
-        if ($gcautoFixTitle === true) {
-            bindGuessCase("0", "title", true);
-        } else {
-            bindGuessCase("0", "title", false);
-        }
-    };
-    /* --------------------------------------------------------------------- */
-    /* Handle changes to user Guess Case preferences in the ES panel.        */
-    /* --------------------------------------------------------------------- */
-    $("#es-gc-opt1").change(function() {
-        handleCookie("set", "es-gc-checkbox1", ($('#es-gc-opt1').is(':checked')));
-        $gckeepUppercased = ($('#es-gc-opt1').is(':checked'));
-    });
-    $("#es-gc-opt2").change(function() {
-        handleCookie("set", "es-gc-checkbox2", ($('#es-gc-opt2').is(':checked')));
-        $gcautoFixTitle = ($('#es-gc-opt2').is(':checked'));
-        renewGCTracks();
-    });
-    $("#es-gc-opt3").change(function() {
-        handleCookie("set", "es-gc-checkbox3", ($('#es-gc-opt3').is(':checked')));
-        $gcTurkishI = ($('#es-gc-opt3').is(':checked'));
-    });
-    /* --------------------------------------------------------------------- */
-    /* Turn on the tooltips.                                                 */
-    /* --------------------------------------------------------------------- */
-    $("#js-fieldset-gc *").tooltip();
-    /* --------------------------------------------------------------------- */
-    /* Create and insert "Guess Case" buttons for each title & artist field. */
-    /* --------------------------------------------------------------------- */
-    $trackTitleGroup.each(function(i) {
-        makeTitleButton(i, $(this));
-    });
-    $textTextGroup.each(function(i) {
-        makeTitleButton(i, $(this));
-    });
-    $artistGroup.each(function(i) {
-        makeArtistButton(i, $(this));
-    });
-    $textArtistGroup.each(function(i) {
-        makeArtistButton(i, $(this));
-    });
-    $("#form-create-label-name, #form-edit-label-name").each(function(i) {
-        makeLabelButton(i, $(this));
-    });
-    if ($("#form-create-label-name, #form-edit-label-name").length > 0) {
-        $("#es-gc-div-label-0").css({"right":"-85%"});
-    }
-    /* --------------------------------------------------------------------- */
-    /* Create and insert "Guess All" button for the form.                    */
-    /* --------------------------------------------------------------------- */
-    var $esControlsDiv = $("#esControlsDiv"),
-        $GACheck = $("#es-guessall");
-    if ($GACheck.length === 1) {
-        $form.each(function(i) {
-            gcControlsDiv.append(new GuessAllButton().makeButton(i));
-        });
-    }
-    /* Create and insert explanatory text. */
-    gcText = jQuery(document.createElement('span'));
-    gcText.appendTo(gcControlsDiv);
-    if ($GACheck.length === 1) {
-        gcText.text(" " + text.gcMode1 + " ");
-    } else {
-        gcText.text(text.gcMode2 + " ");
-    }
-    /* --------------------------------------------------------------------- */
-    /* Copy and insert the mode selector dropdown.                           */
-    /* --------------------------------------------------------------------- */
-    $modeSelection.clone().attr("id", "es-gc-selection-copy").removeClass("es-ro").removeClass("es-rm").appendTo(gcControlsDiv)
-    /* --------------------------------------------------------------------- */
-    /* Keep the two Guess Case mode selectors synchronized.                  */
-    /* --------------------------------------------------------------------- */
-    .change(function() {
-        var i = $("#es-gc-selection-copy").selectedValues()[0];
-        $modeSelection.selectOptions(i);
-        $mode = handleCookie("set", "es-gc-mode", i);
-    })
-    .keyup(function() {
-        var i = $("#es-gc-selection-copy").selectedValues()[0];
-        $modeSelection.selectOptions(i);
-        $mode = handleCookie("set", "es-gc-mode", i);
-    });
-    var $modeSelectionClone = $("#es-gc-selection-copy");
-    $modeSelection.change(function() {
-        var i = $modeSelection.selectedValues()[0];
-        $modeSelectionClone.selectOptions(i);
-        $mode = handleCookie("set", "es-gc-mode", i);
-    })
-    .keyup(function() {
-        var i = $modeSelection.selectedValues()[0];
-        $modeSelectionClone.selectOptions(i);
-        $mode = handleCookie("set", "es-gc-mode", i);
-    });
-    /* --------------------------------------------------------------------- */
-    /* Make persistent the state of mode selectors between forms.            */
-    /* --------------------------------------------------------------------- */
-    $modeSelection.selectOptions($mode);
-    $modeSelectionClone.selectOptions($mode);
-    /* --------------------------------------------------------------------- */
-    /* Set undo history event triggers.                                      */
-    /* --------------------------------------------------------------------- */
-    renewGCDurations();
-    renewGCTracks();
-    bindGuessCase("1", "artist", false);
-    bindGuessCase("3", "label", false);
-    bindGuessCase("4", "text", false);
-    bindGuessCase("5", "textartist", false);
-});
-/*************************************************************************************
- * END GUESS CASE PANEL AND BUTTONS SECTION                                          *
- ************************************************************************************/
diff --git a/root/static/scripts/common/es_main.js b/root/static/scripts/common/es_main.js
deleted file mode 100644
index d4aee72..0000000
--- a/root/static/scripts/common/es_main.js
+++ /dev/null
@@ -1,306 +0,0 @@
-/********************************************************************************************
- * Global Variables                                                                         *
- ********************************************************************************************
- *   Track and Release Fields                                                               *
- ===========================================================================================*/
-// var releaseTitleGroup = ;
-var $trackTitleGroup = $("input[class='track_name'], input[name='track.name']"),
-    $artistGroup = $("input[class='artist_name'], .artist-name"),
-    $durationGroup = $("input[class='track_duration']"),
-/*===========================================================================================
- *   Variable Content                                                                       *
- ===========================================================================================*/
-    $textTextGroup = $("input[class='es-text'], .release-title:eq(1)"),
-    $textArtistGroup = $("input[class='es-artist'], .release-artist:eq(1)"),
-/*===========================================================================================
- *   Release Event fields                                                                   *
- ===========================================================================================*/
-    $dateYearGroup = $("input[id$='date-year']"),                  // Release event fields for: Year
-    $dateMonthGroup = $("input[id$='date-month']"),                // Release event fields for: Month
-    $dateDayGroup = $("input[id$='date-day']"),                    // Release event fields for: Day
-    $labelGroup = $("input[class='release_event_label'], .label-name"),          // Release event fields for: Label name
-    $catalogGroup = $("input[class='release_event_catalog']"),      // Release event fields for: Catalog #
-    $barcodeGroup = $("input[class='release_event_barcode']"),      // Release event fields for: Barcode
-/*===========================================================================================
- *   Collections of above groups used for guessing case                                     *
- ===========================================================================================*/
-    $gcFieldsGroup = $([$trackTitleGroup, $artistGroup, $durationGroup, $labelGroup, $textTextGroup, $textArtistGroup]),
-    $gcFieldsTitles = $(["title", "artist", "duration", "label", "text", "textartist"]),
-/*===========================================================================================
- *   Specific form elements                                                                 *
- ===========================================================================================*/
-    $modules = $('.js-fieldset-trigger-show'),        // Fieldset modules
-    $form = $('#es-form'),                            // The form to which Guess Case, Undo / Revert, and Track Parser attach.
-    $events = $('#es-events');                        // The release events fieldset, to which various things attach.
-if ($("#es-tips").length === 0) {
-    $noTipsCheck = false;
-} else {
-    $noTipsCheck = true;
-}
-var $loadindicator = $("#es-loading-text"),           // div containing Edit Suite load status text
-/*===========================================================================================
- *   Locations of files                                                                     *
- ===========================================================================================*/
-   filelocs = [];
-filelocs.serverBase = location.href.split("/")[2];         // Base server url
-filelocs.serverJavaScript = "/static/scripts/";            // Relative location of base scripts directory on the server
-filelocs.serverImage = "/static/images/scripts/";               // Relative location of base image directory on the server
-filelocs.serverStyles = "/static/styles/extra/";           // Relative location of base image directory on the server
-filelocs.serverJQuery = "jquery/";                         // Relative location of jQuery scripts / styles directories on the server
-filelocs.serverCommon = "common/";                         // Relative location of "common" scripts directory on the server
-/*===========================================================================================
- *   CSS Classes                                                                            *
- ===========================================================================================*/
-var windowTitle     = "es-headlinetitle",             // Class for popup window title bar
-    windowImage     = "es-headlineimg",               // Class for popup window image
-    windowMessage   = "es-message",                   // Class for popup window text
-    windowConfirm   = "es-confirm",                   // Class for popup confirmation question text
-    floatLeft       = "es-l",                         // Basic float:left; class
-    controlButton   = "",                             // Class for Guess Case / Undo All / etc buttons
-    buttonContainer = "es-gc-button",                 // Class for divs which contain Guess Case / Undo All / etc buttons
-/*===========================================================================================
- *   File types                                                                             *
- ===========================================================================================*/
-   imageExt      = "png",                            // Type of images to use
-/*===========================================================================================
- *   Loader data                                                                            *
- ===========================================================================================*/
-    loadedFiles = [],                                 // Stores an array of files already loaded
-    toBeLoaded = [],                                  // Stores an array of files to be loaded
-    loadingState = false,                             // Lock state of the lazy-loader
-    progressBar = 0,                                  // Has progress bar code been loaded yet?
-    totalFileSize = 0,                                // How many bytes total to load?
-    currentLoadedSize = 0,                            // How many bytes so far loaded?
-    textStrings = false,
-/*===========================================================================================
- *   Unmodified element clones                                                              *
- ===========================================================================================*/
-    rawTrack,
-    rawEvent;
-/********************************************************************************************
- * END Global Variables                                                                     *
- *******************************************************************************************/
-/********************************************************************************************
- * Functions                                                                                *
- ********************************************************************************************/
-/********************************************************************************************
- * Function: loadFiles ( none )                                                             *
- *                                                                                          *
- * Lazy-loader.  Downloads and loads JavaScript and CSS files.                              *
- * Do *not* use with CSS files that use @includes.                                          *
- ********************************************************************************************/
-function loadFiles() { 
-    loadingState = true; // Lock the file loader
-    function alreadyLoaded(file) {
-        if (jQuery.inArray(file, loadedFiles) > 0) { // Check for the file name in the array of files to be loaded
-            return true;
-        } else {
-            return false;
-        }
-    }
-    function loadError(XMLHttpRequest, textStatus, errorThrown) {  // Text in this function is for debug.  No need for i18n support in this text.
-        if (textStrings) {
-            $loadindicator.append("<span>" + fileToLoad + " " + " load error.  status: " + textStatus + " error: " + errorThrown+"<br />");
-        }
-        toBeLoaded.unshift(fileToLoad); // Put the errored file back into the front of the to be loaded queue
-        loadFiles(); // Loop back to retry loading the file
-    }
-    function loadSuccess(data) {  // Text in this function is for debug.  No need for i18n support in this text.
-        var timeEnd = new Date();
-        if (textStrings) {
-            $loadindicator.append("<span>" + fileToLoad + " loaded. Time elapsed: " +
-                (timeEnd.getTime() - timeStart.getTime()) + " ms</span><br />");
-        }
-        currentLoadedSize += data.length;
-        if (progressBar === 1) {
-            $('#es-load-status').progressbar({ value: Math.round(((currentLoadedSize/totalFileSize)*100)) });  // Turn on the progress bar, now that the code has been loaded
-            progressBar++;
-        } else if (progressBar === 2) {
-            /* Update the progress bar */
-            $('#es-load-status').progressbar('option', 'value', Math.round(((currentLoadedSize/totalFileSize)*100)));
-        }
-        loadedFiles.push(fileToLoad); // Add the now-loaded file into the array of loaded files
-        loadFiles(); // Loop back to check for other files which need to be loaded
-    }
-    function loadSuccessCss(data, status) {
-        $('head').append('<style type="text/css" rel="stylesheet" href="'+fileToLoad+'">'+data+'</style>');
-        loadSuccess(data);
-    }
-    if (toBeLoaded.length > 0) { // Make sure there's actually anything to be loaded in the toBeLoaded array
-        var timeStart = new Date();
-        var fileToLoad = toBeLoaded.shift();
-        if (!alreadyLoaded(fileToLoad)) { // Make sure we've not already loaded the file
-            if (loadedFiles.length === 1) {
-                textStrings = true;
-            }
-            if (fileToLoad === "jquery.jquery-ui.js") {  // Prevent attempting to update the progressbar until we've actually loaded that code
-                progressBar = 1;
-            }
-            if (textStrings) {
-                $('#es-statusbar-text').text(text.Loading+" "+fileToLoad);
-            }
-            if (fileToLoad.substr(0, 4) !== "http") { // Allow full urls to be passed, but still allow passing "shorthand" urls for local files
-                if (fileToLoad.match(/^jquery\./)) { // If this is a jQuery plugin file
-                    fileToLoad = filelocs.serverJQuery + fileToLoad; // Prepend that subdirectory name onto the file name
-                } else if (fileToLoad.match(/^es_/)) { // If this is an Edit Suite file
-                    fileToLoad = filelocs.serverCommon + fileToLoad; // Prepend that subdirectory name onto the file name
-                }
-                switch (new RegExp(/\.css|\.js/).exec(fileToLoad).toString()) { // Handle the url depending upon which type of file it is
-                    case ".js":
-                        fileToLoad = "http://" + filelocs.serverBase + filelocs.serverJavaScript + fileToLoad;
-                        $.ajax({
-                            type: "GET",
-                            url: fileToLoad,
-                            error: loadError,
-                            success: loadSuccess,
-                            dataType: "script",
-                            cache: false
-                        });
-                        break;
-                    case ".css":
-                        fileToLoad = "http://" + filelocs.serverBase + filelocs.serverStyles + fileToLoad;
-                        $.ajax({
-                            type: "GET",
-                            url: fileToLoad,
-                            success: loadSuccessCss,
-                            error: loadError,
-                            dataType: "html",
-                            cache: false
-                        });
-                        break;
-                    default:
-                }
-            }
-        }
-    } else {  // Done loading files
-        loadingState = true; // Unlock the file loader
-        $('#es-loader').html(text.ESBeginA+"<br />"+text.ESBeginB);
-    } 
-}
-function startLoad() {
-    if (!loadingState) { 
-        loadFiles();
-    }
-}
-/********************************************************************************************
- * Function: ( default )                                                                    *
- *                                                                                          *
- * Launches and displays the Edit Suite.                                                    *
- ********************************************************************************************/
-$(function() {
-    /* ------------------------------------------------------------------------ */
-    /* Create container for the Guess All, Undo All, Revert All,                */
-    /* and mode selector dropdown.                                              */
-    /* ------------------------------------------------------------------------ */
-    gcControlsDiv = jQuery(document.createElement('div')).addClass("js-button-row")
-                                                         .css({"paddingBottom" : "0",})
-                                                         .attr("id", "esControlsDiv");
-    /* ------------------------------------------------------------------------ */
-    /* Insert the Guess All and mode selector div into the form.                */
-    /* ------------------------------------------------------------------------ */
-    gcControlsDiv.appendTo($form.get(0));
-    /* ------------------------------------------------------------------------ */
-    /* Hide the "Add another track" checkbox's div.                             */
-    /* ------------------------------------------------------------------------ */
-    $("input[name='more_tracks']").parent().hide();
-    /* ------------------------------------------------------------------------ */
-    /* Calculate the total size of the Edit Suite files.                        */
-    /* ------------------------------------------------------------------------ */
-    /* From pre-load:   */
-    totalFileSize += 3133;        // scripts.css
-    totalFileSize += 47;          // jquery.ui.all.css
-    totalFileSize += 16498;       // ui.theme.css
-    totalFileSize += 298;         // ui.base.css
-    totalFileSize += 152;         // ui.progressbar.css
-    totalFileSize += 22948;       // all JQuery UI css images combined
-    if ($("#es-button6").length !== 0) { // Suite Settings
-        totalFileSize += 599;     // ui.tabs.js
-    }
-    totalFileSize += 4371;        // jquery.cookie.js
-    totalFileSize += 1146;        // switch.js
-    totalFileSize += 1516;        // switchcontrols.js
-    totalFileSize += 18384;       // es_main.js
-    currentLoadedSize = totalFileSize;
-    /* From lazy-load:  */
-    totalFileSize += 21119;       // jquery.jquery-ui.js
-    totalFileSize += 3454;        // es_stack.js
-    totalFileSize += 207;         // jquery.tooltip.css
-    totalFileSize += 8086;        // jquery.tooltip.js
-    totalFileSize += 23902;       // es_functions.js
-    totalFileSize += 13114;       // jquery.selectboxes.js
-    if ($("#es-button1").length !== 0) { // Guess Case
-        totalFileSize += 132970;  // es_names.js
-        totalFileSize += 229101;  // es_guess_case.js
-        totalFileSize += 11397;   // es_guess_case_panel.js
-    }
-    totalFileSize += 2514;        // jquery.dimensions.min.js
-    totalFileSize += 6782;        // jquery.impromptu.js
-    totalFileSize += 1478;        // jquery.impromptu.css
-    totalFileSize += 6643;        // jquery.inputHintBox.js
-    if ($("#es-button2").length !== 0) { // Undo / Revert
-        totalFileSize += 6913;    // es_undo_revert.js
-    }
-    if ($("#es-button3").length !== 0) { // Search / Replace
-        totalFileSize += 378;     // es_search_replace.js
-    }
-    if ($("#es-button4").length !== 0) { // Track Parser
-        totalFileSize += 500;     // es_track_parser.js
-    }
-    if ($("#es-button5").length !== 0) { // Style Guidelines
-        totalFileSize += 1877;    // es_style_guidelines.js
-    }
-    if ($("#es-button6").length !== 0) { // Suite Settings
-        totalFileSize += 273;     // es_suite_preferences.js
-    }
-    if ($("#es-urlfixer").length !== 0) { // URL AutoFixer
-        totalFileSize += 7514;     // es_suite_preferences.js
-    }
-    /* ------------------------------------------------------------------------ */
-    /* Lazy-load the Edit Suite files.                                          */
-    /* ------------------------------------------------------------------------ */
-    toBeLoaded.push("jquery.jquery-ui.js");
-    startLoad();
-    toBeLoaded.push("es_stack.js");
-    toBeLoaded.push("es_functions.js");
-    toBeLoaded.push("jquery.tooltip.css");
-    toBeLoaded.push("jquery.tooltip.js");
-    startLoad();
-    toBeLoaded.push("jquery.selectboxes.js");
-    toBeLoaded.push("jquery.inputHintBox.js");
-    if ($("#js-fieldset-gc-trigger-show").length !== 0) { // Guess Case
-        toBeLoaded.push("es_names.js");
-        toBeLoaded.push("es_guess_case.js");
-        toBeLoaded.push("es_guess_case_panel.js");
-        startLoad();
-    }
-    toBeLoaded.push("jquery.dimensions.min.js");
-    toBeLoaded.push("jquery.impromptu.js");
-    toBeLoaded.push("jquery.impromptu.css");
-    startLoad();
-    if ($("#es-ur").length !== 0) { // Undo / Revert
-        toBeLoaded.push("es_undo_revert.js");
-    }
-    if ($("#js-fieldset-sr-trigger-show").length !== 0) { // Search / Replace
-        toBeLoaded.push("es_search_replace.js");
-    }
-    if ($("#js-fieldset-tp-trigger-show").length !== 0) { // Track Parser
-        toBeLoaded.push("es_track_parser.js");
-    }
-    if ($("#js-fieldset-sg-trigger-show").length !== 0) { // Style Guidelines
-        toBeLoaded.push("es_style_guidelines.js");
-    }
-    if ($("#es-urlfixer").length !== 0) { // URL AutoFixer
-        toBeLoaded.push("es_URLfixer.js");
-    }
-    startLoad();
-    $('head').append('<script type="text/javascript" href="http://www.google.com/jsapi?key=ABQIAAAAutQrCy8v9EMhfZsC7lEANBSTu9g1Vv0xmF87JHH0oUgrycAWThRHDU_DQ9OlY04hXHLL-FL4RKHaKA"></style>');
-    /* -------------------------------------------------------------------------*/
-    /* Hide the load status indicator, now that all files have been loaded.
-    /* -------------------------------------------------------------------------*/
-    $(".js-progress-text").addClass("hidden");
-    /* -------------------------------------------------------------------------*/
-    /* Unhide the modules                                                       */
-    /*     (ensures that non-JQuery browsers never see the JS modules)          */
-    /* -------------------------------------------------------------------------*/
-    $modules.removeClass("hidden");
-});
diff --git a/root/static/scripts/common/es_names.js b/root/static/scripts/common/es_names.js
deleted file mode 100644
index 0a127e5..0000000
--- a/root/static/scripts/common/es_names.js
+++ /dev/null
@@ -1,1647 +0,0 @@
-var currentLetter,
-    placeList,
-    namesDict = ["macNames","firstNames","lastNames"];
-    namesDict.macNames = ["apostrophe","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
-    namesDict.macNames.apostrophe = "(a'challies|a'phearsain|a'phearsoin|o'Shannaig|o'shenag|o'shennaig)";
-    namesDict.macNames.a = "(abe|abee|abin|absolon|achaine|achallies|achan|achane|acharn|achern|acherne|achin|" +
-                           "achine|achounich|ada|adaidh|adaim|adam|adame|adams|addam|addame|addie|ade|adie|adoo|afee|affe|affer|affie|aichan|aid|" +
-                           "aig|aige|ailein|ailin|ailpein|ain|aindra|aindreis|ainish|ainsh|aiskill|aitchen|ala|alach|alar|alasdair|alastair|" +
-                           "alaster|alay|albea|aldonich|aldowie|aldowrie|aldowy|alduie|alear|aleerie|alees|alestar|alestare|alester|alestere|" +
-                           "alestir|alestre|alexander|aliece|alinden|alinton|alistair|alister|all|allan|allane|allar|allaster|allay|allestair|" +
-                           "allestar|allester|allestyr|alley|allister|allum|alman|almant|almont|alonan|aloney|alonie|alowne|alpain|alpie|alpin|" +
-                           "alpine|alpy|alpyne|alshonair|alshoner|alstar|alwraith|alyschandir|amelyne|amhaoir|amlain|anaba|anally|ance|andeoir|" +
-                           "andlish|andrew|andrie|andro|andy|ane|angus|anish|ann|annally|ansh|anstalcair|anstalkair|aoidh|aomlin|aonghus|aphie|" +
-                           "appersone|ara|ardie|ardle|ardy|aree|arlich|arliche|armick|arorie|arory|arquhar|arra|array|arthur|artnay|artney|" +
-                           "asgaill|asgill|asguill|ash|askel|askie|askill|askin|askle|aslan|asland|aslen|aslin|atee|ath|auchin|aughtrie|aughtry|" +
-                           "auihlay|aula|aulay|auld|aule|auley|auliffe|aull|aulla|aullay|aully|auselan|auslan|ausland|auslane|auslin|aver|avery|" +
-                           "aves|avis|avish|avoy|aw|awis|awishe|awla|awlay|aws|ay|aychin)";
-    namesDict.macNames.b = "(ba|bae|bain|baine|baith|bane|bard|bardie|barron|bartny|bathe|baxtar|baxter|bay|bayne|bea|bean|beane|beath|beatha|" +
-                           "beathy|bee|behan|beith|ben|beolain|berkny|bertny|beth|betha|bey|bheath|bheatha|bheathain|birney|birnie|birtny|blain|" +
-                           "blair|blane|braid|brain|braine|brair|braire|braten|bratney|bratnie|brayan|brayne|breck|breive|brennan|bretnach|" +
-                           "bretney|bretnie|bretny|breyane|breyne|briar|brid|bridan|bride|brieve|broom|bryd|bryde|bryne|burie|burney|burnie|byrne)";
-    namesDict.macNames.c = "(ca|caa|cabe|cachane|cachie|cachin|cadam|cadame|caddam|caddame|caddim|cadie|cadu|caell|caffe|caffer|cafferty|caffie|" +
-                           "caffir|caffrey|cagy|caibe|caichrane|caidh|caig|caige|cail|caill|cain|caincollough|caine|cainsh|cairlich|cairlie|" +
-                           "cairly|cairn|caish|caishe|cala|cale|caleb|calim|calister|call|calla|callan|callane|callar|callaster|callay|calley|" +
-                           "callie|callien|callion|callister|callman|callome|calloun|callow|callpin|callum|cally|calmain|calman|calme|calmin|" +
-                           "calmon|calmont|calpie|calpin|calppin|calpy|calpyne|caluim|calume|calvine|calvyn|calzean|camant|cambil|cambridge|" +
-                           "came|camey|camie|camiey|cammell|cammie|cammon|cammond|camon|cance|canch|canchie|candless|candlish|cane|canish|" +
-                           "caniss|cann|cannally|cannan|cannel|cannell|cannon|canrig|canrik|cans|canse|cansh|cants|caoidh|cara|carday|cardie|" +
-                           "cardney|cardy|cargo|carlach|carley|carlich|carliche|carlie|carlycht|carmick|carmike|carnochan|carquhar|carra|" +
-                           "carracher|carres|carron|carson|cartair|carter|carthy|cartnay|cartney|carty|cary|casgill|casguill|cash|caskall|" +
-                           "caskel|caskell|caskie|caskil|caskill|caskin|caskle|caskull|caslan|casland|caslane|caslen|caslin|casline|cathail|" +
-                           "cathay|cathie|cathy|cauchquharn|caueis|caug|caughan|caughtrie|caughtry|cauish|caul|caula|caulaw|caulay|cauley|" +
-                           "caull|cauly|cause|causland|cavat|cavell|cavis|cavish|cavss|caw|cawe|caweis|cawis|cawley|caws|cay|cayne|ceachan|" +
-                           "ceachie|ceallaich|ceasag|ceasaig|cellaich|cellair|celler|cenzie|ceol|cersie|cey|chaddy|chaffie|chananaich|chardaidh|" +
-                           "chardy|charles|charlie|cheachan|cheachie|cherlich|chesney|cheyne|chlerich|chlery|choiter|chomay|chombeich|chombich|" +
-                           "chomich|chonachy|chord|chormaig|chray|christian|christie|christy|chritter|chruimb|chruitar|chruiter|chrummen|" +
-                           "chruter|chruytor|chrynnell|chrystal|chrytor|chullach|churteer|chuthais|cill|cisaig|clachan|clachane|clacharty|" +
-                           "clacherty|clachlane|clachlene|clae|claffirdy|clagan|clagane|clagnan|claichlane|clain|claine|clairtick|clallane|" +
-                           "claman|clamon|clamroch|clan|clanachan|clanaghan|clanahan|clanan|clanaquhen|clandon|clane|clannachan|clannochan|" +
-                           "clannochane|clannoquhen|clanochan|clanochane|clanohan|clanoquhen|clansburgh|claran|claren|clarence|clarene|clarens|" +
-                           "claring|clarren|clarron|clarsair|clartie|clarty|clary|clatchie|clatchy|clathan|clauchlan|clauchlane|clauchlin|" +
-                           "claugan|clave|clawrane|clay|clayne|cleallane|clean|cleane|clearen|clearey|cleary|cleave|cleay|cleche|clees|cleiche|" +
-                           "cleilane|cleisch|cleish|cleishe|cleisich|clelan|clellan|clelland|clement|clements|clemont|clen|clenachan|clenaghan|" +
-                           "clenaghen|clenahan|clenane|clenden|clendon|cleneghan|clenighan|clennaghan|clennan|clennochan|clennoquhan|clennoquhen|" +
-                           "clenoquhan|cleod|cleoyd|clerich|cleriche|clerie|cleron|clery|clese|clester|cleud|cleve|clew|cleys|cliesh|climents|" +
-                           "climont|clingan|clinie|clinighan|clinnie|clintoch|clintock|clinton|clirie|cloaud|cloid|cloide|clonachan|clone|cloo|" +
-                           "cloor|clorty|clory|closkey|cloud|clour|cloy|cloyd|clucas|clue|clugash|clugass|clugeis|cluie|cluir|cluire|clullich|" +
-                           "clumpha|clung|clunochen|clure|clurg|clurich|cluskey|cluskie|clusky|clymond|clymont|clynyne|coag|coage|coaig|coal|" +
-                           "coan|coard|coasam|coch|cochran|cock|codruim|codrum|coel|coid|coinnich|coirry|coiseam|cole|coleis|colem|coleman|coll|" +
-                           "collea|colleis|collister|colloch|collom|collum|colly|colm|colmain|colman|colme|colmie|colmy|colum|comaidh|comais|" +
-                           "comas|comash|comb|combe|comber|combich|combie|combs|come|comes|comey|comiche|comick|comie|comish|comiskey|comok|" +
-                           "comtosh|comy|conacher|conachie|conachy|conaghy|conche|concher|conchie|conchy|condach|condachie|condachy|condie|" +
-                           "condochie|condoquhy|condy|conechie|conechy|conell|conich|conil|conile|conill|coniquhy|conkey|conl|conlea|connach|" +
-                           "connacher|connachie|connaghy|connal|connchye|connechie|connechy|connel|connell|connichie|connil|connill|connochie|" +
-                           "connoquhy|connquhy|connyll|conochey|conochie|conoughey|conquhar|conquhie|conquhy|conquy|cooish|cook|cool|corc|corcadail|" +
-                           "corcadale|corcadill|cord|cordadill|coren|cork|corkell|corker|corkie|corkil|corkill|corkindale|corkle|corley|cormack|" +
-                           "cormaic|cormaig|cormick|cormock|cormok|cornack|cornick|cornock|cornok|corqudill|corquell|corquhedell|corquidall|" +
-                           "corquidill|corquidle|corquodale|corquodill|corquydill|corrie|corron|corry|corvie|corwis|cory|cosch|cosh|cosham|" +
-                           "coshan|coshen|coshim|coshin|cosker|coskery|coskrie|coskry|cosram|coubray|coubrey|coubrie|couck|coug|couil|couk|" +
-                           "couke|coul|coulach|coulagh|coulaghe|coule|coull|coun|courich|court|couyll|cowag|cowan|cowatt|cowbyn|cowell|cowen|" +
-                           "cowig|cowil|cowir|cowis|cowl|cowlach|cowle|cowley|cown|cowne|coy|coyle|coynich|cra|crabit|craccan|crach|crachan|" +
-                           "crachen|crackan|cracken|crae|craich|craie|craikane|crain|craing|craith|craken|cran|crane|crary|crastyne|crath|cravey|" +
-                           "craw|cray|crea|creaddie|creadie|cready|creary|creath|creavie|creavy|creddan|credie|cree|creerie|creery|creich|creiff|" +
-                           "creigh|creight|creire|creirie|creitche|creith|crekan|crekane|crendill|crenild|creory|crerie|crery|crevey|crewer|crewir|" +
-                           "crie|crime|crimmon|crimmor|crindell|crindill|crindle|crire|cririck|cririe|cristal|criste|cristie|cristin|cristine|" +
-                           "criuer|crivag|criver|crobert|crobie|crokane|crom|cron|crone|crore|crorie|crory|croskie|crossan|crotter|crouder|" +
-                           "crouther|crow|crowther|croy|cruar|cruimein|cruithein|crum|crumb|crume|crumen|crumie|crundle|crunnell|cryndill|" +
-                           "cryndle|crynell|crynill|crynnell|crynnill|cuabain|cuag|cuaig|cuail|cuaill|cualraig|cuaraig|cubben|cubbin|cubbine|" +
-                           "cubbing|cubbon|cubein|cubeine|cuben|cubene|cubine|cubyn|cubyne|cucheon|cudden|cudie|cue|cueish|cuffie|cug|cuiag|" +
-                           "cuidhean|cuig|cuilam|cuile|cuimrid|cuinn|cuir|cuish|cuishe|cuistan|cuisten|cuistion|cuiston|cuithean|cuithein|cuk|" +
-                           "culey|culican|culigan|culigin|culikan|culiken|cullach|cullagh|cullaghe|cullaigh|cullan|cullauch|cullen|culley|" +
-                           "culliam|cullie|cullin|cullion|cullo|culloch|cullocht|cullogh|culloh|cullom|cullough|cullum|cully|culzian|cune|" +
-                           "cunn|cuoch|cur|curchie|curdie|curdy|cure|curich|curie|currach|curragh|currich|currie|curry|curtain|curthy|cusack|" +
-                           "cusker|cutchan|cutchen|cutcheon|cutchion|cuthaig|cuthan|cutheon|cwne|callum)";
-    namesDict.macNames.d = "(dade|daid|daniell|david|dermid|diarmid|donachie|donald|donalds|donleavy|donnell|dougall|drain|duff|duffie|dulothe|" +
-                           "dairmid|dairmint|danel|daniel|darmid|dearmid|dearmont|dermaid|dermand|derment|dermont|dermot|dermott|dhiarmaid|" +
-                           "dhomhnuill|dhonchaidh|dhonnachie|dhugal|dhughaill|diarmond|dill|dimslea|doaniel|dogall|dole|doll|donach|donachy|" +
-                           "donagh|donart|donchy|donell|donill|donnach|donnchaidh|donnel|donnill|donnslae|donnyle|donochie|donol|donoll|donough|" +
-                           "donquhy|donyll|dool|dormond|douagh|doual|douall|douell|dougal|dougald|doughal|dougle|doul|douny|douwille|douyl|dovall|" +
-                           "dovele|doville|dovylle|dowal|dowale|dowall|dowalle|dowele|dowell|dowelle|dowile|dowille|dowilt|dowll|dowylle|doyle|" +
-                           "dual|duall|duel|duffee|duffy|dugal|dugald|duhile|dule|dull|duncan|dunlane|dunleavy|dunlewe|dunslea|duoel|duphe|duthie|" +
-                           "duwell|duwyl)";
-    namesDict.macNames.e = "(eachan|eachern|eachin|eachran|earachar|elfrish|elheran|eoin|eol|erracher|ewan|eachain|eachainn|eachane|eacharin|" +
-                           "eacharne|eachearn|eachen|eacheran|eachine|eachnie|eachny|eachren|ealair|ean|eane|eanruig|eantailyeour|earacher|" +
-                           "echan|echeny|echern|echerns|echnie|eda|eddie|egie|einzie|eiver|elduff|eleary|eletyn|elfresh|elhatton|elherran|" +
-                           "ellar|ellere|elligatt|elpersoun|elrath|elroy|elvain|elveen|elwain|emlinn|enrick|entyre|enzie|eogan|eoghainn|" +
-                           "eoghann|eracher|erar|erchar|errocher|esayg|eth|ethe|etterick|ettrick|euchine|euen|euer|euir|eun|eur|eure|evan|" +
-                           "evar|even|ever|evin|evine|evoy|ewen|ewer|ewin|ewine|ewing|ewingstoun|ewir|ewn|ewyre)";
-    namesDict.macNames.f = "(fadzean|fall|farlane|farquhar|fater|feat|fergus|fie|fadden|faddrik|fade|faden|fadin|fadion|fadrick|fadwyn|" +
-                           "fadyean|fadyen|fadyon|fadzan|fadzein|fadzeon|faell|fagan|faid|fail|fait|faitt|faktur|fal|fale|fargus|farlan|" +
-                           "farland|farlen|farlin|farling|farquher|farsane|farsne|farson|fate|father|fatridge|fattin|faul|fauld|faull|" +
-                           "fayden|fayle|fead|feate|featers|fedden|federan|fedran|fedrice|fee|feeters|fegan|ferchar|ferlane|ferquhair|" +
-                           "ferquhare|ferries|ferson|fersoune|fetridge|fey|feyden|feye|fingan|fingon|fingone|finnan|finnen|finnon|fleger|" +
-                           "foill|forsoun|forsyth|frederick|frizzel|frizzell|frizzle|fuirigh|fuktor|fuktur|fun|funie|funn|fyall|fydeane|" +
-                           "fyngoun)";
-    namesDict.macNames.g = "(gaw|geachie|geachin|geoch|ghee|ghie|gilbert|gilchrist|gill|gilledon|gillegowie|gillivantic|gillivour|gillivray|" +
-                           "gillonie|gilp|gilroy|gilvernock|gilvra|gilvray|glashan|glasrich|gorrie|gorry|goun|gowan|gown|grath|gregor|" +
-                           "greusich|grewar|grime|grory|growther|gruder|gruer|gruther|guaran|guffie|gugan|guire|gaa|gabhawn|gachan|" +
-                           "gachand|gacharne|gachen|gachey|gachie|gachyn|gaghen|gaichan|gaithan|gal|gall|gannet|garadh|garaidh|garmorie|" +
-                           "garmory|garra|garrow|garva|garvey|garvie|gaskell|gaskill|gauchan|gauchane|gauchin|gaughrin|gaugie|gaukie|" +
-                           "gaulay|gavin|gawley|gaychin|ge|geachan|geachen|geachy|geaghy|geak|gechan|gechie|gee|geechan|geever|gehee|" +
-                           "geil|georaidh|george|geouch|germorie|geth|gethe|getrick|gettrich|gettrick|geuchie|gey|ghey|ghillefhiondaig|" +
-                           "ghilleghuirm|ghittich|ghobhainn|ghoill|ghowin|ghye|gibbon|gibbone|gibboney|gibon|gibonesoun|giboun|gibson|" +
-                           "gie|gigh|gilbothan|gilbride|gilcallum|gilchatton|gilchois|gilcreist|gilcrist|gildhui|gilduff|gildui|gile|" +
-                           "gilelan|gilevie|gilewe|gilfatrick|gilfatrik|gilfinan|gilfud|gilhosche|giligan|giliver|gilladubh|gillalane|" +
-                           "gillanders|gillandras|gillandrew|gillandrish|gillane|gillas|gillavary|gillavery|gillavrach|gillayne|gilldowie|" +
-                           "gille|gilleanan|gilleathain|gillebeatha|gillechallum|gillechaluim|gillechattan|gillecoan|gillecongall|" +
-                           "gilledow|gilleduf|gilleduibh|gillefatrik|gillefedder|gilleghuirm|gilleglash|gillegrum|gilleis|gillelan|" +
-                           "gillelane|gillemartin|gillemertin|gillemhicheil|gillemichael|gillemichel|gillemitchell|gillemithel|gillenan|" +
-                           "gilleoin|gilleon|gilleone|gilleoun|gilleoune|gillepartik|gillepatrick|gillepatrik|gillephadrick|gillephadruig|" +
-                           "gillequhoan|gillequhoane|gillereach|gillereith|gillereoch|gillery|gillese|gillevary|gillevoray|gillevorie|" +
-                           "gillevray|gillewe|gillewey|gillewhome|gillewie|gillewra|gillewray|gillewriche|gillewy|gillewye|gillfhaolain|" +
-                           "gillhois|gillibride|gillican|gillichalloum|gillichoan|gillichoane|gilliduffi|gilliegorm|gillies|gilliewie|" +
-                           "gillifudricke|gilligain|gilligan|gilligin|gilligowie|gilligowy|gillimichael|gillinnein|gilliondaig|gillip|" +
-                           "gilliphatrick|gilliquhome|gillirick|gillis|gillish|gilliue|gillivary|gilliveide|gilliver|gillivoor|gillivraid|" +
-                           "gillivrie|gillivry|gilliwie|gillmichell|gillmitchell|gillochoaine|gillogowy|gillolane|gillon|gillony|gillop|" +
-                           "gillowray|gilloyne|gillphatrik|gillreavy|gillreick|gillvane|gillvary|gillveray|gillvery|gillvra|gillvray|" +
-                           "gillyane|gilmartine|gilmichal|gilmichel|gilmor|gilnew|gilparick|gilphadrick|gilpharick|gilrey|gilroye|gilvane|" +
-                           "gilvar|gilvary|gilveil|gilvern|gilvernoel|gilvery|gilvie|gilvory|gilweane|gilwrey|gimpsie|gimpsy|ginnis|girr|" +
-                           "giver|givern|glade|gladrie|glagan|glashen|glashin|glassan|glasserig|glassin|glasson|glassrich|glauchlin|" +
-                           "glauflin|gleane|gledrie|gleish|glenaghan|glenan|glennon|glew|glone|glugas|goldrick|gomerie|gomery|gonnal|" +
-                           "gonnel|gooch|gorie|gorlick|gormick|gormock|gorre|gory|gouan|gougan|goune|govin|gow|gowen|gowne|gowy|gra|" +
-                           "grader|grae|grail|grain|granahan|grane|grasaych|grassych|grassycht|grasycht|graw|grayych|greagh|greal|green|" +
-                           "gregare|gregur|greigor|greil|greill|greische|greish|gresche|gresich|gressich|gressiche|greusach|greusaich|" +
-                           "grevar|grewer|griger|grigor|grigour|grimen|grimmon|grindal|groary|grouther|growder|gruaig|gruar|grudaire|" +
-                           "grudder|grundle|grury|gruthar|guaig|guarie|guarrie|gubb|gubbin|guckin|guffey|guffoc|guffock|guffog|guigan|" +
-                           "guill|guilvery|guin|guistan|gulican|gumeraitt|gunnion|guoga|gurgh|gurk|gurkich|gy|gybbon|gye|gyll|gyllepatric)";
-    namesDict.macNames.h = "(haffie|hardie|hardy|harold|hendrie|hendry|howell|hugh|hutchen|hutcheon|hael|haffey|haffine|hamish|hans|" +
-                           "harday|harg|harrie|harrold|harry|harvie|hatton|hay|hee|hendric|henish|henrie|henrik|henry|herlick|herloch|" +
-                           "herres|herries|heth|hethrick|hgie|hieson|hilliegowie|hillies|hilmane|hinch|hinzie|hlachlan|hnight|hoiter|" +
-                           "homas|homash|homie|honel|honichy|houat|houl|houle|houston|houtton|hpatrick|hquan|hquhan|hray|hrudder|hruder|" +
-                           "hrurter|hruter|huat|hucheon|hucheoun|huin|huiston|huitcheon|hulagh|hullie|hutchin|hutchison|hutchon|hutchoun|" +
-                           "hyntoys)";
-    namesDict.macNames.i = "(ian|ildowie|ilduy|illeriach|ilreach|ilrevie|ilriach|ilvain|ilvora|ilvrae|ilvride|ilwhom|ilwraith|ilzegowie|" +
-                           "immey|inally|indeor|indoe|innes|inroy|instalker|intosh|intyre|iock|issac|iver|ivor|iain|ikin|ilaine|ilandick|" +
-                           "ilaraith|ilarith|ilbowie|ilbraie|ilbreid|ilbrick|ilbryd|ilbuie|ilchattan|ilchoan|ilchoane|ilchoen|ilchombie|" +
-                           "ilchomhghain|ilchomich|ilchomie|ilchomy|ilchreist|ilchrom|ilchrum|ilchrumie|ilcrist|ilday|ildeu|ildeus|ildew|" +
-                           "ildonich|ildoui|ildowy|ildue|ilduf|ilduff|ilees|ileish|ilelan|ilendrish|ileollan|ilergan|ilerith|ileur|ilewe|" +
-                           "ilfadrich|ilfatrik|ilfun|ilghuie|ilglegane|ilguie|ilguy|ilhaffie|ilhagga|ilhane|ilhaos|ilhatton|ilhauch|ilhaugh|" +
-                           "ilhench|ilheran|ilherran|ilhois|ilhoise|ilhose|ilhouse|iliphadrick|ilishe|iliwray|illaine|illandarish|illandick|" +
-                           "illayn|illbride|illeain|illechallum|illees|illeese|illeglass|illeish|illeland|illenane|illepatrick|illephadrick|" +
-                           "illephedder|illepheder|illephudrick|illereoch|illereoche|illergin|illevorie|illewe|illewie|illfatrick|illfreish|" +
-                           "illfrice|illhois|illhos|illhose|illhuy|illichoan|illiduy|illimhier|illiruaidh|illon|illory|illreach|illreave|" +
-                           "illrevie|illrick|illvain|illveyan|illvra|illwrick|ilmanus|ilmartine|ilmeane|ilmeine|ilmertin|ilmeyne|ilmichael|" +
-                           "ilmichaell|ilmichall|ilmichell|ilmorie|ilmorrow|ilmoun|ilmune|ilmunn|ilna|ilnae|ilnaey|ilneive|ilnew|iloray|" +
-                           "iloure|ilpadrick|ilpatrick|ilpedder|ilquham|ilquhan|ilra|ilraich|ilraith|ilravey|ilravie|ilray|ilreath|ilreave|" +
-                           "ilrie|ilrith|ilrivich|ilroy|ilroych|iluraick|iluray|ilurick|ilvail|ilvaine|ilvane|ilvar|ilvayne|ilvean|ilveane|" +
-                           "ilveen|ilveerie|ilvern|ilvernock|ilvery|ilvian|ilvoray|ilvory|ilvra|ilvrach|ilvraith|ilvray|ilvreed|ilwain|" +
-                           "ilwaine|ilweine|ilwham|ilwhannel|ilwra|ilwraithe|ilwrathe|ilwray|ilwrick|ilwrith|immie|inair|inas|inayr|incaird|" +
-                           "inchruter|inclerich|inclerie|inclerycht|indeoir|indoer|inechy|ineskair|inesker|inferson|ingvale|inisker|inkaird|" +
-                           "inkeard|inlaintaig|inleaster|inleister|inlester|inlister|innesh|inneskar|innesker|inness|innis|innisch|innish|" +
-                           "innocater|innon|innowcater|innowcatter|innuer|innugatour|innuier|innyeir|inocader|instokir|instray|instrie|" +
-                           "instry|instucker|intagart|intagerit|intailyeour|intargart|intayleor|intaylor|inteer|inthosse|intioch|intire|" +
-                           "intoch|intoschecht|intoschie|intoschye|inturner|intyir|intyller|intylor|intyr|inuair|inuar|inuctar|inucter|" +
-                           "inuire|inuyer|invaille|invale|invalloch|inville|invine|iosaig|iphie|irvine|isaac|isaak|isack|isaick|isak|iseik|" +
-                           "ish|istalkir|ittrick|ivar|iverach|ivirach|iye)";
-    namesDict.macNames.j = "(james|jamis|janet|jannet|jarrow|jerrow|jiltroch|jock|jore)";
-    namesDict.macNames.k = "(kail|kames|kaskill|kay|keachan|keamish|kean|kechnie|kee|keggie|keith|kellachie|kellaig|kellaigh|kellar|kelloch|" +
-                           "kelvie|kendrick|kenrick|kenzie|keochan|kerchar|kerlich|kerracher|kerras|kersey|kessock|kichan|kieson|kiggan|" +
-                           "killigan|killop|kim|kimmie|kindlay|kinlay|kinley|kinnell|kinney|kinning|kinnon|kintosh|kinven|kirdy|kissock|" +
-                           "knight||k|ka|kaa|kaay|kadam|kadem|kadie|kaggie|kai|kaig|kaige|kaigh|kaill|kain|kainzie|kairlie|kairly|kaiscal|" +
-                           "kaiskill|kalar|kale|kalexander|kall|kalla|kallan|kallay|kallister|kalpie|kalpin|kame|kance|kandrew|kane|kanrig|" +
-                           "kantoiss|kants|kanyss|kanze|karas|kardie|karlich|kascal|kaskil|kaskin|kau|kaula|kauley|kaw|kawe|kawes|kbayth|" +
-                           "kbrid|kcaige|kchonchie|kcline|kconil|kconnell|kcook|kcoul|kcrae|kcrain|kcrow|kcrumb|kculloch|kdowall|ke|keachie|" +
-                           "keachy|keag|keand|keandla|keane|keanzie|kearass|keardie|kearlie|kearly|kearrois|kearsie|keaver|keay|kecherane|" +
-                           "kechern|kechran|kechrane|kechren|keddey|keddie|kedy|keech|keechan|keeg|keekine|keenan|keesick|keever|keevor" +
-                           "|kegg|keich|keig|keihan|keil|kein|keinezie|keinzie|keissik|keithan|keithen|keiver|keiy|kelar|kelbride|keldey|" +
-                           "keldowie|kelecan|kelegan|kelein|keleran|kelican|kell|kellaich|kellayr|keller|kellor|kelly|kelpin|kelrae|kelvain|" +
-                           "kelvey|kemie|kemmie|kemy|kena|kenabry|kendric|kendrich|kendrie|kendrig|kendry|kenen|keney|kenezie|kenich|kenie|" +
-                           "kenmie|kenna|kennah|kennan|kennane|kennay|kenney|kentase|kentyre|kenyee|kenyie|kenzy|keon|keowan|keown|keracher|" +
-                           "keracken|keraish|keras|kercher|kerdie|kerichar|kericher|kerley|kerliche|kerlie|kerloch|kermick|kern|kernock|" +
-                           "kerral|kerrel|kerricher|kerrin|kerris|kerron|kerrow|kersie|kersy|kesek|kesk|kessack|kessick|kessog|kessogg|" +
-                           "keswal|kethan|kethe|kethrick|ketterick|kettrick|keur|keurtain|kever|kevin|kevor|kevors|kew|kewan|kewer|kewin|" +
-                           "kewish|kewn|kewnie|kewyne|kewyr|key|keyoche|kfarlen|kghie|kgil|kglesson|khardie|khimy|khonachy|kiachan|kiaran|" +
-                           "kiarran|kibbin|kibbon|kick|kiddie|kie|kiech|kiehan|kigg|kildaiye|kildash|kilday|kilferson|kilhaffy|kilhoise|" +
-                           "kilican|kilikin|kill|killaig|kille|killeane|killenane|killhose|killiam|killib|killican|killicane|killichane|" +
-                           "killichoan|killigane|killigin|killimichael|killip|killmartine|killmichaell|killor|kilmichael|kilmichel|kilmine|" +
-                           "kilmon|kilmoun|kilmun|kilmune|kilmurray|kilpatrick|kilquhone|kilrae|kilrea|kilroy|kiltosche|kilvain|kilvane|" +
-                           "kilven|kilvie|kilwein|kilweyan|kilwraith|kilwrath|kilwyan|kimmy|kindel|kindew|kindle|kinfarsoun|kinin|kinish|" +
-                           "kinla|kinna|kinnay|kinnel|kinnen|kinnes|kinneskar|kinness|kinnie|kinnis|kinnoch|kinoun|kinsagart|kinshe|" +
-                           "kinstay|kinstrey|kinstrie|kinstry|kintaggart|kintaylzeor|kintishie|kintoch|kintoche|kintoisch|kintorss|kintyre|" +
-                           "kinyie|kinze|kinzie|kiock|kirchan|kirdie|kirsty|kisack|kiseck|kissack|kissek|kissick|kissoch|kistock|kithan|" +
-                           "kitterick|kittrick|kiver|kivers|kivirrich|kiynnan|kjames|klagan|klain|klan|klanachen|klanan|klane|klannan|" +
-                           "klarain|klawchlane|klawklane|klechreist|klehois|kleiry|klellan|klellane|klemin|klemurray|klen|klenden|klendon|" +
-                           "kleod|kleroy|klewain|klewraith|klin|klinnan|klowis|kluire|kmaster|kmillan|kmorran|kmunish|kmurrie|knabe|knach|" +
-                           "knacht|knae|knaer|knaight|knair|knaire|knaught|knaughtane|knawcht|knaycht|knayt|kne|kneach|kneale|knedar|knee|" +
-                           "kneicht|kneis|kneische|kneishe|knellan|kness|knicht|knie|knilie|knily|knish|knitt|knockater|knocker|knockiter|" +
-                           "knokaird|koen|komash|komie|kommie|komy|konald|kondachy|kone|konnell|konochie|kork|korkitill|korkyll|kornock|" +
-                           "kornok|kouchane|koull|koun|kowean|kowen|kowie|kowin|kowle|kowloch|kowloche|kowne|kownne|kowyne|kperson|kphaill|" +
-                           "kpharsone|kqueane|kquyne|kra|krachin|krae|kraith|kraken|kray|krayth|kreath|kree|kreiche|krekane|krenald|krenele|" +
-                           "krie|kritchy|krory|kuen|kuenn|kuerdy|kuffie|kuinn|kuir|kuish|kukan|kulagh|kulican|kullie|kulloch|kullouch|kune|" +
-                           "kuntosche|kunuchie|kure|kurerdy|kurkull|kurrich|kury|kush|kusick|kussack|kwarrathy|kwatt|kwhinney|kwilliam|ky|" +
-                           "kye|kygo|kym|kymmie|kynich|kynioyss|kynnair|kynnay|kynnayr|kynnell|kynnie|kyntagart|kyntaggart|kyntalyhur|" +
-                           "kyntoich|kyntossche|kyntoys|kyrnele)";
-    namesDict.macNames.l = "(lachlan|lae|lagan|laghlan|laine|lairish|lamond|lardie|lardy|laren|larty|laverty|laws|lea|lean|leay|lehose|" +
-                           "leish|leister|lennan|leod|lergain|lerie|leverty|lewis|lintock|lise|liver|lucas|lugash|lulich|lure|lymont|" +
-                           "labhrain|labhruinn|lachan|lachie|lachlainn|lachlane|lachlin|lackie|laerigh|laerike|laertigh|laffertie|lafferty|" +
-                           "lagain|lagane|lagen|laggan|laggen|lagine|laglan|laglen|lagone|laiman|lain|laine|lairen|lairtie|lalan|lalland|" +
-                           "lallen|lammie|lamon|lamont|lamroch|lanachan|lanaghan|lanaghen|landsborough|lane|lannachen|lanochen|lanoquhen|" +
-                           "laomuinm|laran|larin|laring|lartie|lartych|latchie|latchy|lauchan|lauchlan|lauchlane|lauchleine|lauchlen|" +
-                           "lauchlin|lauchrie|laugas|laughan|laughlan|laughland|laughlane|laughlin|lauren|laurent|laurin|laurine|lavor|" +
-                           "lawchtlane|lawhorn|lawmane|lawran|lawrin|lawrine|lay|layne|leand|leane|leannaghain|lear|leary|leash|leaver|" +
-                           "leerie|lees|leesh|leever|lefrish|lehoan|leich|lein|lelan|leland|lelane|lelann|lelen|lellan|lelland|lellane|" +
-                           "leman|lemme|lemon|lemond|len|lenaghan|lenane|lenden|lendon|lene|lenechen|lenochan|lentick|leoad|leoid|leot|" +
-                           "leougas|leran|lergan|lerich|lern|leron|leroy|lese|less|letchie|leud|leur|lewain|lewd|ley|lglesson|limont|lin|" +
-                           "linden|linein|linnen|lintoch|lish|liss|llauchland|lochlainn|lochlin|lockie|lode|loed|loghlin|loid|loir|lokie|" +
-                           "lolan|lolane|lonachin|lonvie|loon|loor|lorn|louchlan|loud|lougas|loughlin|louis|louvie|low|lowe|lowkas|loy|" +
-                           "loyde|lroy|lucais|lucase|luckie|lucky|lude|lugaish|lugane|lugas|lugeis|lugers|luggan|lugish|luguis|luir|luke|" +
-                           "lulaghe|lulaich|lulli|lullich|lullick|lumfa|lumpha|lung|lur|lurg|luskey|luskie|lusky|lwannell|lwhannel|lyn|" +
-                           "lyndon)";
-    namesDict.macNames.m = "(manus|martin|master|math|maurice|menzies|michael|millan|minn|monies|morran|munn|murchie|murchy|murdo|murdoch|" +
-                           "murray|murrich|mutrie||maghnuis|magister|magnus|mahon|main|maines|mainess|mains|malduff|man|manamy|manaway|" +
-                           "manes|manis|mann|mannas|mannes|mannus|mark|marquis|marten|martun|martyne|mathon|mayne|meachie|mean|means|" +
-                           "meechan|meekan|meeken|meekin|meeking|meikan|mein|meinn|men|menamie|menamin|menemie|menemy|menigall|mertein|" +
-                           "mertene|mertin|mhannis|mhaolain|mhathain|mhourich|mhuireadhaigh|mhuirich|mhuirrich|mhurchaidh|michan|micheil|" +
-                           "michell|michie|mickan|micken|mickin|micking|migatour|mikan|miken|milane|milland|millen|millin|millon|min|" +
-                           "mina|mine|minne|minnies|minnis|mitchel|mitchell|moil|molan|molane|molland|monagle|monnies|moran|morane|" +
-                           "mordoch|moreland|moren|morice|mories|morin|morine|moris|morland|moroquhy|morrane|morrin|moryn|moryne|" +
-                           "mowtrie|muckater|muiredhaigh|muiredhuigh|muirigh|mukrich|mulan|mulane|mullan|mullen|mullin|mullon|mulron|" +
-                           "munagle|muncater|muncatter|mune|mungatour|murachy|murchaidh|murchou|murd|murdon|murdy|muredig|murich|murphy|" +
-                           "murquhe|murquhie|murre|murree|murriche|murrie|murrin|murry|murrycht|murrye|murtchie|murtery|murtie|murtrie|" +
-                           "mury|mychel|mychele|mylan|myllan|myllane|myn|myne|mynneis)";
-    namesDict.macNames.n = "(nab|nair|namell|naughton|nayer|nee|neil|neilage|neiledge|neilly|neish|neur|ney|nider|nie|nish|niter|niven|" +
-                           "nuir|nuyer|nabb|nachdan|nacht|nachtan|nachtane|nachtin|nachton|nae|naght|naghtane|naghten|naicht|naichtane|" +
-                           "naight|nail|naill|nairn|nait|nakaird|nale|nally|namaoile|namil|namill|naoimhin|naois|naoise|nap|nar|nare|" +
-                           "narin|natt|naucater|nauch|nauche|nauchtan|nauchtane|nauchton|naught|naughtan|naughten|nauth|nauton|nay|" +
-                           "nayair|nayr|nayre|nea|neacail|neacain|neacden|neachdainn|neachden|neadair|neal|neale|neall|near|necaird|" +
-                           "nedair|nedar|nedyr|neel|neelie|neer|nees|neice|neid|neigh|neight|neill|neille|neillie|neir|neis|neische|" +
-                           "neiss|neit|neiving|nekard|nele|nelly|nely|nesche|neskar|nesker|ness|nett|nettar|nevin|newer|neyll|nial|" +
-                           "nicail|niccoll|nichol|nichole|nicholl|nicht|nickle|nicol|nicoll|nidder|niel|nielie|niff|night|nikord|" +
-                           "nillie|nily|nische|nitt|nivaine|noah|noaise|noble|nocaird|noder|nokaird|nokard|nokerd|nokord|nomiolle|" +
-                           "nomoille|norcard|norton|nougard|nowcater|nowcatter|noyar|noyare|noyiar|nucadair|nucater|nucator|nucatter|" +
-                           "nuctar|nuer|nuicator|nuire|nure|nutt|nvyr|nychol|nychole|nycholl|nysche)";
-    namesDict.macNames.o = "(|omie|omish|onie|oran|oull|ourlic|owen|owl|obyn|ochtery|ochtrie|ochtry|odrum|oisein|olaine|oldonich|oleane|" +
-                           "olmichaell|ologhe|olonie|olony|olphatrick|olrig|omelyne|onachie|onachy|onchie|ondochie|ondoquhy|onechy|onee|" +
-                           "oneill|onele|onhale|onill|onlay|onochie|onohie|orkill|ormack|orquidill|orquodale|oseanag|osenage|osennag|" +
-                           "osham|oshennag|oshenog|ostrich|ostrick|oual|ouat|ouhir|oul|oulie|oulric|oulroy|ourich|owan|owat|owis|owlache)";
-    namesDict.macNames.p = "(patrick|petrie|phadden|phater|phedran|phedron|pheidiran|pherson|phillip|phorich|phun|padane|paden|paid|paill|" +
-                           "parlan|parland|parlane|parlin|partick|patre|paul|paule|pawle|pearson|peeters|person|persone|personn|peter|" +
-                           "petir|petre|petri|phadan|phaddion|phade|phadein|phaden|phadraig|phadrick|phadrig|phadrik|phadruck|phadruig|" +
-                           "phadryk|phadzen|phael|phaell|phaid|phaide|phaidein|phaiden|phaidin|phail|phaile|phaill|phait|phale|pharheline|" +
-                           "pharick|pharlain|pharlane|pharson|phate|phatrick|phatricke|phatryk|phaul|phaull|phayll|pheadair|pheadarain|" +
-                           "phearson|pheat|phedar|pheddair|pheddrin|phedearain|phederan|phedrein|phee|pheidearain|pheidran|pheidron|" +
-                           "phell|phersen|phersone|phete|phial|phie|phiel|philib|philip|philipps|phingone|phoid|phune|phuney|phunie|" +
-                           "phunn|phuny|phyden|pilips)";
-    namesDict.macNames.q = "(qha|qhardies|qharter|qherter|qua|quaben|quade|quaid|quain|quaker|qualter|quan|quarie|quarrane|quarrey|" +
-                           "quarter|quat|quater|quatter|quattie|quatty|quay|quaynes|quckian|que|quean|queane|quee|queeban|queen|queeney|" +
-                           "queenie|quein|queine|queir|queiston|quen|quene|questen|queston|queyn|queyne|quhae|quhalter|quhan|quhannil|" +
-                           "quharrane|quharrie|quharry|quhartoune|quhat|quhatti|quhattie|quheen|quhen|quhenn|quhenne|quhenzie|quheritie|" +
-                           "quheyne|quhine|quhinny|quhinze|quhir|quhirertie|quhirirtie|quhirrie|quhirtir|quhirtour|quhirtoure|quhoire|" +
-                           "quhollastar|quhonale|quhonyle|quhore|quhorie|quhorre|quhorter|quhoull|quhriter|quhyn|quhyne|quhynze|quibben|" +
-                           "quibbon|quiben|quid|quie|quien|quikan|quilkan|quilliam|quiltroch|quin|quine|quinne|quinnes|quiod|quirter|" +
-                           "quistin|quiston|quithean|quitheane|quithen|quorcadaill|quore|quorie|quorn|quorne|quorquhordell|quorquodale|" +
-                           "quorquordill|quorrie|qurrie|quyre|qwaker|quaire|quarrie|quartie|quey|quhirr|quire|quistan|quisten|quoid)";
-    namesDict.macNames.r = "(rad|rah|raht|raill|railt|rain|raine|raing|ralte|ranal|ranald|randal|randall|randell|ranich|ranie|rankein|" +
-                           "rankine|ranking|rankyne|rannal|rannald|rau|raurie|ravey|raw|ray|rayne|re|rea|readie|ready|rearie|reary|" +
-                           "reath|reay|redie|ree|reekie|reiche|reil|reill|reirie|reith|renald|renold|rerie|reth|reull|revey|revie|rey|" +
-                           "reynald|reynold|reynolds|riche|richie|rie|rikie|rimmon|rindle|rinnell|rinnyl|ririck|riridh|ririe|ritchey|" +
-                           "ritchy|rither|robe|roberts|robi|robin|roderick|roe|roithrich|ronald|ronall|rone|rotherick|rourie|row|rowat|" +
-                           "rowatt|roy|royre|royree|royri|ruairidh|ruar|ruaraidh|ruary|rudder|rudrie|ruidhri|rurry|ruter|ryche|rynald|" +
-                           "rynall|ryndill|rynell|rynild|rypert|ryrie|ra|rach|rae|raild|raith|rankin|rath|ritchie|rob|robb|robbie|" +
-                           "robert|robie|rorie|rory|ruer|rurie|rury)";
-    namesDict.macNames.s = "(shannachan|shimes|simon|sorley|sporran|swan|sween|swen|symon|sagart|sata|sayde|scamble|scilling|setree|" +
-                           "seveney|sherry|shille|shimidh|shimie|shimmie|shirie|shirrie|shuibhne|skellie|skelly|skimming|sloy|soirle|" +
-                           "sorle|sorlet|sorlie|sorll|sorlle|sorrill|sorrle|souarl|staker|stalker|steven|stokker|suain|suin|swain|" +
-                           "swaine|swane|swanney|sweyne|swigan|swiggan|swyde|swyne)";
-    namesDict.macNames.t = "(taggart|tary|tause|tavish|tear|thomas|tier|tire|taevis|tagart|taggard|taggate|taggert|taggit|taldrach|" +
-                           "taldridge|taldroch|talzyr|tamhais|tarlach|tarlich|tarmayt|taveis|tawisch|tawys|teer|teir|ter|tere|terlach|" +
-                           "teyr|thamais|thamhais|thavish|thearlaich|thom|thomaidh|thomais|thome|thomie|thorcadail|thorcuill|thurkill|" +
-                           "toiche|tomais|torquedil|torquil|toschy|toshy|turk|tyr|tyre)";
-    namesDict.macNames.u = "(ulric|ure|ualraig|ualtair|uaraig|ubein|ubin|ubine|uidhir|uilam|uilleim|uir|uirigh|uish|uiston|ulagh|ulaghe|" +
-                           "ullie|ulloch|ulrich|ulrick|ulrig|une|urchie|urchy|urich)";
-    namesDict.macNames.v = "(vinie|vinnie|virrich|virriche|virrist|vitie|vittae|vittie|voerich|vorchie|voreis|voreiss|voreist|vorich|" +
-                           "voriche|voris|vorish|vorist|vorrich|vourich|vretny|vrettny|vurarthie|vurarthy|vurchie|vurirch|vuririch|" +
-                           "vurist|vurrich|vurriche|vurrish|vain|vaine|vale|vane|vannan|vannel|vararthy|vararty|varraich|varrais|" +
-                           "varrich|varrish|varrist|varthie|vat|vater|vaxter|vay|veane|veay|vee|veigh|veirrich|venish|vennie|verrathie|" +
-                           "vicker|vie|villie|vail|vanish|varish|veagh|vean|vey|vicar|vinish|vurich|vurie)";
-    namesDict.macNames.w = "(wade|waltir|warie|warish|wat|water|watt|watte|watter|wattir|watty|wean|weane|weeny|werarthe|werarthie|wete|" +
-                           "wha|whae|whan|whaneall|whanell|whanle|whanlie|whannall|whanne|whannel|whannil|whanrall|wharrie|whaugh|whaw|" +
-                           "wheir|whey|whin|whinn|whinney|whinnie|whir|whire|whirrie|whirtour|whiston|whonnell|whorter|whrurter|whunye|" +
-                           "why|whynie|whyrter|wiccar|wiggan|williame|williams|willie|winney|wirrich|wirriche|wirter|withean|withy|" +
-                           "worthie|wrarthie|wray|wrerdie|wurchie|wurie|wyllie|walrick|walter|wattie|whannell|whirr|whirter|william)";
-    namesDict.macNames.x = "";
-    namesDict.macNames.y = "(ye|yewin|yllecrist|ylory|ylroy|ylroye|ylveine|ynniel|ynstalker|ynthosche|ynthose|yntoch|yntoisch|yntyre|" +
-                           "ynwiss|yowin|ysaac|ysac|yuir|ywene)";
-    namesDict.macNames.z = "";
-    namesDict.firstNames = [];
-    namesDict.firstNames = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
-    jQuery.each(namesDict.firstNames, function(i) {
-        currentLetter = this;
-        namesDict.firstNames[currentLetter] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14];
-        jQuery.each(namesDict.firstNames[currentLetter], function(j) {
-            namesDict.firstNames[currentLetter][j] = "";
-        });
-    });
-    namesDict.firstNames.a[2] = "(ai|al)";
-    namesDict.firstNames.a[3] = "(abe|ace|ada|ade|adi|aja|alf|ali|ami|amy|ana|ann|ara|ari|art|asa|ava|avi|ayo)";
-    namesDict.firstNames.a[4] = "(abby|abel|abra|adah|adam|adan|aden|adia|adin|adm.|agda|ahab|aida|aila|aina|aine|aino|ajax|ajay|ajit|akio|" +
-                                "alba|alda|aldo|alec|alek|alex|alia|alla|ally|alma|alok|alon|alta|alun|alva|alys|amb.|amee|amie|amir|amit|amon|amos|" +
-                                "amya|anat|anca|andy|anil|anja|anju|anka|anke|anna|anne|anya|aqua|aram|arch|ares|aria|aric|arik|aris|arlo|arly|armi|" +
-                                "arne|arno|aron|arti|arun|arvo|åsa|åse|asha|ashe|asia|asma|atom|avia|avie|avis|axel|ayah|ayla|azra|azro|azul|akon|alan)";
-    namesDict.firstNames.a[5] = "(aanya|aaron|abasi|abbey|abbie|abbot|abdul|abner|abram|abril|acela|achim|adair|adão|addie|adela|adele|adell|adina|" +
-                                "adira|adlai|adler|adley|admon|adolf|adria|aedan|aegle|aerin|aeron|aeryn|aeson|afsha|afton|agnes|ahmad|ahmed|ahmya|" +
-                                "aidan|aiden|ailsa|aimee|aisha|ajani|akeem|akela|akina|akira|akito|akiva|aksel|alain|alana|alane|alani|alban|albin|" +
-                                "albus|alcee|alden|aldis|aleah|aleen|alena|alene|aleta|alexa|alexi|alfie|aliah|alice|alida|alika|aliki|alina|aline|" +
-                                "alisa|aliya|aliza|alize|allan|allen|allie|allyn|alohi|alois|alora|alpha|alpin|altea|alter|altha|alton|alura|alvah|" +
-                                "alvar|alvia|alvie|alvin|alvis|alwyn|alyce|alysa|alyse|amadi|amado|amaia|amaka|amana|amani|amara|amari|amasa|amata|" +
-                                "amaya|amber|amias|amina|amira|amity|amiya|ammie|ammon|amory|anahi|anali|anara|anaya|andon|andra|andre|aneem|angel|" +
-                                "angie|angus|anika|anisa|anita|aniya|annie|annis|anouk|ansel|anson|anthi|anton|anwen|aoife|apple|april|arati|arden|" +
-                                "ardis|areli|arely|ariah|ariel|arild|arjun|arlan|arlen|arley|arlie|arlin|arlis|armen|armin|arnav|arrie|arron|arrow|" +
-                                "artem|artie|artis|artur|arvel|arvid|arvil|arvin|arwen|aryan|asani|ashby|asher|ashli|ashly|ashok|aslan|aspen|aster|" +
-                                "astor|asuka|atara|atlas|atlee|auden|audie|audra|audry|aurea|autry|avery|aviva|avril|awnan|ayaka|ayana|aydan|ayden|" +
-                                "aydin|aylee|aylin|aziza|azuka)";
-    namesDict.firstNames.a[6] = "(a'mari|abdiel|abilee|acacia|acacio|acadia|achebe|adalee|adalia|adalyn|addien|adelia|adella|adelle|adelyn|aderyn|" +
-                                "aditya|adolfo|adolph|adonis|adreen|adrian|adriel|adrien|adryan|aelinn|aeneas|aerith|aeysha|afonso|agatha|agueda|" +
-                                "agurys|ahijah|ahlica|aidenn|aidric|ailbhe|aileen|ailish|ailith|airyck|aislin|aislyn|aiyana|akilah|alaina|alanis|" +
-                                "alanna|alaric|alayna|albany|albert|albina|aldric|alecia|aleena|aleida|alesha|alesia|aletha|alexei|alexia|alexis|" +
-                                "alexus|alexys|alford|alfred|aliana|alicia|alijah|alirah|alisha|alison|alissa|alivia|aliyah|allene|alline|allure|" +
-                                "almeda|almeta|almira|alonso|alonza|alonzo|altair|althea|alvaro|alvena|alvera|alvina|alycia|alysha|alysia|alyson|" +
-                                "alyssa|alyvia|amabel|amachi|amador|amadou|amalia|amalie|amanda|amaris|amelia|amelie|amerie|ameris|amiyah|amparo|" +
-                                "anabel|anahid|anaïs|anakin|ananda|anders|andrea|andrei|andres|andrew|andria|angela|angelo|anibal|anikah|anissa|" +
-                                "anitra|aniyah|anjali|anneke|anneli|annika|annora|anselm|ansley|anthea|antone|antony|antwan|antwon|aolani|apollo|" +
-                                "aquila|arafel|aramis|arandu|archer|archie|ardell|ardith|aretha|ariana|ariane|ariela|arilyn|arisha|arissa|arista|" +
-                                "arkady|arleen|arlene|arleth|arline|armand|armani|armida|armond|arnaud|arnold|arther|arthur|arturo|arvind|aryana|" +
-                                "asante|ashely|ashlee|ashley|ashlie|ashlyn|ashton|ashtyn|asmara|aspynn|asriel|astrid|athena|athlyn|aubree|aubrey|" +
-                                "aubrie|audrey|audrie|august|aurora|aurore|austen|austin|auston|austyn|autumn|avalon|avalyn|averie|averil|avital|" +
-                                "awilda|axelle|ayanda|ayanna|ayelet|azalea|azalia|azarel|azaria|azriel)";
-    namesDict.firstNames.a[7] = "(aagraha|aaliyah|aariyeh|abagail|abelard|abigail|abigale|abilene|abraham|absalom|absalon|adaline|adalynn|addison|" +
-                                "addisyn|addyson|adelard|adelina|adeline|admiral|adriana|adriane|aemilia|afsaneh|agathon|agustin|aidanne|ainsley|" +
-                                "aisling|aislinn|aiyanna|alabama|aladdin|alannah|alarice|alberic|alberta|alberto|alcaeus|alessia|alessio|alethea|" +
-                                "alexian|alexina|alexios|aleydis|alfonso|alfonzo|alfreda|alfredo|alibeth|alienor|allamea|allegra|alliree|allison|" +
-                                "allisyn|allorah|allyson|allyssa|alondra|alpheus|alverta|amadeus|amarion|amberly|ambrose|amelina|america|americo|" +
-                                "amidala|ananias|anatole|anatoly|andelyn|andreas|andreia|andrine|angeles|angelia|angelie|angelle|aniylah|annabel|" +
-                                "annalee|annamae|annelie|annelle|annetta|annette|anousha|anselmo|anthony|antione|antipas|antoine|antonia|antonin|" +
-                                "antonio|araceli|aracely|aragorn|arcadia|arcadio|ardella|ariadne|arianna|ariella|arielle|arienne|ariston|armando|" +
-                                "arnaldo|arnoldo|arnulfo|artemas|artemis|arvilla|aryanna|asashia|ashanti|ashlynn|assunta|asteria|astoria|atílio|" +
-                                "atlanta|atleigh|atticus|auberon|audrina|augusta|aurelia|aurelie|aurelio|aveline|averick|averley|avianna|avigail|" +
-                                "avonlea|azahara|azaryah|azucena)";
-    namesDict.firstNames.a[8] = "(aaryanna|abbigail|abdullah|abhishek|abigayle|abriella|abrielle|achilles|ackerley|adelaida|adelaide|adelbert|" +
-                                "adolphus|adrianna|adrianne|adrienne|aerolynn|agustina|akiryana|alasdair|alastair|albertha|aletheia|algernon|aliandra|" +
-                                "alistair|aloysius|alphaeus|alphonse|alphonso|amandine|amefleur|amethyst|ana-lisa|anabelle|anaëlle|analilia|anatolia|" +
-                                "anderson|angelica|angelina|angeline|angelise|angelita|anjelica|annabell|annalisa|annalise|annelies|annelise|annmarie|" +
-                                "anoushka|antigone|antonina|antonios|antonius|anugraha|aquilina|arabella|araminta|aranzazu|ashleigh|assumpta|athenais|" +
-                                "aubriana|audrieka|augustas|augusten|augustus|aurelian|aurelien|aurelius|avrielle)";
-    namesDict.firstNames.a[9] = "(aberforth|adalberto|agamemnon|aishwarya|albertine|alejandra|alejandro|alexander|alexandra|alexandre|alexandro|" +
-                                "amarantha|amaryllis|amberlynn|anacletus|anastacio|anastasia|andersonn|androcles|andromeda|angelique|anjanette|" +
-                                "annabella|annabelle|annaliese|annamarie|anneliese|annemarie|antonella|antonetta|antonette|aoibheann|apollonia|" +
-                                "apostolos|archibald|aristides|aristotle|artemisia|astrophel|athanasia|aubrielle|augustine)";
-    namesDict.firstNames.a[10] = "(abbiegayle|adetokunbo|alejhandra|aleksandra|alessandra|alessandro|alexandrea|alexandria|alexandros|alexzander|" +
-                                "altagracia|ambassador|amberosity|anastasios|anastasius|anna-lucia|anne-marie|antoinette|antonietta|archimedes|" +
-                                "athanasios|auryestela)";
-    namesDict.firstNames.a[11] = "(alejandrina|allurarayne)";
-    namesDict.firstNames.b[2] = "(bo)";
-    namesDict.firstNames.b[3] = "(bay|baz|ben|bly|bob|br.|bud)";
-    namesDict.firstNames.b[4] = "(barb|bart|baya|bayo|bear|beau|beck|bell|bert|bess|beth|bill|birk|blas|blue|boaz|bode|bond|boyd|brad|bram|brea|bree|" +
-                                "bret|bria|bron|bryn|buck|burl|burn|burt|buzz)";
-    namesDict.firstNames.b[5] = "(baden|baeli|baird|baker|balin|bambi|banjo|barak|baron|baron|barry|basia|basil|basim|basma|beata|becky|béla|belen|" +
-                                "bella|belle|belva|benno|benny|berit|bernt|berry|berta|beryl|betsy|bette|betty|bevan|bijou|bilal|billy|bindu|birch|" +
-                                "birna|bjorn|blade|blair|blake|blane|blaze|bliss|bobbi|bobby|boden|bodie|bonny|boris|bowen|boyce|brady|brant|brent|" +
-                                "brett|brian|briar|brice|brien|brier|brisa|brita|britt|brock|brody|bronx|brook|brown|bruce|bruno|bryan|bryce|brynn|" +
-                                "bryon|bubba|buddy|buffy|bulah|burke|butch|byron)";
-    namesDict.firstNames.b[6] = "(bailee|bailey|bakari|bannon|barack|baraka|barbie|barbra|barker|barney|barron|bartek|barton|baruch|bascom|bashir|" +
-                                "baxman|baxter|bayard|baylee|belina|benita|benito|bennet|bennie|benoit|benson|bently|benton|beriah|bernie|bertha|" +
-                                "berthe|bertie|berton|besnik|bessie|bethan|bethel|betrys|bettie|bettye|beulah|bianca|billie|billye|birdie|birger|" +
-                                "birgit|bishop|bishop|bjarne|bladen|blaine|blaise|blanca|blanch|blayze|blithe|blythe|bobbie|bobbye|bohdan|bonita|" +
-                                "bonnie|booker|bosten|boston|bowman|braden|bradly|bradyn|brandi|brandt|brandy|branna|brayan|breana|breann|breeze|" +
-                                "brenda|brenna|brenyn|briana|bridie|briggs|brigid|briley|briony|brison|britni|britta|brnss.|brodee|broder|brodie|" +
-                                "brogan|brooke|brooks|bryana|bryant|brycen|bryden|brylee|brynja|bryony|bryson|buddie|buford|bunnie|burley|burton|buster)";
-    namesDict.firstNames.b[7] = "(babette|baldwin|barbara|barclay|barnaby|barnard|barrett|basilio|bastien|beatrix|beatriz|beaulah|beckett|beckham|" +
-                                "bedelia|belinda|bellamy|bennett|bentley|berkley|bernard|bernice|bernita|bertram|bethany|bettina|beverly|billana|" +
-                                "blakely|blanche|blossom|bluford|bogumil|boudica|bozeman|bracken|bradley|braeden|braedin|braedon|braedyn|braelyn|" +
-                                "braiden|brandan|brandee|branden|brandie|brandon|brandyn|brannon|branson|branwen|braulio|braxton|brayden|braydon|" +
-                                "braylon|breanna|breanne|brecken|breckin|breckyn|brendan|brenden|brendon|brennan|brennen|brennon|brenton|breonna|" +
-                                "brianna|brianne|bridger|bridget|briella|brielle|brigham|brinley|brionna|bristol|britany|britney|brittni|brittny|" +
-                                "britton|bronson|bronwen|bronwyn|brother|bryanna|brynlee|buckley|burgess|burnell|burnice)";
-    namesDict.firstNames.b[8] = "(barnabas|baroness|bayleigh|beatrice|belarius|benedict|benedito|benjamin|berenice|berkeley|bernardo|berneice|bernhard|" +
-                                "berniece|berthold|bertrand|beverlee|beverley|beyoncé|birgitta|blakelyn|bradford|brannock|bridgett|brigette|brighton|" +
-                                "brigitta|brigitte|briseïs|brittani|brittany|brittney|brooklyn|brouklyn|brunilda|bryleigh|brynnley|burdette)";
-    namesDict.firstNames.b[9] = "(balthazar|balvinder|bathsheba|bellarosa|bellatrix|bernadine|bethannie|bre'aujee|breehanna|bridgette|brittanie|" +
-                                "broderick|bronislaw|brooklynn)";
-    namesDict.firstNames.b[10] = "(beauregard|bellefleur|bernadette|bernardine|bienvenido|blodeuwedd|bree'undra)";
-    namesDict.firstNames.b[11] = "(bartholomew|bénédicte|brookelynne)";
-    namesDict.firstNames.c[3] = "(cab|cal|che|coy|cpo)";
-    namesDict.firstNames.c[4] = "(cade|cael|cain|cale|cali|cara|cari|carl|cary|case|cash|cate|cato|ceil|chad|chaz|cher|chet|chip|cian|ciro|clay|clem|" +
-                                "cleo|clio|cloe|coby|coco|cody|col.|cole|colm|colt|cora|cori|cory|coty|cpl.|cpt.|crew|cris|cruz|curt|cyra)";
-    namesDict.firstNames.c[5] = "(cabot|caden|cadyn|cairo|caleb|calen|calix|calla|cally|calum|camas|cameo|candi|candy|cappy|capt.|caren|carey|carie|" +
-                                "carla|carli|carlo|carly|carma|carol|caron|carri|caryl|caryn|carys|casey|casia|casie|cason|caten|cathi|cathy|catie|" +
-                                "cayla|ceara|cecil|cedar|celia|cerys|cesar|chace|chadd|chaim|chan.|chana|chani|chase|chava|chaya|cheaa|cheri|chevy|" +
-                                "chima|china|chloe|chris|chuck|chyna|ciara|cielo|ciena|ciera|cinda|cindi|cindy|clair|clara|clare|clark|claud|claus|" +
-                                "cleon|cleta|cleve|cliff|clint|clive|cloud|cloyd|clyde|cmdr.|codey|codie|cohen|colby|coley|colin|conan|conor|coral|" +
-                                "corby|corey|corin|cosme|cosmo|count|cowan|craig|crash|creda|creed|crews|croix|cynan|cyndi|cyril|cyrus)";
-    namesDict.firstNames.c[6] = "(caddie|caelan|caesar|caiden|cailyn|cainan|caitee|calder|calico|callan|callie|callum|calvin|camden|camdyn|camila|" +
-                                "camilo|camren|camrin|camron|camryn|canaan|candis|candra|cannon|canton|canyon|carden|caress|carina|carisa|carlee|" +
-                                "carley|carlie|carlos|carmel|carmen|carole|carrie|carrol|carryn|carson|carter|carver|carwyn|caspar|casper|cassia|" +
-                                "cassie|cassio|cathal|cathey|cathie|catina|catrin|cayden|caylee|caylen|cayley|cecile|cecily|cedric|celina|celine|" +
-                                "cesare|chaiza|chance|chanda|chanel|charis|charla|charly|chaska|chelsi|chenoa|cherie|cherri|cherry|cheryl|chiara|" +
-                                "chiron|chloey|chunda|ciaran|cicely|cicero|cierra|claira|claire|clancy|claren|claude|claudy|cleora|cletus|cliona|" +
-                                "clover|clovis|cntss.|colden|coleen|collin|colman|colson|colten|colter|coltin|colton|colwyn|conall|conley|conner|" +
-                                "connie|connor|conrad|conroy|conway|cooper|copper|corban|corbin|corder|cordia|cordie|corene|corina|corine|cormac|" +
-                                "corrie|cortez|corwin|cosima|cosimo|coster|costin|creola|crissy|cristy|cronan|csilla|cullen|curran|curtis|cutler|" +
-                                "cynara|cypher)";
-    namesDict.firstNames.c[7] = "(cadence|cadogan|caedmon|caetano|caihong|caillou|caitlin|caitlyn|caitria|caleigh|calista|cambria|camelia|cameron|" +
-                                "camilla|camille|camillo|candace|candice|candida|candido|caoimhe|caprice|captain|cardiff|caridad|carissa|carleen|" +
-                                "carlene|carlota|carlton|carlyle|carmela|carmelo|carmina|carmine|carnell|carolee|carolyn|carroll|carsten|casimer|" +
-                                "casimir|caspian|cassidy|cassius|cathryn|catrina|caydran|cayenne|cecelia|cecilia|cecilie|cecilio|cedrick|celenia|" +
-                                "celeste|challen|chandra|chandry|channer|chantal|chantel|chapln.|charity|charlee|charles|charley|charlie|charsey|" +
-                                "chasity|chaucer|chayton|chellis|chelsea|chelsee|chelsey|chelsie|cherise|cherish|cherith|cheryle|chesley|chesney|" +
-                                "chester|chihiro|chloris|chrissy|christa|christi|christy|cillian|ciprian|citlali|citrine|clarice|clarine|clarion|" +
-                                "clarisa|clarity|claudia|claudie|claudio|clayten|clayton|clellan|clemens|clement|clemmie|clifton|clinton|clodagh|" +
-                                "coleman|colette|colleen|collier|colonel|columba|connell|connery|copland|coralie|corazon|corbett|cordell|corelia|" +
-                                "coretta|corinna|corinne|corliss|cornell|corrine|cortney|cosette|cosmina|coulter|craigan|crayton|crispin|crispus|" +
-                                "cristal|cristin|crystal|currier|curtiss|cynthia|cyprian|cyrille)";
-    namesDict.firstNames.c[8] = "(caitlann|caitlynn|calandra|calantha|calanthe|callahan|calleigh|calliope|callisto|camellia|camillia|campbell|" +
-                                "carleton|carlisle|carlotta|carmella|carolann|carolina|caroline|carolynn|carrigan|casandra|casanova|cassilda|catalina|" +
-                                "catarina|caterina|cathleen|cathrine|catriona|chadrick|chadwick|champion|chandell|chandler|chanelle|channing|chaplain|" +
-                                "charisma|charissa|charisse|charleen|charlene|charline|charlize|charvala|chastity|chauncey|chestina|cheyanne|cheyenne|" +
-                                "chiarina|chiquita|christal|christel|christen|christie|christin|christof|christos|chrystal|cimarron|cinnamon|citlalli|" +
-                                "clarance|clarence|claribel|clarinda|clarissa|clarisse|claudine|claudius|clematis|clemency|clemente|cleophas|clifford|" +
-                                "cliodhna|clotilde|collette|columbus|concetta|connolly|constant|consuela|consuelo|coolidge|coppelia|coraline|cordelia|" +
-                                "cornelia|cornelio|corporal|corrigan|cortland|countess|courtlyn|courtney|crawford|cresence|cressida|crighton|cristian|" +
-                                "cristina|crockett)";
-    namesDict.firstNames.c[9] = "(caledonia|carmelita|cassandra|cassandre|catharine|catherine|celestina|celestine|celestino|chantelle|chantilly|" +
-                                "charlotte|charmaine|charnette|christeen|christene|christian|christina|christine|christmas|claiborne|claudette|" +
-                                "cleopatra|cleveland|clothilde|commander|constance|constanza|corabelle|corisande|cornelius|cristobal|cristofer)";
-    namesDict.firstNames.c[10] = "(candelario|carrington|chancellor|chancellor|chardonnay|charilette|charleston|charolette|christabel|christiana|" +
-                                "christiane|christophe|chrysantha|cinderella|clarabelle|clementina|clementine|concepcion|constantin|cristopher|cuauhtemoc)";
-    namesDict.firstNames.c[11] = "(cecelia-rae|charlesnika|charminique|christoffer|christopher|connecticut|constantine)";
-    namesDict.firstNames.c[12] = "(clytemnestra|constantinos)";
-    namesDict.firstNames.d[3] = "(dag|dan|dax|dee|del|dex|dia|doc|don|dov|dr.)";
-    namesDict.firstNames.d[4] = "(dale|daly|dana|dane|dara|dash|dave|davy|dawn|daya|dean|dean|debi|deja|dell|demi|dena|deon|dian|dick|dicy|dina|dink|" +
-                                "dino|dion|dirk|disa|diya|dock|dona|donn|dora|dori|dory|doug|dove|drew|drs.|duff|duke|duke|dyan)";
-    namesDict.firstNames.d[5] = "(d'nai|daeja|dafna|dafne|dagny|daija|daisy|dalee|dalia|damon|danae|dania|danna|danny|dante|danya|darbi|darby|darci|" +
-                                "darcy|daren|daria|darin|dario|darla|daron|daryl|dasia|davey|david|davie|davin|davis|davon|dawna|dayal|dayna|deana|" +
-                                "deane|deann|debbi|debby|debra|dedra|deena|deion|dejah|delia|della|delma|delta|denis|denny|derek|deric|derik|deron|" +
-                                "deuce|devan|deven|devin|devon|devra|devyn|dewey|diana|diane|diann|diara|diego|dilip|dilys|dimos|dinah|dineo|diogo|" +
-                                "divya|dixie|dixon|dodie|dolly|donal|donna|donny|donta|donte|doran|dorin|doris|dorit|doron|dovie|doyle|draco|drake|" +
-                                "duane|dugan|dulce|dusti|dusty|dutch|dwain|dwane|dwyer|dylan|dylen|dylon)";
-    namesDict.firstNames.d[6] = "(daelyn|dagmar|dahlia|daichi|daisha|dakari|dakota|dalila|dallan|dallas|dallin|dalton|dameon|damian|damien|damion|" +
-                                "damita|danara|dandre|danial|danica|daniel|danika|danila|danilo|danita|dannie|daphna|daphne|daquan|darbie|darcie|" +
-                                "darell|darian|darien|darion|darius|darold|darrel|darren|darrin|darron|darryl|darwin|daryle|daunte|daveth|davian|" +
-                                "davina|davion|dawson|daxton|dayana|dayton|deacon|deanna|deanne|deasia|debbie|debbra|debora|debrah|declan|dedric|" +
-                                "deedee|deepak|deidra|deidre|dejuan|delano|delina|delisa|delmar|delmas|delmer|delois|delpha|delton|delvan|delvin|" +
-                                "demond|denali|deneen|denham|denice|denisa|denise|dennie|dennis|denton|denver|denzel|denzil|deonte|dequan|dereck|" +
-                                "derick|dermot|dervla|derwin|deshae|dessie|destin|destry|detlef|detlev|devlin|dewitt|dexter|deylan|dezzie|dianey|" +
-                                "dianna|dianne|dickie|dickon|didier|diello|diesel|dieter|dillan|dillon|dimple|dinesh|dionne|dionte|divine|django|" +
-                                "djimon|dobbin|dollie|donald|donato|donell|donita|donnie|dontae|donver|dorcas|doreen|dorene|dorian|dorine|dorman|" +
-                                "dorris|dorsey|dortha|dorthy|dottie|dougal|dougie|dragos|draken|draper|draven|dublin|dudley|dulcia|dulcie|duncan|" +
-                                "dustin|dwaine|dwayne|dwight|dyllan|dyllon)";
-    namesDict.firstNames.d[7] = "(daciana|daisuke|dakotah|damaris|damiana|danelle|danette|dangelo|daniela|darleen|darlene|darline|darnell|darragh|" +
-                                "darrell|darreth|darrian|darrick|darrien|darrion|darrius|darshan|dashawn|daveney|davette|davonte|deandre|deborah|" +
-                                "dedrick|deeanna|deirdre|delaney|delbert|delfina|delight|delilah|delores|deloris|delphia|demarco|demario|dempsey|" +
-                                "denholm|denisse|deondre|deontae|deontay|derrell|derrick|deshaun|deshawn|desirae|desirea|desiree|desmond|despina|" +
-                                "destany|destini|destiny|devanie|devante|devinne|devonta|devonte|dewayne|diamond|diantha|diggory|dilbert|dillard|" +
-                                "dillion|dimitra|dimitri|dinitia|dohosan|dolores|doloris|dolphus|domenic|dominga|domingo|dominic|dominik|donaldo|" +
-                                "donavan|donavon|donnell|donovan|dorathy|doretha|dorinda|dorotha|dorothy|douglas|dresden|dunstan|durward|durwood|" +
-                                "duwayne|dy-anne)";
-    namesDict.firstNames.d[8] = "(damarion|daniella|danielle|danyelle|dashiell|datryann|dayanara|deangelo|december|delphina|delphine|demarcus|demarion|" +
-                                "demetria|demetris|dennison|desabela|destinee|destiney|devontae|diarmuid|dietrich|dimitris|dionisio|domenica|domenick|" +
-                                "domenico|domicela|dominica|dominick|dominque|donnelly|dorothea|douglass|dragomir|drucilla|drusilla|dulciana|dulcinea|" +
-                                "dumisani)";
-    namesDict.firstNames.d[9] = "(dayshanet|delphinia|demetrice|demetrius|desdemona|desiderio|dickinson|dimitrios|dominique|domonique|donatella)";
-    namesDict.firstNames.d[10] = "(dulcibella)";
-    namesDict.firstNames.d[11] = "(diamondnique)";
-    namesDict.firstNames.e[2] = "(ed)";
-    namesDict.firstNames.e[3] = "(ean|ebb|eda|edd|eli|emi|ena|era|eva|eve)";
-    namesDict.firstNames.e[4] = "(earl|ebba|eben|echo|edda|eddy|eden|edge|edie|edna|egan|egil|egon|ehud|eiel|eino|elam|elan|elba|elda|elia|elin|elio|" +
-                                "elis|elke|ella|elle|elma|elmo|elna|elon|eloy|elsa|else|elta|elva|elza|emet|emil|emma|emmy|enid|enos|ens.|enya|enzo|" +
-                                "eoin|eric|erik|erin|eris|erma|erna|eron|eryn|esai|esha|esli|esme|esta|etha|etta|eula|euna|eura|evan|ever|evie|evon|" +
-                                "ewan|exie|ezra)";
-    namesDict.firstNames.e[5] = "(eames|eamon|earle|early|eboni|ebony|eddie|edgar|edina|edith|edmar|edric|edrie|edsel|edwin|edyth|effie|efren|einar|" +
-                                "elana|elden|eldon|elena|eleni|eleri|elgar|elgin|eliah|eliam|elian|elias|elida|eliel|elihu|elina|eline|eliot|elisa|" +
-                                "elise|eliya|eliza|elkan|ellen|ellie|ellis|ellyn|elmer|elois|elora|elroy|elsie|elton|elvia|elvie|elvin|elvis|elwin|" +
-                                "elwyn|elyse|elzie|ember|embry|emeka|emely|emery|emile|emily|emlyn|emmet|emmie|emmit|emory|emrys|ender|ennis|enoch|" +
-                                "enola|eowyn|erica|erich|erick|erika|erion|ernie|ernst|errol|ervin|erwin|eskil|espen|essie|estel|ester|ethan|ethel|" +
-                                "ethen|ethna|ethne|ethyl|etter|ettie|eulah|evans|evert|evora|ewald|ewell|ewing|eyana|ezell)";
-    namesDict.firstNames.e[6] = "(eamonn|earlie|easter|easton|edison|edmond|edmund|edward|edwina|edythe|efraim|efrain|eileen|eilidh|eirlys|eithne|" +
-                                "eladio|elaina|elaine|elanor|elayne|elbert|eldora|eldred|elease|electa|elenor|eliana|eliane|elijah|elinor|eliora|" +
-                                "eliseo|elisha|eliska|elissa|ellery|elliot|elmira|elmore|elnora|elodie|eloisa|eloise|elvera|elvira|elwood|elyssa|" +
-                                "emalee|emelia|emelie|emeric|emilee|emilia|emilie|emilio|emmett|emmitt|enapay|endrit|eneida|enjoli|enrico|ensign|" +
-                                "eoghan|ephron|eragon|erasmo|eriana|ericka|erlene|erling|ernest|estela|estell|esther|euclid|eudora|eugene|eunice|" +
-                                "evadne|evalyn|evelia|evelin|evelyn|everly|evette|evolet|evonne)";
-    namesDict.firstNames.e[7] = "(earlene|earline|earnest|eastman|edgardo|edmonia|edoardo|eduardo|edwardo|éilís|eilonwy|eleanor|eleazar|electra|" +
-                                "elektra|elenora|elfrida|eliarys|eliezer|elinore|ellamae|elliott|ellison|ellwood|elouise|elsbeth|elspeth|emanuel|" +
-                                "emeline|emerald|emerson|emmalee|emmarie|emogene|enrique|ephraim|erasmus|erastus|erlinda|ernesto|erskine|esmeray|" +
-                                "essence|esteban|estella|estelle|estevan|ethelyn|etienne|eugenia|eugenie|eugenio|eulalia|eulalie|eusebio|eustace|" +
-                                "evalina|evander|evdokia|evelina|eveline|evelyne|evening|everard|everest|everett|everley|ezekiel)";
-    namesDict.firstNames.e[8] = "(ebenezer|edelmira|edgerton|eibhlín|eldridge|eleanora|eleanore|elfrieda|elisabet|elisavet|elisheba|elisheva|ellorial|" +
-                                "elyannah|emanuele|emiliano|emmajean|emmaline|emmanuel|emmelina|emmeline|emmerson|emmersyn|endymion|epifanio|erendira|" +
-                                "estefani|estefany|estember|estrella|eternity|ethelene|euphemia|evanesca|evanthia|everardo|everette|ezequiel)";
-    namesDict.firstNames.e[9] = "(efthimios|eglantine|ekaterina|ekaterini|elisabeth|elizabeth|ellington|ellsworth|enriqueta|ernestina|ernestine|" +
-                                "esmeralda|esperanza|estefania|evangelos|everleigh)";
-    namesDict.firstNames.e[10] = "(earnestine|elizabella|elizabelle|emmanuelle|ermengarde|evangelina|evangeline)";
-    namesDict.firstNames.f[3] = "(fae|fay|fia|flo|fox|foy|fr.)";
-    namesDict.firstNames.f[4] = "(fate|fawn|faye|femi|fern|fife|fifi|finn|fion|flem|flor|floy|ford|fran|frau|fred)";
-    namesDict.firstNames.f[5] = "(fabio|fairy|faith|faiza|falco|fanny|farid|faron|felix|femke|ferne|ffion|fidel|finis|fiona|fionn|fiora|fleta|fleur|" +
-                                "flint|floyd|flynn|foley|fonda|fotis|frank|franz|freda|fredy|freja|freya|friar|frida|fritz|frost)";
-    namesDict.firstNames.f[6] = "(fabian|fabien|faisal|fallon|fannie|farida|fariji|farrah|father|fatima|felice|felipa|felipe|felton|fergus|fermin|" +
-                                "ferrin|ferris|finbar|finian|finlay|finley|finola|fintan|fisher|flavia|flavio|florin|forbes|forest|foster|fotini|" +
-                                "franco|fraser|freddy|freeda|freema|freida|frieda|furman)";
-    namesDict.firstNames.f[7] = "(fabiana|fabiola|fabrice|fairfax|fairlie|fairuza|farrell|farrier|feather|felecia|felicia|felisha|fenella|fenisia|" +
-                                "fennell|fernand|filippo|finnian|firenze|florene|florian|florida|florine|florrie|flossie|forrest|frances|francis|" +
-                                "frankie|frannie|frasier|frazier|freddie|fredric|freeman)";
-    namesDict.firstNames.f[8] = "(fabienne|fabriana|fabricio|fabrizio|fairamay|fantasia|faulkner|faustine|faustino|federico|felicita|felicity|ferguson|" +
-                                "fernanda|fernando|fielding|filomena|finnegan|fiorenza|flannery|fletcher|florence|forester|foxglove|francine|franklin|" +
-                                "franklyn|frederic|fredrick)";
-    namesDict.firstNames.f[9] = "(ferdinand|fionnuala|florencia|florencio|forrester|fortunato|francesca|francesco|francisca|francisco|françois|" +
-                                "francoise|franziska|frederica|frederick|friedrich)";
-    namesDict.firstNames.f[10] = "(florentino|franchesca|francheska)";
-    namesDict.firstNames.f[12] = "(frèdèrique)";
-    namesDict.firstNames.g[3] = "(gia|gil|gus|guy)";
-    namesDict.firstNames.g[4] = "(gabe|gael|gage|gaia|gail|gala|gale|garo|gary|gaye|gen.|gena|gene|geri|ghia|gian|gigi|gina|gino|glen|glyn|gov.|gray|" +
-                                "greg|grey|gust|gwen|gwyn)";
-    namesDict.firstNames.g[5] = "(gabbi|gabby|gaige|galen|garry|garth|gates|gatha|gaven|gavin|gavyn|gayla|gayle|geary|geeta|gemma|genie|georg|gerda|" +
-                                "gerri|gerry|giada|giana|gilad|gilda|giles|gilia|ginny|glenn|glory|glynn|golda|gopal|goran|gower|grace|grady|grant|" +
-                                "green|greer|gregg|greig|greta|grier|guido|gypsy)";
-    namesDict.firstNames.g[6] = "(gabino|gaelen|gaines|galina|ganesh|gannon|gareth|garett|garnet|garold|garret|gaspar|gaston|gavino|gawain|gaylon|" +
-                                "gaynor|gehrig|genaro|geneva|gentry|george|gerald|gerard|german|gerold|gerrit|gertie|gerwyn|gianna|gianni|gibson|" +
-                                "gideon|gidget|gilles|ginger|gisela|gisele|giulia|giulio|gladys|glenda|glenna|glinda|gloria|glover|glynda|glynis|" +
-                                "golden|goldia|goldie|gordon|graça|gracen|gracie|gracyn|graden|graeme|graham|grania|grasia|gratia|grayce|grayer|" +
-                                "grazia|grecia|gregor|gretel|grifin|grover|gudrun|gunnar|gunner|gussie|gustav|gwenel)";
-    namesDict.firstNames.g[7] = "(gabriel|gaetano|galilea|galileo|gardner|garland|garnett|garrett|garrick|gaspard|gayatri|gaylord|gaynell|general|" +
-                                "general|genesis|genevra|gennadi|gennaro|georges|georgia|georgie|geraldo|geralyn|gerardo|gerhard|gershon|gervase|" +
-                                "giacomo|giannes|gilbert|gillian|ginevra|giorgio|giovani|gisella|giselle|gladyce|glendon|glennie|godfrey|gonzalo|" +
-                                "goretti|graeden|graelie|graesha|grainne|grayden|graydon|grayson|gregory|greyson|griffin|grissom|gryphon|gunther|" +
-                                "gustave|gustavo|gwyneth|gwynyth)";
-    namesDict.firstNames.g[8] = "(gabriela|gamaliel|garfield|garrison|genoveva|geoffrey|georgene|georgina|georgine|georgios|germaine|geronimo|" +
-                                "gertrude|gilberto|gildardo|gintaras|giorgina|giovanna|giovanni|giovanny|gisselle|giuliana|giuseppe|gottlieb|governor|" +
-                                "gracelyn|graciana|graciela|gratiana|greenlee|greggory|gregoria|gregorio|gretchen|griffith|griselda|griselle|guiseppe|" +
-                                "gulliver|gurpreet|gwynneth)";
-    namesDict.firstNames.g[9] = "(gabriella|gabrielle|galadriel|gavriella|gearldine|genevieve|georgette|georgiana|geraldine|giancarlo|gianpaolo|" +
-                                "glendakay|glodybeth|gracelynn|gracionna|granville|graziella|guadalupe|guillaume|guillermo|guinevere|gwendolen|gwendolyn)";
-    namesDict.firstNames.g[0] = "(georgellen|georgianna|gianfranco|guillermin)";
-    namesDict.firstNames.g[1] = "(guillermina)";
-    namesDict.firstNames.h[3] = "(hal|han)";
-    namesDict.firstNames.h[4] = "(haia|hale|hali|hana|hank|hans|hart|hawk|herb|hero|hiro|holt|hope|hoyt|huey|hugh|hugo)";
-    namesDict.firstNames.h[5] = "(haana|habib|haden|hades|haely|halen|haley|halia|halie|halle|hamid|hamza|handy|hanna|hardy|harry|haven|haydn|hayes|" +
-                                "hazel|hazle|heart|heath|heber|hedda|heidi|heidy|heike|heinz|helen|helga|helge|henri|henry|herta|hideo|hilda|hilma|" +
-                                "hinto|hiram|hodge|hogan|holli|holly|homer|honey|honor|horst|hosea|hulda|hyman|hyrum)";
-    namesDict.firstNames.h[6] = "(hadley|haelee|haidee|haiden|hailee|hailey|hailie|hakeem|halima|halina|halley|hallie|halona|hamish|hampus|hannah|" +
-                                "hannes|hansel|harald|harish|harlan|harlen|harley|harlow|harmon|harold|harper|harris|harvey|hassan|hassie|hatten|" +
-                                "hattie|haydee|hayden|haylee|hayley|haylie|heaven|hector|hedwig|helena|helene|hellen|helmer|henrik|henson|herman|" +
-                                "hermes|hermia|hermon|hernan|hertha|hesper|hester|hestia|hettie|hideki|hilary|hildur|hillel|hilton|hirsch|hjalte|" +
-                                "hobart|hobert|holden|hollie|hollis|homero|honora|hooper|hoover|horace|howard|howell|hristo|hubert|hudson|hughes|" +
-                                "hunter|hurley|huston|hutton|huxley)";
-    namesDict.firstNames.h[7] = "(hadiyah|hadrian|haleigh|halston|harding|harland|harlene|harmony|harriet|hartley|haskell|hatcher|havilah|hayward|" +
-                                "haywood|heather|heloise|hendrik|hendrix|herbert|hermann|hermina|hermine|hershel|hilario|hilbert|hildred|hillard|" +
-                                "hillary|hiroshi|hitoshi|holland|honoria|horacio|horatio|houston|humbert)";
-    namesDict.firstNames.h[8] = "(hadassah|hallsten|hamilton|hannibal|harriett|harriman|harrison|hayleigh|hazelynn|henrique|herminia|herminio|" +
-                                "hermione|herschel|hezekiah|hilliard|hinckley|hipolito|honorée|honorius|hortense|hrothgar|humberto|humphrey|hyacinth)";
-    namesDict.firstNames.h[9] = "(hannelore|harriette|hawthorne|henderson|henrietta|henriette|hephzibah|heriberto|hildegard|holliston|hortencia|" +
-                                "hortensia|hutchison)";
-    namesDict.firstNames.h[0] = "(hatshepsut|heathcliff|hermelinda|hildegarde)";
-    namesDict.firstNames.i[2] = "(io)";
-    namesDict.firstNames.i[3] = "(ian|icy|ida|ike|ila|ima|ina|ion|ira|isa|iva|ivo|ivy)";
-    namesDict.firstNames.i[4] = "(iago|icie|ifan|igor|ilan|ilsa|ines|inez|inga|inge|ingo|iola|iole|iona|ione|iris|irma|isai|iser|isis|isla|isom|itai|" +
-                                "ivah|ivan|ivey|ivor|ixia)";
-    namesDict.firstNames.i[5] = "(ianto|idell|idony|idris|iesha|ilana|ilene|ilian|ilias|ilona|imani|inara|india|indie|inger|inigo|inira|irena|irene|" +
-                                "irina|irini|irvin|irwin|isaac|isaak|isela|isiah|isley|isora|issac|italy|itzel|ivana|ivory|iyana|izora)";
-    namesDict.firstNames.i[6] = "(ianthe|ichiro|idella|ignatz|ikaika|ilaria|ileana|iliana|imanol|imelda|imogen|inanna|indigo|indira|ingrid|ioanna|" +
-                                "irelyn|irving|isabel|isaiah|isaias|isamar|iseult|ishani|ishara|isidro|ismael|ismail|ismene|isobel|isolde|isolyn|" +
-                                "israel|istvan|italí|ivette|ivonne|iyanna|izaiah|izetta)";
-    namesDict.firstNames.i[7] = "(ibrahim|ichabod|ignacio|igraine|imogene|indiana|ioannis|ireland|isabeau|isabela|isabell|isabeth|isadora|isadore|" +
-                                "isannah|ishmael|isidore|ivanhoe)";
-    namesDict.firstNames.i[8] = "(idabelle|ignatius|immanuel|ingeborg|iolanthe|isabella|isabelle|israella|ivelisse|izabella|izabelle)";
-    namesDict.firstNames.i[9] = "(iphigenia)";
-    namesDict.firstNames.j[2] = "(jc|jo)";
-    namesDict.firstNames.j[3] = "(jan|jax|jay|jed|jem|jim|job|joe|jon|joy)";
-    namesDict.firstNames.j[4] = "(jace|jack|jaco|jada|jade|jael|jago|jair|jake|jali|jami|jana|jane|jann|jase|jaya|jean|jeff|jena|jens|jere|jeri|jess|" +
-                                "jett|jexi|jiei|jill|jiri|jiro|joah|joan|joar|jodi|jody|joel|joey|john|joni|jory|josh|joss|jove|juan|judd|jude|judi|" +
-                                "judy|juli|juma|juna|june|juno)";
-    namesDict.firstNames.j[5] = "(jaana|jabez|jacek|jacey|jacky|jacob|jaden|jadis|jadon|jadyn|jaece|jafar|jahir|jaida|jaima|jaime|jairo|jakob|jalen|" +
-                                "jalon|jalyn|jamal|jamar|jamel|james|jamey|jamia|jamie|jamil|jamin|jamir|jamya|janae|janay|janel|janet|janie|janis|" +
-                                "janko|janna|janus|jared|jarem|jaren|jaret|jarod|jarom|jaron|jasen|jason|javen|javon|jaxen|jaxon|jaxyn|jayce|jayda|" +
-                                "jayde|jayla|jayme|jayna|jayne|jeana|jeane|jemma|jency|jenna|jenny|jerad|jered|jerel|jeret|jerod|jerri|jerry|jeryl|" +
-                                "jerzy|jessa|jesse|jessi|jessy|jesus|jetta|jevon|jewel|jimmy|joana|joann|joão|jodee|jodie|joela|joely|johan|joiya|" +
-                                "jolie|jomar|jonah|jonas|jonna|jonty|jordy|joren|jorge|jorja|josé|josef|josie|jovan|jovie|joyce|juana|jubal|judah|" +
-                                "judge|judge|judie|judit|jules|julia|julie|julio|junia|juraj|justo|juwan)";
-    namesDict.firstNames.j[6] = "(jabari|jackie|jaclyn|jacobo|jacoby|jacque|jacqui|jaeden|jaelyn|jagger|jaheem|jaheim|jahiem|jaiden|jaidyn|jailyn|" +
-                                "jaimie|jakobe|jalana|jaleel|jalisa|jalynn|jamaal|jamari|jamila|jammie|janana|janeen|janell|janiah|janice|janine|" +
-                                "janiya|janney|jannie|jános|jansen|janson|japera|japhet|jaqlyn|jaquan|jaquez|jarred|jarres|jarret|jarrod|jarvis|" +
-                                "jasmin|jasmyn|jasper|javier|javion|jaxson|jaycee|jayden|jaydin|jaydon|jaylan|jaylee|jaylen|jaylin|jaylon|jaylyn|" +
-                                "jayson|jayvon|jazlyn|jazmin|jazmyn|jeanie|jeanna|jeanne|jeevan|jeffry|jelani|jemada|jemima|jemuel|jenaye|jeneva|" +
-                                "jenner|jennie|jenoah|jensen|jerald|jeramy|jeremy|jeriah|jerold|jerome|jeromy|jerrie|jerrod|jesica|jesika|jesper|" +
-                                "jessie|jessye|jesusa|jethro|jettie|jewell|jimena|jimmie|jinger|joanie|joanna|joanne|joelle|joetta|johana|johann|" +
-                                "johnie|johnna|johnny|jolene|joliet|jolyon|jonina|jonnie|jordan|jorden|jordin|jordon|jordyn|josefa|joseph|joshua|" +
-                                "josiah|joslyn|jossie|josué|jovani|jovano|jovany|jovita|judiah|judith|judson|judstn|julian|julien|juliet|julius|" +
-                                "juneau|junior|junius|jurgen|justen|justin|juston|justus|justyn)";
-    namesDict.firstNames.j[7] = "(jacalyn|jacinda|jacinta|jacinto|jacklyn|jackson|jacolyn|jacques|jadalyn|jakayla|jaliyah|jameson|jamison|jamisyn|" +
-                                "janelle|janessa|janette|janiyah|janneke|january|japheth|jarlath|jarrell|jarrett|jasmine|jaunita|jauslyn|javonte|" +
-                                "jayleen|jaylene|jaylynn|jazmine|jazmyne|jeanine|jeannie|jeffery|jeffrey|jemaine|jenelle|jenessa|jenifer|jensine|" +
-                                "jeordie|jerahmy|jeramie|jeremey|jeremie|jericho|jerilyn|jerline|jermain|jerrell|jerrica|jerrold|jerusha|jessame|" +
-                                "jessamy|jessica|jessika|jezabel|jezebel|jillene|jillian|jinivah|jisinia|joachim|joaquim|joaquin|jocasta|jocelyn|" +
-                                "joelene|joellen|johanna|johnnie|johnson|jonatan|jordana|joretta|jørgen|joselyn|josepha|josette|joshuah|josylan|" +
-                                "journee|journey|jovanni|jovanny|juanita|juliana|juliann|juliaun|julieta|julissa|junious|juniper|jupiter|justice|" +
-                                "justice|justina|justine|justino)";
-    namesDict.firstNames.j[8] = "(jacynthe|jaeleigh|jamarcus|jamarion|jannette|jaquelin|jeanette|jeannine|jebediah|jedediah|jedidiah|jefferey|jenalynn|" +
-                                "jenibeth|jennifer|jennings|jeramiah|jeremiah|jermaine|jessalyn|jessamyn|jessenia|jessique|jocelyne|johannes|johnpaul|" +
-                                "jonathan|jonathon|jørgina|joscelin|josefina|joycelyn|julianna|julianne|julienne|juliette)";
-    namesDict.firstNames.j[9] = "(jackeline|jacquelin|jacquelyn|jacquline|jaqueline|jasperine|jeannette|jefferson|jeraldine|jessamine|jezabelle|" +
-                                "johnathan|johnathon|josephina|josephine|julieanne)";
-    namesDict.firstNames.j[0] = "(jackquelin|jacqueline|jaymii-lee|jeffersson|jewelianne)";
-    namesDict.firstNames.k[3] = "(kai|kat|kay|kea|ken|kia|kim|kip|kit|kya)";
-    namesDict.firstNames.k[4] = "(kaci|kacy|kade|kaia|kala|kale|kali|kami|kana|kane|kani|kara|kari|karl|kate|kati|katy|kaya|kaye|keda|keir|keli|kell|" +
-                                "kent|keon|keri|kerr|khai|kian|kiel|kiki|kiku|kimm|kina|king|kino|kira|kiri|kirk|kirt|kiya|knox|knut|koba|kobe|koby|" +
-                                "koda|kody|kofi|kojo|kole|kora|kori|kory|kris|kurt|kyan|kyla|kyle|kyna|kyra)";
-    namesDict.firstNames.k[5] = "(kaari|kacey|kacie|kaden|kadin|kadir|kaela|kaija|kaila|kaisa|kaito|kaity|kaiya|kajsa|kalea|kaleb|kalen|kaleo|kaley|" +
-                                "kalie|kalil|kalli|kally|kalyn|kamea|kamil|kandi|kandy|kanye|kaori|karan|karen|karie|karim|karin|karis|karla|karli|" +
-                                "karly|karma|karol|karon|karri|karyn|kasey|kasie|kason|kathi|kathy|katia|katie|katya|kavon|kavya|kayla|kayli|kayse|" +
-                                "kazuo|keane|keanu|keara|keary|kecia|keely|kegan|kehau|keiji|keila|keira|keith|kekoa|kelby|kelis|kelli|kelly|kelsi" +
-                                "|kelsy|kelti|kenan|kenia|kenji|kenna|kenny|kenya|kenzo|keola|keoni|keren|kerri|kerry|kesha|ketan|keven|kevin|kevon|" +
-                                "keyla|keyna|keyon|kezya|khera|khloe|kiana|kiara|kiera|kilby|kiley|kiran|kirby|kirsi|kisha|kitka|kitty|kizzy|klara|" +
-                                "klaus|kogon|kolby|komal|koree|korey|kraig|krish|kubwa|kunal|kwame|kyara|kyden|kylah|kylan|kylea|kyleb|kylee|kyler|" +
-                                "kylie|kylin|kylun|kyree|kyrie|kyron|kyros)";
-    namesDict.firstNames.k[6] = "(kaatje|kabelo|kadeem|kaeden|kaedin|kaelyn|kagome|kahlil|kaiala|kaiden|kaidyn|kailee|kailey|kailyn|kalani|kalina|" +
-                                "kallie|kalvin|kamari|kamaye|kamden|kamren|kamrie|kamron|kamryn|kandra|kareem|karina|karlee|karley|karlie|karlyn|" +
-                                "karren|karrie|karson|karyme|kaspar|kassie|kateri|kathie|katina|katlin|katlyn|kattie|katyna|kaveri|kavita|kaycee|" +
-                                "kayden|kaydra|kaylah|kaylee|kaylen|kayley|kaylie|kaylin|kaylyn|kazuki|keagan|keaton|keegan|keeler|keeley|keelin|" +
-                                "keenan|keesha|keisha|keivar|kelcee|kelcie|kellan|kellen|kelley|kellie|kellyn|kelsea|kelsey|kelsie|kelton|kelvey|" +
-                                "kelvin|kencil|kendal|kendon|kendra|kenede|kenelm|kenley|kenney|kenton|kenyon|kenzie|kepler|kerisa|kermit|kerrie|" +
-                                "kerrin|kerwin|keshav|keshia|késse|keyona|keziah|khalid|khalif|khalil|khloee|khyree|kianna|kidada|kiefer|kieran|" +
-                                "kierra|kieryn|kiirah|kijana|kilian|kimani|kimber|kimbra|kimika|kimora|kinley|kinnia|kinsey|kittie|knight|kohana|" +
-                                "kolton|konner|konnor|korbin|kostas|kramer|krista|kristi|kristy|krysta|kurtis|kwanza|kymbre)";
-    namesDict.firstNames.k[7] = "(kachina|kadence|kadynce|kaitlin|kaitlyn|kaleigh|kalilah|kaliyah|kamaria|kameron|kamilah|kandace|kandice|karalyn|" +
-                                "karenna|karigan|karisma|karissa|karitas|karlene|karling|karmala|karolyn|karrisa|kassidy|katelin|katelyn|kathlyn|" +
-                                "kathryn|katlynn|katriel|katrina|kaylynn|keishla|kellina|kenadee|kenadie|kendall|kenesaw|kennedi|kennedy|kennera|" +
-                                "kenneth|kennith|kerensa|kerstin|keshaun|keshawn|kesslee|ketevan|keturah|khamari|kiffany|killian|kilmeny|kimball|" +
-                                "kimisha|kineret|kingman|kinsley|kiriana|kirsten|kirstie|kirstin|kitarni|kjersti|kortney|kristal|kristan|kristel|" +
-                                "kristen|kristie|kristin|kristyn|krystal|krysten|krystin|krystle|kyleena|kyleigh|kyllion|kyriaki|kyrsten)";
-    namesDict.firstNames.k[8] = "(kadience|kaitlynn|kalliopi|karishma|kasandra|katarina|katarine|katelynn|katerina|katheryn|kathleen|kathrine|kathryne|" +
-                                "kaydence|kayleigh|kayliece|keiralee|kelleigh|kellesha|kendrick|kennette|kennison|kenyatta|kerrigan|keyshawn|khadejah|" +
-                                "khadijah|khe'anna|kheyaira|kiersten|kimberli|kimberly|kingsley|kingston|kourtney|kristian|kristina|kristine|kristjan|" +
-                                "krystina|krystine|kushaiah)";
-    namesDict.firstNames.k[9] = "(kaimbrynn|kassandra|kathaleen|katharina|katharine|katherine|kazimiera|kazimierz|kimberlee|kimberley|kimberlin|kristofer)";
-    namesDict.firstNames.k[0] = "(kensington|khalfanee'|kherington|kristoffer|kristopher)";
-    namesDict.firstNames.k[1] = "(keira-leigh|kimberleigh|konstantina)";
-    namesDict.firstNames.k[3] = "(keeleigh-shae)";
-    namesDict.firstNames.l[2] = "(lu)";
-    namesDict.firstNames.l[3] = "(lea|lee|len|leo|les|lev|lew|lex|lia|liv|liz|lon|lou|loy|lt.|luc|lue|lux|luz|lyn)";
-    namesDict.firstNames.l[4] = "(laci|lacy|lady|lael|lana|lane|lani|lara|lark|lars|leah|lear|leda|leia|leib|leif|lela|lena|leni|leon|lera|lesa|leta|" +
-                                "levi|lexi|liam|liat|lida|liev|liko|lila|lily|lina|lior|lisa|lise|liza|lois|lola|loma|lona|loni|lora|lord|lori|love|" +
-                                "loyd|luca|luce|lucy|luis|luka|luke|lula|lulu|lura|lyda|lyla|lyle|lynn|lynx|lyra)";
-    namesDict.firstNames.l[5] = "(laban|lacey|lacie|laila|laine|laird|lakin|lakyn|lalit|lamar|lamel|lamia|lance|lando|laney|lanie|lanny|laron|larry|" +
-                                "larue|lasse|latif|laura|lauri|laver|lavin|lavon|laxmi|layla|layle|layne|lazar|leann|leena|leesa|leigh|leila|leisa|" +
-                                "leith|lelah|lelia|lemma|lemon|lempi|lenka|lenna|lenny|leola|leoma|leona|leone|leora|leota|leroy|lesia|lesli|lesly|" +
-                                "letha|levar|levon|lewis|lexie|lexus|lezli|liana|libby|lidia|liesl|lilac|lilah|lilia|lilla|lilly|linda|lindy|linus|" +
-                                "liora|lisha|lissa|litzy|livia|lloyd|logan|loïc|lonie|lonna|lonny|lonzo|loran|loren|lorie|lorin|lorna|lorne|lorri|" +
-                                "lotta|lotte|lotus|louie|louis|lovie|lowri|loyal|loyce|luana|luann|lucas|lucia|lucie|lucio|lucky|ludie|luigi|luisa|" +
-                                "lukas|luken|lyale|lydia|lyman|lynda|lyndi|lynee|lynne|lyric)";
-    namesDict.firstNames.l[6] = "(laddie|ladeca|laelia|lærke|lainey|laisha|lalita|lamont|landen|landon|landry|landyn|lanisa|lannie|laoise|larisa|" +
-                                "larkin|larsen|larson|laszlo|lathyn|latifa|latika|latoya|lauran|laurel|lauren|laurie|lauryn|lavada|lavera|lavern|" +
-                                "lavina|lawson|layton|lazaro|leamon|leanna|leanne|leatha|lebron|leeann|leeroy|leland|lemuel|lenard|lennie|lennon|" +
-                                "lennox|lenora|lenore|leonel|leonid|leonor|leotis|leslee|lesley|leslie|lessie|lester|lettie|lexsly|liadan|lianna|" +
-                                "libbie|lienna|liesel|lilian|lilias|lilith|lilium|lillie|lilyan|linden|lindie|linnae|linnea|linnet|linnie|linsey|" +
-                                "lionel|lizeth|lizzie|lofton|lolita|lonán|londen|london|londyn|lonnie|lorcan|lorena|lorene|lorenz|loreto|lorine|" +
-                                "lorrie|lottie|louann|loudon|louisa|louise|lovisa|lowell|luanna|luanne|lucero|lucian|lucien|lucila|lucile|lucius|" +
-                                "ludwig|luella|luetta|luther|lynden|lyndon|lynlea|lynnae|lynsey)";
-    namesDict.firstNames.l[7] = "(lachlan|ladonna|laertes|lakenya|lakesha|lakisha|lakshmi|lambert|lambros|lanette|langdon|lanigan|laquita|laraine|" +
-                                "laramie|larissa|lashawn|latanya|latasha|latisha|latonia|latonya|latosha|latrell|latrice|laurana|laureen|laurent|" +
-                                "laurine|laverna|laverne|lavinia|lavonne|lawanda|lazarus|leander|leandra|leandro|legolas|leilani|leonard|leonato|" +
-                                "léonie|leonora|leonore|leopold|leticia|letitia|lettice|leyanna|liadain|liberty|liliana|liljana|lillian|lilyana|" +
-                                "lincoln|lindsay|lindsey|linette|linwood|lisbeth|lisette|liviana|lizbeth|lizette|lleyton|loraine|loralai|loralie|" +
-                                "lorelai|lorelei|lorenza|lorenzo|loretta|loriann|louella|lourdes|lovetta|luciana|luciano|lucilla|lucille|lucinda|" +
-                                "lucious|lucrece|ludmila|ludovic|lugenia|lurline|luvenia|luzetta|lyndsay|lyndsey|lynette|lynwood)";
-    namesDict.firstNames.l[8] = "(ladarius|lakeisha|lakeshia|lancelot|langston|lashanda|lashonda|latricia|lauralee|laurence|lauretta|laurette|" +
-                                "lavender|lawrence|leatrice|lefteris|leighton|leocadia|leonardo|leonidas|leontine|leopoldo|lilianna|lilibeth|" +
-                                "lilliana|lisandra|lisandro|lissette|lizabeth|lorccán|lorraine|louvenia|lucienne|lucretia|ludivine|ludmilla|" +
-                                "lynnelle|lynnette|lysander)";
-    namesDict.firstNames.l[9] = "(lafayette|lawerence|leviticus|lexington|lillianna|liselotte|llewellyn)";
-    namesDict.firstNames.l[10] = "(laurentius|lieselotte|lieutenant)";
-    namesDict.firstNames.m[2] = "(m.)";
-    namesDict.firstNames.m[3] = "(mac|mae|max|meg|mel|mia|miu|moa|moe|mr.|ms.|mya)";
-    namesDict.firstNames.m[4] = "(mace|maci|mack|macy|mada|mads|maia|maj.|maja|mako|mali|mara|marc|mari|mark|mars|mary|matt|maud|maya|maye|meda|" +
-                                "mena|merl|meta|miah|mika|mike|mila|milo|mimi|mina|ming|mira|miro|miss|miya|mme.|mona|moon|mose|moss|mrs.|murl|myah|" +
-                                "myla|myra|myrl)";
-    namesDict.firstNames.m[5] = "(mabel|mable|macey|macie|macon|madge|madie|maeby|maeva|maeve|magic|mahir|mahri|maida|maile|maira|maire|mairi|maisy|" +
-                                "major|major|makal|makis|malia|malik|malin|malka|malte|mamie|mandi|mandy|manja|manly|manoj|manon|manos|mansi|manus|" +
-                                "manzi|marat|marci|marco|marcy|marek|maren|marge|margo|margy|maria|marie|marin|mario|maris|marit|marla|marlo|marta|" +
-                                "marty|marva|maryn|masha|masis|mason|matea|mateo|maude|maura|mauro|maury|maven|mavis|maxie|maxim|mayme|mayra|mazie|" +
-                                "mccoy|mckay|meade|mearl|medbh|media|meeta|megan|mehri|meika|mekhi|melba|melia|melva|mercy|merit|merle|merry|meryl|" +
-                                "meyer|micah|mieke|mihir|mikah|mikel|milan|miles|miley|milla|milly|milos|mindi|mindl|mindy|minea|minka|minna|mirna|" +
-                                "mirta|mirth|misha|missy|misti|misty|mitch|mitzi|mlle.|moira|molly|monte|monty|moody|morag|moses|moshe|msgr.|mulan|" +
-                                "mungo|murry|myava|mylee|myles|mylie|myrle|myrna|myron)";
-    namesDict.firstNames.m[6] = "(mackie|macsen|madame|madden|maddie|maddox|maddyn|madsen|maegan|maelle|magali|maggie|magnus|mahala|mahesh|mahlon|" +
-                                "maigen|maille|maisey|maisha|maisie|maizie|makala|makani|makena|malaki|malcom|maleah|malene|malila|mallie|mammie|" +
-                                "manish|manley|mannix|manuel|marcel|marcia|marcie|marcos|marcus|marely|margie|margit|margot|mariah|mariam|marian|" +
-                                "mariel|marika|marina|marine|marion|marios|marisa|marita|marius|markel|markos|markus|marlee|marlen|marley|marlin|" +
-                                "marlon|marlyn|marlys|marnie|marsha|martha|martin|marvel|marvin|maryam|maryjo|masika|maslyn|master|mathew|mathis|" +
-                                "matias|mattea|matteo|mattia|mattie|mattox|maudie|maxima|maximo|maxine|maxton|maymie|maysen|mayzee|meadow|meagan|" +
-                                "meegyn|meggin|meghan|meghyn|melany|meliah|melina|melisa|mellie|mellyn|melody|melora|melton|melvin|melvyn|mercer|" +
-                                "merlin|merlyn|merryn|mersia|mertie|merton|mervin|mervyn|merwin|meziah|mhairi|michal|michel|miciah|mickey|mickie|" +
-                                "midori|miesha|mignon|miguel|mikala|mikkel|miklos|milcah|milena|millan|miller|millie|milton|minnie|mintie|mirela|" +
-                                "mireya|miriam|mirren|misael|misaki|mischa|mittie|moises|mollie|monica|monika|monroe|morgan|moriah|moritz|morris|" +
-                                "morton|morven|moshon|mossie|mozell|muriel|murphy|murray|myriam|myrthe|myrtie|myrtis|myrtle)";
-    namesDict.firstNames.m[7] = "(m'kaela|mabelle|macaria|maclean|macleod|macrina|madalyn|madelca|madelyn|madhuri|madigan|madilyn|madisen|madison|" +
-                                "madisyn|madonna|madyson|maëlys|mafalda|maguire|mahalia|mahmoud|mahoney|mairead|majella|makaela|makaila|makayla|" +
-                                "makenna|makinzi|malachi|malachy|malaika|malakai|malcolm|malinda|malissa|maliyah|mallika|mallory|maloree|malorie|" +
-                                "malvina|manfred|manisha|manuela|maranda|marcela|marcelo|marcial|margaux|margery|margret|mariana|mariann|mariano|" +
-                                "maribel|mariela|marieta|marifel|marilee|marilla|marilou|marilyn|mariska|marisol|marissa|maritza|marjory|markell|" +
-                                "markian|marland|marlena|marlene|marlowe|marolyn|marques|marquez|marquis|marsden|marshal|martina|marusia|maryann|" +
-                                "marylin|marylou|marylyn|mathias|mathieu|matilda|matilde|matilyn|matthew|mattson|maudeen|maureen|maurice|maurine|" +
-                                "maximus|maxwell|maybell|maynard|mckayla|mckenna|mckenzy|meaghan|mederic|meghann|melania|melanie|melinda|melissa|" +
-                                "mellisa|melodie|melonie|melvina|memphis|meranda|mercury|merilyn|merlene|merrick|merrill|merritt|messiah|micaela|" +
-                                "micaiah|michael|micheal|michela|michele|michell|mikaela|mikaila|mikayla|mikenzi|mikhail|milburn|mildred|milford|" +
-                                "millard|minerva|mirabel|miracle|miranda|mirella|mitchel|modesta|modesto|mohamed|monique|montana|morgann|mozella|" +
-                                "mozelle|mustafa|myfanwy|myranda|myrtice)";
-    namesDict.firstNames.m[8] = "(macaulay|machelle|mackland|madalena|madalina|madaline|madalynn|maddison|madeline|madelynn|magdalen|magnolia|" +
-                                "mahogany|makenzie|manervia|marabeth|marcella|marcelle|marcello|margalit|margaret|mariamne|marianna|marianne|" +
-                                "maribeth|maricela|maricris|mariella|marietta|mariette|marigold|marilena|marilene|marilynn|mariposa|marisela|" +
-                                "marjorie|markisha|marquise|marquita|marshall|maryanne|marybeth|maryjane|mathilda|mathilde|matthias|matthijs|" +
-                                "mauricio|maverick|maxfield|maximino|maybelle|mcarthur|mckelvey|mckenzie|mckinley|mckinney|mechelle|melchior|" +
-                                "meliauna|mellissa|melodean|melusine|melville|mercedes|meredith|meridith|merrigan|miabella|michaela|michaele|" +
-                                "michalis|michelle|migdalia|mikaylee|mikhaila|milagros|milligan|minuette|mireille|missouri|mitchell|mo'nesha|" +
-                                "mohammad|mohammed|mohinder|monsieur|montague|mordecai|morpheus|morrigan|morrison|mortimer|morwenna|muhammad)";
-    namesDict.firstNames.m[9] = "(maaskelah|mackenzie|maddalena|madeleine|magdalena|magdalene|maraminah|marcelina|marceline|marcelino|marcellus|" +
-                                "margarete|margarett|margarita|margarito|mariclare|marseille|mary-anne|marybelle|maryellen|mehitabel|melbourne|" +
-                                "melisande|michalina|michelina|millicent|minaluccy|mindelynn|mirabella|mirabelle|mnemosyne|monserrat|monsignor|" +
-                                "mordechai)";
-    namesDict.firstNames.m[10] = "(margaretta|margarette|margherita|marguerite|maristella|marjolaine|maximilian|melyssande|mishavonna|monserrate|" +
-                                "montgomery|maximiliano|maximillian|mademoiselle|michelangelo)";
-    namesDict.firstNames.n[3] = "(nan|nat|ned|neo|nia|noa|noe|nya)";
-    namesDict.firstNames.n[4] = "(nash|nate|nava|navi|neal|neil|nell|nels|nemi|nemo|neta|neva|neve|nick|nico|nida|nika|niki|niko|nila|nils|nina|" +
-                                "nita|noah|noam|noel|nola|nona|nora|nova|nuno|nver|nyah|nyla)";
-    namesDict.firstNames.n[5] = "(nadia|nadya|nahla|naima|naite|najee|nakia|nakul|namie|nanci|nancy|nanna|naoko|naoma|naomi|nareh|nasir|nedra|neema|" +
-                                "nelda|nella|nelle|nelly|neoma|nephi|nevin|niall|niamh|nicki|nicky|niels|nieva|nieve|nigel|nihad|nikki|nikos|nilda|" +
-                                "niles|nilsa|nimue|nissa|nixie|noble|noemi|nolan|norah|norma|nuala|nuria|nydia|nyree|nyssa)";
-    namesDict.firstNames.n[6] = "(nacole|nadine|nahima|nalani|nancie|nannie|nastia|nataly|natasa|nathan|nathen|natoya|naveen|nayeli|nayely|nekeia|" +
-                                "nelida|nellie|nelson|nessim|nestor|nettie|nevaeh|neveah|newell|newman|newton|nichol|nicola|nicole|nikhil|nikita|" +
-                                "niklas|nikohl|nikole|nimrod|nirali|nissim|noelia|noelle|noreen|norene|norine|norman|norris|norton|norval|nunzio|nyasia)";
-    namesDict.firstNames.n[7] = "(nadalyn|nallely|nanette|narciso|natalee|natalia|natalie|natalya|natasha|nathaly|natosha|nautica|neftali|neilson|" +
-                                "nephele|nereida|nerissa|neville|nichole|nicolas|nicolle|nikolai|nikolas|noelani|noémie|nolwenn|norbert|normand|" +
-                                "norwood|novella)";
-    namesDict.firstNames.n[8] = "(nadezhda|nannette|naphtali|napoleon|natalina|nathalee|nathalia|nathalie|nehemiah|nemanuel|nicholas|nicklaus|" +
-                                "nickolas|nicolene|nicoline|nikolaos|nikoleta|norberto|normandy)";
-    namesDict.firstNames.n[9] = "(nadeleine|nataleigh|nathanael|nathanial|nathaniel|natividad|necessity|nicholaus|nicholson|nicodemus|nicoletta|nicolette)";
-    namesDict.firstNames.n[10] = "(nicomachus)";
-    namesDict.firstNames.n[11] = "(nightingale)";
-    namesDict.firstNames.o[2] = "(oz)";
-    namesDict.firstNames.o[3] = "(oda|ola|ole|oma|ona|ora|ova)";
-    namesDict.firstNames.o[4] = "(obed|obie|ocie|odie|odin|odis|okey|olaf|olan|oleg|olen|olga|olie|olin|omar|omer|omie|onie|onyx|oona|opal|oral|" +
-                                "oran|oren|orie|orin|orla|orlo|orly|osia|otha|otho|otis|otto|owen)";
-    namesDict.firstNames.o[5] = "(odell|odile|odina|odion|ogden|oisin|olena|olene|oleta|olive|ollie|olwen|omari|oneal|onnie|oprah|orion|orpha|orrin|" +
-                                "orson|orval|orvil|osaka|osama|oscar|oskar|ossie|otten|ottie|ottis|ouida)";
-    namesDict.firstNames.o[6] = "(oakley|oberon|oceana|ochuko|octave|odalys|odelia|odessa|odetta|odette|odilia|ofelia|oksana|oliver|olivia|omayra|" +
-                                "onycha|oralia|orange|orchid|oriana|oriane|oriono|orland|orlean|oswald|otilia|ozella|ozette)";
-    namesDict.firstNames.o[7] = "(ophélie|o'brien|obadiah|octavia|octavio|odyssey|olimpia|olivié|olivier|olympia|omarion|ontario|ophelia|orabela|" +
-                                "orlaith|orlando|orpheus|orville|osbaldo|osborne|osvaldo|oswaldo|othello|ottilie)";
-    namesDict.firstNames.o[8] = "(o'rourke|octavian|octavius|oleander|oliviana)";
-    namesDict.firstNames.o[10] = "(ozymandias)";
-    namesDict.firstNames.o[4] = "(oghenerioborue)";
-    namesDict.firstNames.p[3] = "(pam|pat|pax|paz|per|pia|pio|pip)";
-    namesDict.firstNames.p[4] = "(paul|penn|peri|peta|pete|phil|piet|pink|plum|poet|polk|posy|pria|pura|purl)";
-    namesDict.firstNames.p[5] = "(pablo|padma|paige|palma|pamla|panos|pansy|paola|paolo|paris|parul|patsy|patta|patti|patty|paula|paulo|pavel|payne|" +
-                                "peace|pearl|pedro|peggy|pella|pemba|penda|penni|penny|peony|percy|perez|perla|perri|perry|peter|petra|philo|piers|" +
-                                "pieta|pilar|pilot|piper|pippa|polly|poppy|pres.|price|primo|priya|prof.|pryor)";
-    namesDict.firstNames.p[6] = "(packer|padarn|paetyn|paikea|palmer|paloma|pamala|pamela|paresh|parisa|parker|parnel|pascal|patten|pattie|pavely|" +
-                                "pavlos|paxton|payton|pearle|peggie|pelham|pennie|perrin|pervis|petros|petrus|petula|peyton|philip|philon|phoebe|" +
-                                "phylis|pierce|pierre|pieter|pietro|pinkie|pomona|porsha|porter|portia|potter|pranav|primus|prince|prisca|profit|" +
-                                "prudie|psyche)";
-    namesDict.firstNames.p[7] = "(padraig|paisley|palmira|pamella|pandora|pangfua|paradis|parrish|parvati|pascale|pascual|patrice|patrick|paulina|" +
-                                "pauline|pearlie|perdita|pernell|petrina|phaedra|phaeton|phillip|phillis|philoma|phinean|phineas|phoenix|phyllis|" +
-                                "pierson|pinchas|placido|pradeep|presely|presley|preston|primula|promise|prosper|ptolemy)";
-    namesDict.firstNames.p[8] = "(parthena|pasquale|patience|patricia|patricio|patrizia|pauletta|paulette|pearline|peerless|penelope|percival|" +
-                                "pericles|permelia|pershing|petronel|pheasant|pheriche|philippa|philippe|phillipe|phyllida|pomeline|porfirio|" +
-                                "precious|prescott|primrose|princess|princess|priscila|prospero|prudence|prunella)";
-    namesDict.firstNames.p[9] = "(panagiota|peregrine|philomena|phylicity|president|primitivo|priscilla|professor)";
-    namesDict.firstNames.p[10] = "(parthenope|persephone|petronilla|proserpina|providenci)";
-    namesDict.firstNames.q[5] = "(quaid|queen|quinn)";
-    namesDict.firstNames.q[6] = "(quiana|quincy)";
-    namesDict.firstNames.q[7] = "(queenie|quentin|quinlan|quinten|quintin|quinton|quintus)";
-    namesDict.firstNames.r[3] = "(rae|raj|ram|ray|raz|ren|rex|rey|rie|rio|rob|rod|ron|roy|rye)";
-    namesDict.firstNames.r[4] = "(race|rafe|rahm|rain|rand|rane|rani|raul|ravi|raya|reba|reed|reid|rena|rene|reno|rep.|reta|rev.|reva|reza|rhea|" +
-                                "rhen|rhys|ría|rich|rick|rico|riga|rika|riko|rima|risa|rita|riya|roan|roar|robb|robi|roby|rock|roel|rojo|rolf|roly|" +
-                                "roma|rome|romy|rona|roni|rory|rosa|rose|ross|rubi|ruby|rudy|ruel|ruff|runa|rune|rush|russ|ruth|ryan|ryla|ryne)";
-    namesDict.firstNames.r[5] = "(rabbi|rafer|raffi|rahul|raina|raine|raisa|raita|rajat|rajiv|ralph|ramey|ramon|ramya|rance|randi|randy|rania|raoul|" +
-                                "rasha|raven|ravyn|rayna|rayne|razia|reece|reese|regan|regis|reina|reino|rekha|remus|rémy|renae|renea|renee|resha|" +
-                                "retha|retta|reuel|revs.|reyes|reyna|rheta|rhett|rhian|rhoda|ricki|ricky|rider|ridge|rieko|rigby|rigel|rikki|riley|" +
-                                "rilla|ringo|riona|rishi|risto|river|rivka|roald|roark|robby|robin|robyn|rocco|rocky|rogan|roger|rogue|rohan|roick|" +
-                                "rolla|rollo|roman|romeo|ronan|ronda|ronen|ronia|ronin|ronit|ronja|ronna|ronny|roque|rosia|rosie|roula|rowan|rowdy|" +
-                                "rowen|roxie|royal|royce|ruben|rubie|rubin|rubye|rufus|rusty|ruthe|ryann|ryder|ryker|rylan|rylee|ryley|rylie|rylin)";
-    namesDict.firstNames.r[6] = "(rachel|raeann|raegan|rafael|raffia|ragnar|raheem|rahima|raiden|rainen|rainer|rainey|rajesh|rakesh|ramesh|ramiro|" +
-                                "ramona|ramsay|ramsey|randal|randel|randle|ranger|raniel|ranjit|ransom|raquel|rashad|rashid|rasmus|raymon|rayner|" +
-                                "raynne|raziel|reagan|reagen|reanna|reason|rebeca|reggie|regina|rehema|reidar|reilly|renata|renate|renato|renita|" +
-                                "renner|reshma|ressie|reuben|rey'el|rheyna|rhodes|rhodri|rhonda|rianna|richie|rickey|rickie|ridley|ripley|roarke|" +
-                                "robbie|robbin|robert|rochel|rocío|rodger|rodman|rodney|roenne|rogers|rohini|roisin|roland|rollie|rollin|romain|" +
-                                "romare|romina|romola|romona|ronald|ronnie|rosana|rosann|roscoe|rosina|rosita|roslyn|rossie|rourke|rowena|roxana|" +
-                                "roxane|roxann|rudolf|rueben|ruffin|rupert|rushil|russel|rutger|ruthie|ryanne|rykken|ryland)";
-    namesDict.firstNames.r[7] = "(rachael|racheal|racquel|radames|radhika|raekwon|rafaela|rahsaan|rainbow|raleigh|randall|randell|rannoch|raphael|" +
-                                "rashawn|rasheed|rashida|rayburn|rayelle|rayford|raymond|raynard|rebecca|rebekah|redmond|refugio|reginal|rexford|" +
-                                "reynold|rhianna|ricardo|richard|rihanna|riordan|ritchie|riviera|roberta|roberto|rodolfo|rodrick|rodrigo|rogelio|" +
-                                "rolanda|rolando|rolland|romaine|romilda|romilly|romulus|ronaldo|rosabel|rosaire|rosalba|rosalee|rosalia|rosalie|" +
-                                "rosalva|rosalyn|rosanna|rosanne|rosaria|rosario|rosaura|roseann|rosella|roselyn|rosendo|rosetta|roswell|rowland|" +
-                                "roxanna|roxanne|rozella|ruairí|rudiger|rudolph|rudyard|russell|ruthann|ryleigh)";
-    namesDict.firstNames.r[8] = "(rachelle|ramonita|randolph|raphaela|rayleigh|raymundo|rayshawn|reginald|reinaldo|reinhold|renesmee|reverend|" +
-                                "reynaldo|rhiannon|riccardo|richelle|richmond|rickelle|robinson|rochelle|rockwell|roderick|rosaleen|rosalina|" +
-                                "rosalind|rosaline|rosamond|rosamund|roseanna|roseanne|roselina|rosemary|rosevelt)";
-    namesDict.firstNames.r[9] = "(raffaella|remington|reverends|rhieannah|rigoberto|roosevelt|rosabella|rosalinda|rosemarie)";
-    namesDict.firstNames.r[10] = "(rutherford)";
-    namesDict.firstNames.r[11] = "(rockefeller)";
-    namesDict.firstNames.r[14] = "(representative)";
-    namesDict.firstNames.s[3] = "(st.|sal|sam|sid|sim|sir|sky|sol|sr.|sr.|sue|sun)";
-    namesDict.firstNames.s[4] = "(sade|saga|sage|sama|sani|sara|saul|scot|sean|sela|sen.|sepp|seth|sgt.|shad|shae|shai|shay|shea|shia|shon|sian|" +
-                                "sire|siri|skip|skye|sra.|stan|star|suki|suri|suvi|suzy|svea|sven|swan|syed)";
-    namesDict.firstNames.s[5] = "(saint|saari|sabah|saber|sabry|sacha|sadie|sadye|sagar|saige|salim|sally|salma|samir|sammy|sampo|sanaa|sandi|" +
-                                "sandy|sania|sanna|sanne|sanni|sansa|santa|santo|sarah|sarai|sasha|sayer|sayli|scott|scout|sedna|selah|selby|selim|" +
-                                "selma|semaj|senan|senna|senor|seren|seven|sevin|shadi|shana|shane|shani|shara|shari|shaun|shawn|shaye|sheri|shira|" +
-                                "shola|shona|shura|shyla|sibyl|siena|siera|signe|silas|síle|siler|silje|silka|simba|simon|sindi|sipho|siren|sixto|" +
-                                "skyla|slade|sloan|smith|sofia|sofie|solon|sonia|sonja|sonny|sonya|soren|sorin|spike|srta.|staci|stacy|starr|steno|" +
-                                "steve|stine|stone|storm|story|sudie|sukey|sukie|sunil|sunny|surya|susan|susie|suuvi|suzan|sybil|syble|sydni|sylas|sylve)";
-    namesDict.firstNames.s[6] = "(sabela|sabelo|sabina|sabine|sadaat|saddam|sadhbh|sadler|safiya|sahara|sailor|sakari|sakura|salima|salina|sallie|" +
-                                "salome|samara|samira|sammie|samson|samuel|sander|sandra|sandro|saniya|sanjay|santos|sarahi|saraya|sariah|sarina|" +
-                                "sascha|saskia|saskie|savana|savina|savion|savvas|sawyer|scotty|seager|seamus|seaton|sedona|selena|selene|selina|" +
-                                "selmer|seneca|senora|seraph|serena|sergei|sergio|severo|shadow|shaina|shamar|shanda|shania|shanna|shanon|shanta|" +
-                                "shante|shanti|sharee|sharen|sharif|sharla|sharon|sharyn|shasta|shauna|shawna|shayla|shayna|shayne|sheena|sheikh|" +
-                                "sheila|shelba|shelbi|shelby|shelia|shelli|shelly|shelva|shemar|sheree|sherie|sheron|sherri|sherry|sheryl|sheyla|" +
-                                "shiela|shifra|shiloh|shimon|shivam|shmuel|shonda|shonna|shreya|shyann|sianna|sidney|sidony|sienna|sierra|sigrid|" +
-                                "sigurd|sillan|silvan|silver|silvia|silvio|simcha|simeon|simona|simone|sinbad|sindri|sinead|sirius|sissel|sister|" +
-                                "sister|sivert|skilee|skylan|skylar|skyler|slater|sloane|soeren|solana|soleil|sondra|sonnet|sonoma|sonora|sookie|" +
-                                "sophia|sophie|soraya|sorcha|sorrel|spence|spiros|spring|squire|stacey|stacia|stacie|starla|stasia|stasya|steele|" +
-                                "stefan|stella|stevan|steven|stevie|stoney|stormy|struan|stuart|summer|sumner|sunday|susana|susann|sutton|suzann|" +
-                                "sydnee|sydney|sydnie|sylvan|sylvia|sylvie)";
-    namesDict.firstNames.s[7] = "(sabrina|sadhana|saffron|samaria|sandeep|sanford|saniyah|sanjeev|santana|santina|santino|saoirse|saphira|sargent|" +
-                                "satchel|sathish|saundra|savanah|savanna|scarlet|scottie|seattle|sedrick|senator|sephora|sereana|severin|severus|" +
-                                "seymour|sha'uri|shaelyn|shaheen|shakila|shakira|shameka|shamika|shanice|shanika|shanita|shaniya|shannan|shannon|" +
-                                "shantel|sharona|sharron|shaylee|shaylie|shelbie|sheldon|shelina|shelley|shellie|shelton|shepard|shepley|sherita|" +
-                                "sherlyn|sherman|sherrie|sherron|sherryl|sherwin|shianne|shirlee|shirley|shivani|shyanne|sibylla|sidonia|sidonie|" +
-                                "sigmund|simpson|sincere|siobhan|skipper|socorro|solange|soledad|solomon|solveig|sorrell|sotiria|sparrow|spencer|" +
-                                "spenser|stanley|stanton|stavros|stefani|stefano|steffan|stelios|stellan|stephan|stephen|stephon|stetson|stewart|" +
-                                "strider|suellen|sunniva|sunrise|surelis|susanna|susanne|sushila|suzanna|suzanne|suzette|sybylla|sylvain)";
-    namesDict.firstNames.s[8] = "(salvador|samantha|sandrine|sangeeta|sanjukta|santiago|sapphira|sapphire|savannah|scarlett|schuyler|scorpius|" +
-                                "senorita|septimus|serafina|seraphia|serenity|sergeant|severena|severina|shaienne|shalimar|shalonda|shanelle|" +
-                                "shaniqua|shaniyah|shantell|sharalyn|sharlene|sharonda|shawanda|shenequa|sheppard|sheridan|sherilyn|sherlock|" +
-                                "sherrill|sherwood|shim-hee|shirlene|shoshana|siddalee|silvanus|sinclair|slobodan|socrates|spearman|spellman|" +
-                                "spurrier|squandro|stafford|stanford|starling|stefania|stefanie|stefanos|stephani|stephany|sterling|stockman|" +
-                                "stratton|styliani|sullivan|sunshine|surinder|susannah|suzannah|svetlana)";
-    namesDict.firstNames.s[9] = "(sabastian|salvatore|sanderson|seathrún|sebastian|september|serallies|seraphina|seraphine|shahrazad|shannessy|" +
-                                "shaquille|shoshanna|silatuyok|sojourner|sophronia|stanislas|stanislav|stanislaw|stephania|stephanie|stephenie|" +
-                                "sylvester)";
-    namesDict.firstNames.s[10] = "(sébastien|sévérine|shenandoah|stanislaus|stanislava)";
-    namesDict.firstNames.s[11] = "(salustianna|scholastica)";
-    namesDict.firstNames.t[2] = "(ty)";
-    namesDict.firstNames.t[3] = "(tad|tag|tai|taj|tal|tam|tea|ted|teo|tex|tia|tim|tip|tod|tom|toy|tre|tru|tui)";
-    namesDict.firstNames.t[4] = "(taft|tahj|tait|tali|tami|tana|tara|tate|tave|taya|tayo|teal|tena|tera|teri|tess|teyo|thad|thea|theo|thor|tifa|till|" +
-                                "timo|tina|tino|tiny|tisa|tito|toby|todd|toni|tony|tora|tori|tory|tova|tove|toya|trae|trey|trig|troy|tuva|tyce|tyme|" +
-                                "tyne|tyra)";
-    namesDict.firstNames.t[5] = "(taber|tadhg|tahki|taide|taimi|taina|takis|talan|talia|talon|talya|tamar|tamia|tamie|tamir|tammi|tammy|tamra|tamya|" +
-                                "tandi|tania|tanis|tanja|tanya|tarah|taran|taras|tarek|tarez|tariq|tarun|taryn|tasha|tatum|tavis|tavon|tavor|tawny|" +
-                                "tayla|tayne|tecla|teddy|teena|tegan|telly|terra|terri|terry|tesla|tessa|tevel|tevin|thabo|thain|thais|thane|theda|" +
-                                "thijs|thoma|thora|thyra|tiago|tiana|tiara|tibor|tiera|tiger|tiggy|tilda|tillo|tilly|timmy|timon|tinka|tisha|titus|" +
-                                "tobey|tobin|tomas|tommy|toney|tonia|tonja|tonna|tonya|topaz|torey|torin|torry|tosha|toshi|tovah|trace|traci|track|" +
-                                "tracy|trena|trent|tresa|treva|trina|troah|trudy|truth|tsega|tudor|twila|twyla|tycho|tyler|tylor|tymon|tyree|tyrel|" +
-                                "tyriq|tyron|tyson|tytus)";
-    namesDict.firstNames.t[6] = "(tahira|taisha|takoda|talbot|talise|talyse|tamala|tamana|tamara|tameka|tamela|tamera|tamika|tamiko|tammie|tammis|" +
-                                "tamryn|tamsin|tanika|tanith|taniya|tannen|tanner|tannis|taraji|tarian|tarkin|tarren|tarsha|tarzan|tasker|tavean|" +
-                                "tavian|tavion|tavish|tawana|tawnee|tawnya|tayler|taylor|teagan|teague|tearny|teghan|temily|tempie|temple|tennie|" +
-                                "tenzin|teresa|terese|tereza|terrie|terttu|tesoro|tessie|thalia|thames|thandi|thanos|thayer|thekla|thelma|theola|" +
-                                "theora|theron|theryn|thomas|thraci|tianna|tierra|tierza|tilden|tillie|tilney|timara|timbre|timmie|tirion|tirzah|" +
-                                "tishia|tizian|tobias|tollak|tomasa|tomeka|tomika|tomlin|tommie|tomoko|torben|torrey|torrii|townes|tracey|tracie|" +
-                                "traian|trajan|traver|travis|travon|tressa|trever|trevik|trevin|trevon|trevor|tricia|trilby|triona|trisha|trista|" +
-                                "triton|trixie|trudie|truett|truman|tucker|tullia|tullis|turner|tybalt|tychon|tyesha|tyquan|tyreek|tyrell|tyrese|tyrone)";
-    namesDict.firstNames.t[7] = "(tabatha|tabitha|tacitus|taffeta|taggert|takashi|talitha|taliyah|tamatha|tanaraq|tanesha|tangela|tanisha|taniyah|" +
-                                "tarquin|tatanka|tatiana|tatiara|tatyana|taurean|tavares|tawanda|tawanna|teaghan|tempest|tenisha|teodoro|terence|" +
-                                "teressa|terrell|terrill|tetyana|texanna|teyarna|theodyn|theresa|therese|theseus|thibaut|thierry|thomsen|thulani|" +
-                                "thurman|tiernan|tierney|tiffani|tiffany|tillman|timfany|timoteo|timothy|tinashe|tinsley|titania|tiziana|tokunbo|" +
-                                "tomache|tommaso|torquil|torsten|toshiko|toumani|townley|trayton|trenean|trenten|trenton|tressie|trevion|treyton|" +
-                                "treyvon|trinity|tristan|tristen|tristin|triston|trystan|tuesday|tullius|tyreena|tyreese|tyrique|tyshawn)";
-    namesDict.firstNames.t[8] = "(taitlynn|tallulah|talmadge|tatianna|tatyanna|tayshaun|tecumseh|tennille|tennyson|teresita|terrance|terrence|" +
-                                "thaddeus|thanasis|thanatos|thandeka|thandiwe|thatcher|theadore|thembeka|theodora|theodore|theresia|thomasin|" +
-                                "thomasyn|thornton|thurston|tiberius|tiffanie|timmerle|timmothy|timothea|torrance|treasure|tremaine|tremayne|" +
-                                "trinidad|tristian|tristram)";
-    namesDict.firstNames.t[9] = "(tayliauna|thelonius|theodoric|theodosia|theophile|thomasina|thomasine|tigerlily|ty-nassir|tzipporah)";
-    namesDict.firstNames.t[10] = "(temperance|theodosius|theophanes|theophilus)";
-    namesDict.firstNames.u[3] = "(udo|ugo|ulf|uma|una|urd|uri|uzi)";
-    namesDict.firstNames.u[4] = "(ulla|urho|uzzi)";
-    namesDict.firstNames.u[5] = "(ultan|unity|upton|urban|uriah|urias|uriel|usher)";
-    namesDict.firstNames.u[6] = "(uberto|ulises|ulrich|ulrika|undine|unique|ursula|utahna|uzziah)";
-    namesDict.firstNames.u[7] = "(ulysses|umberto)";
-    namesDict.firstNames.v[3] = "(val|van|von)";
-    namesDict.firstNames.v[4] = "(vada|vale|veda|vega|vena|vera|verl|vern|vida|vina|vita|vito|viva)";
-    namesDict.firstNames.v[5] = "(vadim|valia|vance|varun|velda|vella|velma|velva|venus|verda|verla|verna|verne|vesta|vicki|vicky|vidal|vidar|vidya|" +
-                                "viggo|vijay|vikki|vilde|ville|vilma|vince|vinia|viola|vitus|vonda)";
-    namesDict.firstNames.v[6] = "(vaclav|valery|vallie|vanesa|vanity|vashti|vaughn|velvet|venice|venita|verdie|verena|vergie|vergil|verica|verity|" +
-                                "verlie|verlin|verner|vernie|vernon|verona|versie|veruca|vester|vickey|vickie|victor|vienna|vigdis|vikram|viktor|" +
-                                "vinnie|vinson|violet|virgie|virgil|viveca|vivian|vivien|volker|vonnie)";
-    namesDict.firstNames.v[7] = "(valancy|valarie|valente|valeria|valerie|valerio|valorie|vandana|vanessa|vasilis|vaughan|venessa|venetia|vernell|" +
-                                "vernice|vicenta|vicente|vincent|violeta|viviana|vorgell)";
-    namesDict.firstNames.v[8] = "(va'lexus|valarece|valdemar|valencia|valentin|vangelis|vassilis|veronica|veronika|victoria|vincenza|vincenzo|" +
-                                "violetta|violette|virgilio|virginia|virginie|vittoria|vittorio|vivienne|vladimir)";
-    namesDict.firstNames.v[9] = "(valentina|valentine|valentino|valkíria|veronique|versilius|viridiana)";
-    namesDict.firstNames.w[3] = "(wes|wyn)";
-    namesDict.firstNames.w[4] = "(wade|walt|ward|watt|wava|webb|west|will|wolf|wood|wren|wynn)";
-    namesDict.firstNames.w[5] = "(waino|waiva|waldo|wally|wanda|wanni|wayne|wells|wendi|wendy|wilda|wiley|willa|willy|wilma|windy|woody|worth|wyatt|" +
-                                "wylie|wyman|wynne)";
-    namesDict.firstNames.w[6] = "(walden|walker|wallis|walter|walton|waneta|wanita|warner|warren|watson|waylon|waymon|weaver|weldon|welton|wendie|" +
-                                "werner|wesley|weston|whelan|wilber|wilbur|wilkes|willem|willia|willie|willis|willow|wilmer|wilson|wilton|winema|" +
-                                "winnie|winona|winter|winton|wisdom|witlee|wright|wynona)";
-    namesDict.firstNames.w[7] = "(waleska|wallace|wardell|wassily|waverly|wayland|webster|wendell|westley|wheeler|whisper|whitley|whitman|whitney|" +
-                                "wilbert|wilburn|wilford|wilfred|wilfrid|wilhelm|willard|willene|william|windell|winford|winfred|winslow|winston|" +
-                                "woodrow|woolsey)";
-    namesDict.firstNames.w[8] = "(waldemar|waltraud|wendelin|wilfredo|williams|winfield|winifred|wisteria|wolfgang)";
-    namesDict.firstNames.w[9] = "(willodean|winnifred)";
-    namesDict.firstNames.w[10] = "(washington|wellington|wilhelmina|wilhelmine|windradyne)";
-    namesDict.firstNames.x[4] = "(xena|xoey)";
-    namesDict.firstNames.x[5] = "(xaver|xenia|xenon)";
-    namesDict.firstNames.x[6] = "(xander|xanthe|xavier|xerxes|xiaobo|ximena)";
-    namesDict.firstNames.x[7] = "(xadrian|xanthia|xaviera|xeyenne|xiomara|xochitl|xzavier)";
-    namesDict.firstNames.x[8] = "(xristina)";
-    namesDict.firstNames.x[9] = "(xanthippe)";
-    namesDict.firstNames.y[4] = "(yael|yair|yale|yana|yann|yeva|ylva|ynyr|yoki|yoko|york|yuki|yuri|yves)";
-    namesDict.firstNames.y[5] = "(yaffa|yahir|yemen|yetta|yosef|yuriy|yusuf|yuval)";
-    namesDict.firstNames.y[6] = "(yadiel|yadira|yancey|yanira|yannis|yarden|yareli|yasmin|yazmin|yehuda|yelena|yoshio|yriana|ysanne|ysella|yseult|" +
-                                "ysolde|yvaine|yvette|yvonne)";
-    namesDict.firstNames.y[7] = "(yahaira|yajaira|yamilet|yannick|yaretzi|yaritza|yasmeen|yasmina|yasmine|yesenia|yitzhak|yolanda|yolonda|yoselin|" +
-                                "yoshiko|yuliana|yuridia)";
-    namesDict.firstNames.y[8] = "(yessenia)";
-    namesDict.firstNames.z[3] = "(zac|zeb|zed|zel|zen|zev|zia|zoe|zoi|zvi)";
-    namesDict.firstNames.z[4] = "(zach|zack|zaid|zain|zane|zaor|zara|zayd|zeke|zena|zina|zion|zita|ziva|zoey|zoie|zola|zona|zora|zoya|zula|zuzu)";
-    namesDict.firstNames.z[5] = "(zaden|zadok|zahra|zaida|zaide|zaire|zamia|zarek|zaria|zayne|zeely|zelda|zelia|zella|zelma|zenia|zenon|zetta|zhoee|" +
-                                "zhyan|zilee|zilla|ziloh|zoila|zooey|zosia|zulma)";
-    namesDict.firstNames.z[6] = "(zafira|zahara|zahava|zakary|zalika|zander|zariah|zavier|zayden|zenith|zephan|zephyn|zephyr|zillah|zinnia|zodiac|" +
-                                "zodiax|zollie|zoltan|zosima|zuzana)";
-    namesDict.firstNames.z[7] = "(zachary|zachery|zackary|zackery|zaltana|zaniyah|zebedee|zebulon|zemirah|zenaida|zenobia|zhlobko|zigmund|zinaida|" +
-                                "zoraida|zoriana|zuleika)";
-    namesDict.firstNames.z[8] = "(zebediah|zedekiah|zipporah)";
-    namesDict.firstNames.z[9] = "(zachariah|zechariah|zephyrine)";
-    namesDict.lastNames = [];
-    namesDict.lastNames = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
-    jQuery.each(namesDict.firstNames, function(i) {
-        currentLetter = this;
-        namesDict.lastNames[currentLetter] = [1,2,3,4,5,6,7,8,9,10,11,12,13,14];
-        jQuery.each(namesDict.lastNames[currentLetter], function(j) {
-            namesDict.lastNames[currentLetter][j] = "";
-        });
-    });
-    namesDict.lastNames.a[10] = "(armbruster|armendariz|armentrout|applewhite|altamirano)";
-    namesDict.lastNames.a[11] = "(archambault|abercrombie)";
-    namesDict.lastNames.a[3] = "(ahn|ali|ard|ash)";
-    namesDict.lastNames.a[4] = "(ames|alva|alex|adam|agee|akin|alba|arce|amos|amin|ault|arms|argo|ayer|ashe|abel)";
-    namesDict.lastNames.a[5] = "(ahern|aubin|audet|auger|alton|arndt|asher|aston|ayers|amaya|anaya|auten|avant|avery|ayres|alves|alvey|amaro|alden|" +
-                                "abram|alsup|anton|anson|appel|abner|arias|amato|amick|andre|avila|alley|aaron|allen|albin|angus|adame|abell|ashby|" +
-                                "ahner|abney|apple|arena|akers|alger|allan|angel|arana|ahmad|annis|acord|abbey|autry|artis|askew|ahmed|avina|acuna|" +
-                                "angle|ables|ayala|acree|adair|aiken|agnew|acton|acker|abreu|akins|adams|adler)";
-    namesDict.lastNames.a[6] = "(arroyo|allain|alfred|armijo|abeyta|ashton|arnold|aguayo|ashley|aiello|andrus|asbury|alanis|angelo|angell|albers|" +
-                                "armour|alaniz|aquino|ansley|altman|aponte|abrams|archie|anglin|ardoin|arenas|aranda|araujo|angulo|archer|acosta|" +
-                                "abbate|avelar|amador|alonzo|arruda|agosto|arnett|alfaro|aragon|aucoin|alcorn|adkins|abbott|allman|ackley|august|" +
-                                "austin|autrey|avalos|adorno|atkins|atwell|aikens|adrian|abrego|arthur|aguiar|ahrens|aviles|aycock|ayotte|andrew|" +
-                                "amaral|allard|ammons|alcala|absher|alford|adcock|alicea|adames|alessi|alston|atwood|aleman|almond|allred|ambriz|" +
-                                "alonso|anders|andres|albert|araiza|andino|alfano)";
-    namesDict.lastNames.a[7] = "(arriaga|attaway|atwater|anthony|alarcon|antonio|almonte|arteaga|aronson|averill|alcaraz|arreola|ashmore|atencio|" +
-                                "alverez|ashburn|arriola|abraham|aguirre|aldrich|addison|adamson|andrade|alvarez|ashford|acevedo|almaraz|almeida|" +
-                                "allison|almanza|aguilar|allgood|appling|alleman|alleyne|azevedo|andrews|arevalo|andress|ambrose|alfonso|argueta|" +
-                                "atchley|alberts|apodaca|angeles|audette|amerson|appleby|antoine|armenta)";
-    namesDict.lastNames.a[8] = "(arguello|ackerman|anderton|arbuckle|amundson|alderson|arellano|aparicio|alderman|aguilera|ashworth|armstead|anderson|" +
-                                "abramson|anguiano|andersen|arbogast|alcantar|appleton|aldridge|atkinson|armitage|atherton|andresen|ashcraft|albrecht|" +
-                                "alvarado|albright|arrowood|abdullah|albanese|atchison)";
-    namesDict.lastNames.a[9] = "(abernathy|addington|arrington|albertson|armstrong|arsenault|applegate|alcantara|alejandro|alexander|archuleta|" +
-                                "archibald|albritton|augustine|ainsworth|arceneaux|arredondo)";
-    namesDict.lastNames.b[10] = "(barrientos|barrington|batchelder|beauregard|betancourt|billington|birchfield|birmingham|blackshear|blackstock|" +
-                                "blanchette|bloodworth|bloomfield|boatwright|brewington|broadwater|brookshire|brotherton|brownfield|buckingham|" +
-                                "buffington|bullington|bumgardner|burchfield|burkhalter|burkholder|burmeister|bustamante)";
-    namesDict.lastNames.b[11] = "(ballesteros|bartholomew|baskerville|baumgardner|baumgartner|bettencourt|biggerstaff|billingsley|bissonnette|" +
-                                "blankenship|braithwaite|brandenburg|brockington|butterfield)";
-    namesDict.lastNames.b[12] = "(breckenridge)";
-    namesDict.lastNames.b[2] = "(ba)";
-    namesDict.lastNames.b[3] = "(bay|bey|bly|box|bui)";
-    namesDict.lastNames.b[4] = "(brim|bolt|bish|bass|bibb|betz|bond|bias|ball|bice|bove|buck|bowe|bard|bare|bott|boss|bair|bono|bost|bane|berg|" +
-                                "bill|bock|bone|beck|bear|bird|book|blum|beer|blue|borg|belt|butt|burg|bunn|bell|bull|buie|bump|behr|bush|burr|" +
-                                "buss|bess|burt|byrd|blow|burk|bash|babb|belk|boyd|bach|best|baer|baez|bohn|bing|benz|bain|bahr|baum|beal|born|" +
-                                "bays|benn|baca|barr|bugg|bobo|bean|bode|beam|budd|back|bray)";
-    namesDict.lastNames.b[5] = "(baber|babin|bacon|bader|baeza|bagby|baier|baily|baird|baker|balch|bales|banda|bandy|banks|banta|baran|barba|barns|" +
-                                "baron|barry|barth|bartz|basso|bates|batey|batts|bauer|baugh|bayer|bayne|beach|beale|beall|beals|beane|beard|beaty|" +
-                                "beebe|beech|beers|beery|begay|beggs|belle|bello|bemis|benge|bentz|berry|betts|beyer|bibbs|bible|biggs|biles|bills|" +
-                                "binns|birch|bixby|black|blain|blair|blais|blake|bland|blank|bliss|block|blood|bloom|blume|blunt|board|boden|boehm|" +
-                                "bogan|boger|boggs|bogle|bolen|boles|bolin|bonds|boney|bonin|boone|booth|boren|bosch|botts|bourg|bowen|bower|bowes|" +
-                                "bowie|boyce|boyer|boyle|brace|bracy|brady|bragg|brake|brand|brann|brant|braud|braun|bravo|breen|brehm|brent|brett|" +
-                                "brian|brice|brien|brill|brink|brito|britt|brock|brody|brook|broom|brown|bruce|bruno|bruns|brush|bryan|bryce|budde|" +
-                                "buell|bueno|buggs|bunch|bundy|burch|burge|burke|burks|burns|busby|busch|busse|butts|byars|bybee|byers|byler|bynum|" +
-                                "byrne|byron|byrum)";
-    namesDict.lastNames.b[6] = "(backer|backus|badger|bagley|bahena|bailey|baines|ballew|ballou|banker|banner|bannon|barbee|barber|barden|barela|" +
-                                "barger|barham|barker|barlow|barner|barnes|barney|barnum|barone|barron|barros|barrow|bartel|barton|basham|bashaw|" +
-                                "basile|baskin|batson|batten|battle|baucom|bauman|baxley|baxter|baylor|beaman|beamon|beason|beaton|beatty|beaver|" +
-                                "becker|becnel|bedard|bedell|beeler|beeman|beeson|begley|belden|beller|belton|bender|benham|benner|bennet|benoit|" +
-                                "benson|benton|berard|bergen|berger|bergin|berlin|berman|bernal|berndt|berube|bethea|bethel|bettis|bevins|bianco|" +
-                                "bickel|biddle|bieber|bigham|bigler|binder|binion|bishop|bisson|bivens|bivins|bixler|blaine|blanco|blanks|blazer|" +
-                                "blount|blythe|boddie|bodine|bogart|boland|bolden|bolduc|bolick|boling|bolton|bonham|bonner|bonney|booher|booker|" +
-                                "boothe|boozer|borden|borges|boring|bosley|bostic|boston|bounds|bourne|boutin|bouton|boutte|bowden|bowens|bowers|" +
-                                "bowler|bowles|bowlin|bowman|bowser|bowyer|boyett|boykin|boylan|boyles|bracey|braden|braley|branch|brandt|branum|" +
-                                "brauer|brazil|breaux|bremer|breton|brewer|bridge|briggs|bright|briley|brodie|brogan|brooke|brooks|broome|brophy|" +
-                                "brower|browne|bruner|brunet|bruton|bryant|bryson|bucher|buford|buller|bulter|bunker|bunton|burden|burger|burgin|" +
-                                "burgos|burkey|burley|burney|burris|burrow|burrus|burson|burton|bushey|bussey|bustos|butler|button|buxton|byerly|" +
-                                "byrnes)";
-    namesDict.lastNames.b[7] = "(babbitt|babcock|bachman|backman|badillo|baggett|bagwell|baldwin|ballard|barajas|barbosa|barbour|barboza|barclay|" +
-                                "barkley|barnard|barnett|barraza|barrera|barreto|barrett|barrier|barrios|barrows|bartels|bartley|bassett|bastian|" +
-                                "bateman|batista|batiste|battles|baugher|baumann|bayless|bearden|beasley|beattie|beaudry|beavers|becerra|bechtel|" +
-                                "beckett|beckham|beckley|beckman|bedford|bedwell|beecher|behrens|belcher|belisle|bellamy|bellows|beltran|benally|" +
-                                "benford|benitez|bennett|bentley|bergman|berkley|bernard|bernier|berrios|bertram|beverly|bianchi|bidwell|bierman|" +
-                                "bigelow|biggers|billiot|billups|binette|bingham|binkley|bissell|bittner|blakely|blalock|blanton|bledsoe|blevins|" +
-                                "blocker|bloomer|boatman|bobbitt|boggess|bolanos|bolding|bolling|bonilla|bonnell|bonnett|borders|borrego|bostick|" +
-                                "boswell|botello|bottoms|boucher|bouldin|bourque|bowling|boyette|boykins|boynton|bozarth|bozeman|bracken|bradley|" +
-                                "brandon|branham|brannan|brannon|branson|branton|brasher|bratton|brawley|brawner|braxton|breault|breeden|breland|" +
-                                "brennan|brenner|breunig|brewton|bricker|bridges|brigham|brinson|briones|briscoe|briseno|brister|bristol|bristow|" +
-                                "britton|brodeur|brogdon|bromley|bronson|brooker|browder|broyles|brumley|brunner|brunson|buckles|buckley|buckman|" +
-                                "buckner|buehler|bullard|bullins|bullock|bunnell|bunting|burbank|burcham|burdett|burdick|burdine|burford|burgess|" +
-                                "burgett|burkett|burnell|burnett|burnham|burrell|burress|burrows|burwell|bushman|bussell|butcher|butters|buzzell)";
-    namesDict.lastNames.b[8] = "(balderas|baltazar|bancroft|banister|bankston|banuelos|baptiste|barbieri|barfield|barhorst|barnette|barnhart|" +
-                                "barnhill|barnwell|barragan|bartlett|baughman|bautista|beaudoin|beaulieu|bechtold|beckford|beckwith|bejarano|" +
-                                "belanger|benedict|benfield|benjamin|bergeron|berglund|bergmann|bermudez|bernardo|berryman|bertrand|bessette|" +
-                                "bickford|billings|bilodeau|birdsong|bischoff|blackman|blackmon|blakeney|blanding|blaylock|blessing|blizzard|" +
-                                "blodgett|boardman|bohannon|boisvert|bolinger|bordelon|borowski|bostwick|bosworth|bouchard|boudreau|boughton|" +
-                                "bourassa|bousquet|boutwell|brackett|bradbury|braddock|bradford|bradshaw|bramlett|brantley|brashear|braswell|" +
-                                "bratcher|breeding|brewster|brinkley|brinkman|brittain|broadnax|broadway|brockman|brockway|brookins|brothers|" +
-                                "brownell|browning|brownlee|brubaker|brummett|brundage|brunelle|buchanan|buchholz|burchett|burdette|burkhart|" +
-                                "burleigh|burleson|burnette|burnside|bushnell|byington)";
-    namesDict.lastNames.b[9] = "(babineaux|baldridge|ballenger|ballinger|bannister|barksdale|barringer|batchelor|battaglia|beardsley|beauchamp|" +
-                                "bellinger|benavides|benavidez|benedetto|benefield|bergstrom|berkowitz|bernhardt|bernstein|berryhill|beveridge|" +
-                                "blackburn|blackford|blackmore|blackwell|blackwood|blaisdell|blanchard|boatright|bocanegra|boettcher|bojorquez|" +
-                                "bollinger|borkowski|boudreaux|bradberry|bradfield|breedlove|bridgeman|broderick|broughton|broussard|brumbaugh|" +
-                                "brumfield|bumgarner|burkhardt|burroughs)";
-    namesDict.lastNames.c[10] = "(candelaria|candelario|carmichael|carrington|carruthers|cartwright|castellano|chamberlin|chancellor|churchwell|" +
-                                "concepcion|cornelison|cottingham|countryman|crittenden|culbertson|cunningham)";
-    namesDict.lastNames.c[11] = "(castellanos|castleberry|chamberlain|christensen|christenson|christopher|constantine|constantino|covarrubias|" +
-                                "crutchfield)";
-    namesDict.lastNames.c[12] = "(carrasquillo|christiansen|christianson)";
-    namesDict.lastNames.c[13] = "(christopherso)";
-    namesDict.lastNames.c[3] = "(cao|cha|chi|cho|chu|coe|cox|coy|cyr)";
-    namesDict.lastNames.c[4] = "(core|cave|clem|chau|cano|cade|chun|choi|camp|cobb|corn|ceja|clay|cook|chiu|chen|carr|cass|chan|cupp|chee|crim|" +
-                                "carl|coon|cann|cate|chow|choe|crow|cohn|croy|cool|conn|chew|cruz|cork|cote|cato|call|card|cary|cage|cole|cady|" +
-                                "cain|chin|cota|culp|caro|cory|chou|cram|curl|chao|cash|cope|cody|crum|cone)";
-    namesDict.lastNames.c[5] = "(cuomo|cates|clary|colby|chick|caron|cerda|cater|chong|chism|clark|cronk|carty|cecil|chang|chapa|chinn|casas|crook|" +
-                                "casey|cyrus|cheng|clare|clapp|ching|casto|chase|cisco|crain|cooke|claar|craft|caton|calvo|cruse|cantu|covey|corey|" +
-                                "cooks|conte|cross|cress|coles|cotto|cobos|colin|caban|colon|comer|crabb|craig|cover|child|creel|crane|conti|combs|" +
-                                "croom|cason|coons|crump|croft|crowe|coyne|coyle|cable|cowan|cheek|click|coney|cofer|chung|clair|cloud|creed|crews|" +
-                                "costa|cosme|clyde|cobbs|coble|coker|corum|curry|canty|coats|capps|close|couch|clift|cline|crisp|cowen|cagle|conde|" +
-                                "coley|crist|corso|cohen|clegg|carey|cosby|criss)";
-    namesDict.lastNames.c[6] = "(cotten|chasse|copper|cathey|cottle|crouch|cotton|cooper|counts|culler|chapin|campos|corson|cuevas|cotter|corral|" +
-                                "cousin|cheeks|corbin|covert|cosper|coston|corder|chaves|chavis|corley|corwin|chance|coburn|crooks|cribbs|coates|" +
-                                "cimino|collin|cowley|craven|coffee|coffey|crespo|clough|crites|connor|cleary|clouse|cromer|clarke|chiles|creech|" +
-                                "cruise|childs|colton|conner|conrad|coomer|cowart|cowles|cowden|coombs|cramer|conger|crosby|carson|colter|conlon|" +
-                                "cowans|crouse|comeau|condon|callis|camara|camper|calvin|conroy|cannon|carman|cullen|chaney|cronin|cadena|cahill|" +
-                                "caskey|cabral|callan|callen|cairns|cooley|carrol|canady|carney|carnes|carter|causey|culver|colson|cantor|carden|" +
-                                "cancel|colley|caputo|carley|carlos|carder|church|cheney|cepeda|chafin|canter|cozart|christ|cowell|conway|conant|" +
-                                "cortes|coward|curran|colman|cooney|coffin|corona|cahoon|carver|choate|cutler|crider|castor|canada|clancy|calder|" +
-                                "correa|craver|custer|cortez|cheung|crotty|capers|carlin|conley|capone|cordes|curley|carper|curtis|caudle|catron|" +
-                                "caruso|cherry|chacon|colvin|chavez|curtin|caesar|currin|currie|copley|cutter|cardin|cusick|castro|catlin|caston|" +
-                                "cedeno|curiel|cawley|castle|center|chabot|conlin|casper)";
-    namesDict.lastNames.c[7] = "(carruth|connell|cambell|conners|clyburn|collier|chester|conover|connors|cintron|cushing|colwell|cedillo|crowder|" +
-                                "comeaux|cazares|charles|cardoza|carlton|colunga|creamer|camacho|charley|chaffin|conklin|casteel|clemmer|crafton|" +
-                                "cameron|cumming|cabrera|cordova|chesser|cornell|chapman|chatman|carrico|chauvin|corbitt|cordero|caudill|cordell|" +
-                                "carrell|corliss|couture|courson|cornett|chaplin|chatham|cornejo|croteau|cormier|claxton|clemens|crumley|chaffee|" +
-                                "conaway|conwell|cummins|coulson|council|curtiss|cushman|chancey|crocker|clifton|coppola|currier|caddell|cooksey|" +
-                                "crozier|cundiff|cassell|cargill|cannady|cardona|clement|corbett|carlson|casiano|carillo|carlile|clayton|clapper|" +
-                                "cashman|clemons|collard|clinton|crowley|calhoun|caraway|crowell|carbone|cassidy|cothran|chumley|clanton|carrier|" +
-                                "carrion|casares|chisolm|carroll|christy|cropper|charron|clausen|carreon|carlyle|carmack|claudio|carrera|carrero|" +
-                                "carmona|conyers|cofield|caceres|coleman|colbert|clawson|collado|coffman|chipman|caldera|colella|cavazos|colburn|" +
-                                "casarez|collins|cleaver|colston|centeno|colombo|collett|collazo|chilton|cuellar|cureton|caswell|catlett|cassady|" +
-                                "cochran|coulter|crayton|canales|crawley|correia|coakley|calkins|correll|colucci|cornish|carmody|cravens|compton|" +
-                                "calvert|coggins|cousins|cauthen)";
-    namesDict.lastNames.c[8] = "(calderon|caldwell|callahan|callaway|callison|calloway|calvillo|campbell|canfield|cantrell|cantwell|carbajal|" +
-                                "carbaugh|cardenas|cardinal|cardwell|carleton|carlisle|carnahan|carranza|carrasco|carraway|carrigan|carrillo|" +
-                                "carswell|carvajal|carvalho|casanova|casillas|castillo|catalano|cathcart|cavender|caviness|ceballos|chadwick|" +
-                                "chaisson|chalmers|chambers|chamblee|chamness|champion|champlin|chandler|chappell|charette|charlton|chartier|" +
-                                "chastain|chasteen|cheatham|chenault|chestnut|childers|chisholm|chitwood|chrisman|christie|cisneros|clarkson|" +
-                                "claycomb|claypool|cleghorn|clemente|clements|clemmons|clifford|cloutier|cochrane|cockrell|collette|colquitt|" +
-                                "comstock|connelly|connolly|constant|converse|copeland|corcoran|cordeiro|cornwell|coronado|corrales|corrigan|" +
-                                "cosgrove|costello|cottrell|coughlin|coulombe|courtney|crabtree|craddock|crandall|crandell|cranford|crawford|" +
-                                "crenshaw|criswell|crockett|cromwell|crossley|crossman|crumpler|crumpton|crutcher|culbreth|cummings)";
-    namesDict.lastNames.c[9] = "(caballero|calabrese|callaghan|callender|camarillo|caraballo|carothers|carpenter|cartagena|caruthers|castaneda|" +
-                                "castleman|cavanaugh|cervantes|cervantez|chambless|chambliss|champagne|chavarria|chenoweth|chevalier|childress|" +
-                                "chouinard|christian|christman|christmas|churchill|claypoole|cleveland|clevenger|cockerham|contreras|cornelius|" +
-                                "corriveau|covington|creekmore|creighton|crossland|culpepper)";
-    namesDict.lastNames.d[10] = "(delafuente|delgadillo|desjardins|desrochers|desrosiers|dillingham|dombrowski)";
-    namesDict.lastNames.d[11] = "(dalessandro|delossantos)";
-    namesDict.lastNames.d[2] = "(do)";
-    namesDict.lastNames.d[3] = "(day|dee|dew|dix|doe|dow|dye)";
-    namesDict.lastNames.d[4] = "(doak|deas|deal|dees|duke|duty|doan|dill|dyke|duda|duff|dash|doss|darr|derr|doty|dear|dunn|deck|doll|dick|dell|" +
-                                "daye|dore|dion|dale|dinh|dana|dull|daly|dent|dial|dube|deen|dews|dean|dame|dowd|dodd|dyer|drew|dorr|durr|dahl|" +
-                                "diaz|dang|drum|dove|delk|delp|dorn|dias|duck)";
-    namesDict.lastNames.d[5] = "(davis|dumas|doyon|dudek|denny|drake|drain|denis|dugan|derby|deese|duhon|downs|dugas|doyle|desai|dover|derry|davey|" +
-                                "depew|damon|dancy|duque|dixon|daily|daley|dyson|diego|dykes|dowdy|dewey|dobbs|dendy|david|diehl|dietz|deitz|drury|" +
-                                "doane|duval|dabbs|dukes|devoe|dever|duran|diggs|duron|doerr|dawes|dolan|duong|dupre|deane|deans|dwyer|dicks|darby|" +
-                                "dodds|doran|durst|dunne|duffy|dodge|dutra)";
-    namesDict.lastNames.d[6] = "(dabney|daigle|dailey|dallas|dalton|damato|damico|damron|daniel|danley|danner|dansby|dardar|darden|darrow|dasher|" +
-                                "davies|davila|dawson|dayton|deanda|deason|deaton|deboer|debose|decker|dehart|delano|deleon|delong|delrio|deluca|" +
-                                "deluna|dement|demers|deming|demoss|denham|denman|denney|dennis|denson|denton|derosa|devine|devito|devlin|devore|" +
-                                "dewitt|dexter|dibble|dicken|dickey|dilley|dillon|dillow|dingle|dionne|dixson|dobson|doctor|dodson|dollar|donald|" +
-                                "donato|donley|donner|dooley|dorman|dorris|dorsey|dortch|dotson|doucet|dowden|dowell|downer|downes|downey|dozier|" +
-                                "draper|dreher|dreyer|driver|dryden|duarte|dubois|dubose|dudley|duenas|duffey|duggan|dugger|dumont|dunbar|duncan|" +
-                                "dunham|dunkin|dunkle|dunlap|dunlop|dunson|dunton|dupont|dupree|duprey|dupuis|durand|durant|durbin|durden|durfee|" +
-                                "durham|durkee|durkin|dustin|dutton|duvall|dvorak)";
-    namesDict.lastNames.d[7] = "(dacosta|daggett|dameron|dandrea|dangelo|daniels|darling|darnell|dasilva|davison|dawkins|dearing|deberry|decarlo|" +
-                                "deckard|decosta|deering|dehaven|dejesus|delaney|delapaz|delgado|delisle|deloach|demarco|demello|dempsey|denison|" +
-                                "dennard|denning|derrick|desilva|desmond|despain|deutsch|deville|devries|deweese|deyoung|diamond|dicarlo|dickens|" +
-                                "dickman|dickson|dillard|dillion|dillman|dingess|dingman|dinkins|dishman|dobbins|dockery|doering|doggett|doherty|" +
-                                "domingo|donahue|donnell|donohue|donovan|dorsett|doughty|douglas|dowdell|dowling|downing|drayton|drennan|duckett|" +
-                                "dulaney|dunagan|dunaway|dunford|dunning|dunston|durrett|dutcher|dykstra)";
-    namesDict.lastNames.d[8] = "(dahlgren|dalessio|danforth|dantzler|daughtry|davidson|deangelo|dearborn|decastro|decoteau|defelice|deguzman|" +
-                                "delacruz|delarosa|delvalle|dennison|densmore|depriest|derosier|desantis|desimone|dietrich|dilworth|dimaggio|" +
-                                "dinsmore|dipietro|dominick|donnelly|donofrio|doucette|douglass|dressler|driggers|driscoll|driskell|drummond|" +
-                                "ducharme|dufresne|duquette)";
-    namesDict.lastNames.d[9] = "(dagostino|dalrymple|dandridge|danielson|daugherty|davenport|deangelis|delagarza|delatorre|dellinger|desmarais|" +
-                                "destefano|dickenson|dickerson|dickinson|distefano|dominguez|dominquez|donaldson|doolittle|dougherty|duckworth|" +
-                                "duplessis)";
-    namesDict.lastNames.e[10] = "(easterling|echevarria|echeverria|engelhardt)";
-    namesDict.lastNames.e[11] = "(evangelista)";
-    namesDict.lastNames.e[12] = "(eichelberger)";
-    namesDict.lastNames.e[3] = "(eby|eck|ely|eng|erb)";
-    namesDict.lastNames.e[4] = "(eads|eady|earl|east|eddy|eden|edge|egan|elam|eley|enos|epps|eudy|exum)";
-    namesDict.lastNames.e[5] = "(eades|eagan|eagle|earle|earls|early|eason|eaton|eaves|ebert|edens|edgar|edson|elder|elias|eller|ellis|elmer|elrod|" +
-                                "embry|emery|emory|engel|engle|ennis|enoch|ernst|ervin|erwin|eskew|essex|estep|estes|etter|evans|evers|ewald|ewell|" +
-                                "ewing|ezell)";
-    namesDict.lastNames.e[6] = "(earley|easley|easter|easton|eberle|eberly|echols|eckert|eckman|eddins|edison|edmond|edward|egbert|eggers|eggert|" +
-                                "ehlers|eicher|eidson|eiland|eldred|elkins|elliot|elmore|elston|elwell|elwood|embree|emmert|emmons|endres|engler|" +
-                                "erdman|ernest|espino|eubank|eugene)";
-    namesDict.lastNames.e[7] = "(earnest|eastman|eddings|edelman|edmonds|edmunds|edwards|ehrlich|eliason|elledge|elliott|ellison|emanuel|emerick|" +
-                                "emerson|england|englert|english|enright|epstein|erdmann|ericson|erskine|escobar|esparza|espinal|estevez|estrada|" +
-                                "eubanks|evenson|everett|everson)";
-    namesDict.lastNames.e[8] = "(eastwood|eckhardt|eckstein|edgerton|edington|edmiston|edmonson|eldredge|eldridge|elizondo|ellinger|endicott|" +
-                                "engstrom|enriquez|epperson|erickson|escobedo|eskridge|espinosa|espinoza|esposito|esquibel|esquivel|estrella|" +
-                                "ethridge|everette|everhart|eversole)";
-    namesDict.lastNames.e[9] = "(eberhardt|edelstein|edmondson|eggleston|eisenberg|ellingson|ellington|ellsworth|escalante|escamilla|estabrook|" +
-                                "etheridge)";
-    namesDict.lastNames.f[10] = "(farnsworth|farrington|fitzgerald|fredericks|funderburk)";
-    namesDict.lastNames.f[11] = "(fitzpatrick|fitzsimmons|fortenberry|fredrickson)";
-    namesDict.lastNames.f[12] = "(featherstone|frederickson)";
-    namesDict.lastNames.f[3] = "(fay|fee|fix|fox|foy|fry)";
-    namesDict.lastNames.f[4] = "(fain|fair|falk|fant|farr|fast|fell|fenn|fick|fife|fike|fine|fink|finn|fish|fisk|fite|fitz|fogg|folk|fong|ford|" +
-                                "fore|fort|foss|free|frey|frye|fulk|fung|funk|furr)";
-    namesDict.lastNames.f[5] = "(faber|fagan|fahey|falls|faria|faris|faulk|faust|fazio|fears|felix|felts|ferro|ferry|field|fikes|finch|fiore|" +
-                                "fitch|fitts|flack|flagg|flatt|fleck|flick|flinn|flint|flood|flora|flory|floyd|flynn|fogel|fogle|foley|folse|" +
-                                "foltz|foote|force|forde|foret|forte|foust|fouts|fraga|frame|frank|franz|freed|frias|frick|fried|friel|fries|" +
-                                "frink|frith|fritz|frost|fryer|fuchs|fudge|fulks|fultz|fuqua|fusco)";
-    namesDict.lastNames.f[6] = "(fabian|faison|falcon|fallon|fannin|farber|farias|farina|farkas|farley|farmer|farrar|farris|farrow|favela|favors|" +
-                                "feeney|felder|felker|feller|felton|fender|fenner|fenton|ferrer|ferris|fetter|fidler|fields|fierro|finger|finley|" +
-                                "finney|fisher|fleury|flores|florez|flower|folsom|forbes|forest|forman|forney|fortin|foster|fowler|fraley|france|" +
-                                "franco|franke|franks|frantz|fraser|frazee|frazer|freese|french|freund|friday|friend|frisby|frisch|fritts|fugate|" +
-                                "fuller|fulmer|fulton|furman)";
-    namesDict.lastNames.f[7] = "(ferebee|farwell|foreman|frasier|frausto|fenwick|falcone|fennell|frazier|fischer|fussell|francis|fleming|farnham|" +
-                                "farrell|fairley|furtado|ferland|fajardo|ferrara|frances|frankel|fulcher|feaster|fuentes|findley|fecteau|frisbie|" +
-                                "franzen|freitag|fuhrman|fawcett|fellows|fortier|futrell|feldman|fleenor|fancher|fogarty|fanning|freeman|fordham|" +
-                                "furlong|ferrell|ferrari|fassett|forster|forsyth|fanelli|fortson|ferraro|fortner|fortney|fontana|fortune|freitas|" +
-                                "fonseca|fowlkes|friesen|findlay|forrest|fishman|fiedler|fincher|fielder|fulford|fullmer|flowers|frawley|fifield)";
-    namesDict.lastNames.f[8] = "(falgoust|faulkner|federico|ferguson|ferrante|ferreira|fielding|figueroa|fillmore|finnegan|fitzhugh|flaherty|" +
-                                "flanagan|flanders|flanigan|flannery|flemming|fletcher|florence|flournoy|fontaine|fontenot|forester|forsberg|" +
-                                "forsythe|fountain|fournier|foxworth|francois|franklin|fredette|fredrick|freedman|freeland|friedman|frierson|" +
-                                "frizzell)";
-    namesDict.lastNames.f[9] = "(fairbanks|fairchild|faircloth|feliciano|fernandes|fernandez|fitzwater|fleetwood|forrester|francisco|frechette|" +
-                                "frederick|friedrich|fulkerson|fullerton)";
-    namesDict.lastNames.g[10] = "(gilbertson|goldsberry|greathouse|greenfield)";
-    namesDict.lastNames.g[3] = "(gay|gee|gil|guy)";
-    namesDict.lastNames.g[4] = "(gage|gale|gall|gann|gant|gary|gass|gaul|geer|getz|gill|ginn|gish|gist|goad|goff|gold|good|gore|goss|gott|gove|" +
-                                "graf|gray|grey|grim|grow|guay|gunn|gwin)";
-    namesDict.lastNames.g[5] = "(gabel|gable|gaddy|gagne|galan|gallo|gamez|gandy|gantt|gaona|garay|garth|garza|gates|gatto|gault|gause|gavin|gayle|" +
-                                "geary|geist|geter|geyer|gibbs|giese|giles|giron|glass|glaze|glenn|glick|glynn|gober|goble|godin|godoy|goetz|goins|" +
-                                "gomes|gomez|gooch|goode|gordy|gough|gould|govan|gowen|gower|grace|grady|graff|gragg|grant|grass|greco|green|greer|" +
-                                "gregg|grice|grier|grigg|grimm|groce|groff|groom|grose|gross|groth|grove|grubb|grube|guess|guest|guido|guinn|gupta|" +
-                                "guyer|gwinn)";
-    namesDict.lastNames.g[6] = "(gordan|gillum|gracia|guerin|gainer|grimes|gurley|gilley|grooms|godwin|goebel|grillo|gurney|guerra|greene|griego|" +
-                                "grubbs|guyton|guzman|goodin|gurule|goines|grande|gipson|grogan|girard|gilman|grider|gilpin|grover|gruber|guidry|" +
-                                "glover|gorman|goulet|glaser|gorton|grundy|gamble|gannon|gorski|garber|goings|gammon|galvez|gusman|gamboa|galvin|" +
-                                "garver|garris|gerdes|garica|gulley|gilson|garman|graves|garner|garmon|gordon|gailey|gainey|gaines|gagnon|gadson|" +
-                                "gustin|gregor|gulick|galvan|gillis|gorham|gunter|golden|givens|gaitan|gaskin|gillen|gillam|george|gaynor|gerber|" +
-                                "gerald|gentry|geiger|gehrke|geller|giroux|gilkey|garcia|gooden|giglio|griggs|gibson|groves|garvin|gilmer|godsey|" +
-                                "gatlin|gerard|guffey|garvey|gallup|graham|gaddis|gaspar|gaston|german|graber|gayton|gaytan|gattis|gaudet|gaylor|" +
-                                "grasso)";
-    namesDict.lastNames.g[7] = "(garnett|griffis|gleason|granger|grajeda|gaskins|greeley|grissom|garland|guillen|granado|grammer|griffin|gillett|" +
-                                "grenier|gabbard|griffen|griffey|greaves|goddard|grisham|guevara|grigsby|gehring|grayson|gallego|gamache|gravely|" +
-                                "gullett|guertin|goodell|gregory|gresham|grizzle|guarino|gervais|garibay|glisson|godfrey|greiner|gartner|glasser|" +
-                                "garrett|garrity|gentile|galarza|goldman|golding|goforth|godinez|galindo|gallant|gilmore|glidden|germany|gillman|" +
-                                "germain|gifford|gillard|gilliam|gaspard|gatling|gittens|gladney|gebhart|geisler|gladden|giddens|gaylord|goolsby|" +
-                                "goodman|goodwin|gaskill|guthrie|gurrola|goodson|gendron|gossett|gosnell|gaither|gardner|garrick|gilbert|gabriel|" +
-                                "goodale|gourley|gaffney|gribble|goodall|garrido|gooding|gunther|gerlach|gibbons|glasgow)";
-    namesDict.lastNames.g[8] = "(gallaher|gallardo|gallegos|galloway|gambrell|gardiner|garfield|garrison|gastelum|gatewood|gaudette|gauthier|" +
-                                "gearhart|genovese|gerhardt|giddings|gillette|gilliard|gilligan|gilreath|gilstrap|ginsberg|giordano|goldberg|" +
-                                "gonzales|gonzalez|goodrich|gosselin|gottlieb|granados|grantham|graybill|graziano|greenlee|greenway|gregoire|" +
-                                "griffith|grijalva|grimmett|grimsley|griswold|grossman|guajardo|guardado|guenther|guerrero|guillory|gulledge)";
-    namesDict.lastNames.g[9] = "(galbraith|galbreath|gallagher|garretson|gilbreath|gilchrist|gillespie|gilliland|gillispie|glasscock|glidewell|" +
-                                "goldsmith|goldstein|gonsalves|goodnight|grabowski|greenberg|greenleaf|greenwald|greenwell|greenwood|griffiths|" +
-                                "gunderson|gustafson|gutierrez)";
-    namesDict.lastNames.h[10] = "(hardcastle|harrington|hartsfield|hendershot|herrington|hildebrand|hollenbeck|hollifield|huddleston|huntington|" +
-                                "hutcherson|hutchinson)";
-    namesDict.lastNames.h[11] = "(hendrickson|hershberger|hildebrandt|hochstetler|hockenberry)";
-    namesDict.lastNames.h[12] = "(higginbotham|hollingshead)";
-    namesDict.lastNames.h[13] = "(hollingsworth)";
-    namesDict.lastNames.h[2] = "(ha|ho|hu)";
-    namesDict.lastNames.h[3] = "(ham|han|hay|her|hix|hom|hoy|hsu)";
-    namesDict.lastNames.h[4] = "(haag|haas|hack|hage|hahn|hair|hake|hale|hall|hamm|hand|hang|hann|hare|haro|harp|harr|hart|hash|hass|haug|haun|" +
-                                "hawk|haws|hays|head|heck|heil|heim|hein|held|helm|herd|herr|hess|higa|high|hill|hipp|hite|hitt|hoag|hoch|hoey|" +
-                                "hoff|hogg|hoke|holm|holt|hong|hood|hook|hope|hord|horn|houk|howe|hoyt|huey|huff|hull|hume|hung|hunt|hupp|hurd|" +
-                                "hurt|huss|huth|hyde)";
-    namesDict.lastNames.h[5] = "(haase|haber|hafer|hagan|hagen|hager|hague|haile|haire|hales|haley|hamby|hamel|hamer|hance|handy|hanes|haney|hanks|" +
-                                "hanna|hardy|harms|harry|hasty|hatch|hauck|haupt|haven|hawes|hawks|hayes|hazel|hazen|heald|healy|heard|hearn|heath|" +
-                                "hecht|hedge|heine|heinz|helms|henke|henry|heron|hesse|heyer|hiatt|hibbs|hicks|higgs|hight|hiles|hills|himes|hinds|" +
-                                "hines|hintz|hirst|hixon|hoang|hoard|hobbs|hodge|hofer|hogan|hogue|holly|holst|holtz|homan|homer|honea|hooks|hoppe|" +
-                                "horan|horne|horst|hosey|houck|hough|houle|house|hovis|howes|howze|hoyle|huang|hubbs|huber|hudak|hulse|humes|hurst|" +
-                                "hutto|huynh|hwang|hyatt|hyden|hyder|hyman|hynes)";
-    namesDict.lastNames.h[6] = "(hacker|haddad|hadden|haddix|hadley|hagans|hagler|haight|hailey|haines|haller|halley|halpin|halsey|halter|hamann|" +
-                                "hamill|hamlin|hammer|hammon|hanley|hanlon|hannah|hannan|hannon|hansel|hansen|hanson|harbin|hardee|harden|harder|" +
-                                "hardie|hardin|hargis|harker|harlan|harley|harlow|harman|harmon|harney|harold|harper|harris|harrod|harter|hartle|" +
-                                "harvey|hassan|hasson|hatley|hatten|hatton|haugen|hauser|havens|hawkes|hawley|hayden|haynes|haynie|hazard|healey|" +
-                                "hearne|heaton|hebert|hecker|hector|hedges|heflin|hefner|heintz|heiser|heller|helman|helmer|helton|hendon|hendry|" +
-                                "henkel|henley|henson|herald|herbst|herman|herold|herren|herrin|herron|hersey|hertel|herzog|hester|hewett|hewitt|" +
-                                "hickey|higdon|hiller|hillis|hilton|hinkle|hinman|hinson|hinton|hirsch|hixson|hobart|hobson|hodges|hodson|hoffer|" +
-                                "holden|holder|hollar|holler|holley|hollis|holman|holmes|holton|holzer|hooker|hooper|hooten|hoover|hopper|hopson|" +
-                                "horner|horton|houser|howard|howell|hubert|hudson|huerta|hughes|hughey|hulett|hulsey|humble|hummel|hunley|hunter|" +
-                                "hurdle|hurley|huskey|hussey|husted|huston|hutson|hutton|hyland|hylton)";
-    namesDict.lastNames.h[7] = "(hackett|hackler|hackman|hackney|haddock|hageman|hagerty|haggard|halbert|halcomb|halford|hallett|hallman|hallock|" +
-                                "halpern|hamblin|hamlett|hammack|hammett|hammock|hammond|hammons|hampton|hamrick|hancock|handley|hankins|harbour|" +
-                                "harding|hardman|hargett|harkins|harless|harness|harrell|hartley|hartman|hartung|hartwig|harvell|harwell|harwood|" +
-                                "haskell|haskins|hassell|hatcher|hawkins|haworth|haygood|hayward|haywood|hazlett|hazzard|headley|heckman|hedrick|" +
-                                "heffner|heilman|heisler|hellman|helmick|hembree|hendley|hendren|hendrix|henning|henshaw|hensley|herbert|heredia|" +
-                                "hermann|herndon|herrera|herrick|herring|hershey|hetrick|hewlett|heyward|hibbard|hickman|hickson|hidalgo|higgins|" +
-                                "hilbert|hillard|hillman|hindman|hinkley|hinshaw|hockett|hodgson|hoffman|hofmann|hoggard|holbert|holcomb|holguin|" +
-                                "holiday|holland|hollins|holston|honaker|hopkins|horning|hornsby|horsley|horvath|hoskins|housley|houston|howland|" +
-                                "howlett|hubbard|hubbell|huckaby|hudgens|hudgins|hudnall|huebner|huffman|hufford|huggins|hulbert|hundley|huntley|" +
-                                "hurtado)";
-    namesDict.lastNames.h[8] = "(hagerman|haggerty|hairston|halliday|hallmark|halloran|halstead|hambrick|hamilton|hammonds|hanrahan|harbison|" +
-                                "hardaway|hardeman|hardesty|hardiman|hardison|hardwick|hargrave|hargrove|harkness|harrigan|harriman|harrison|" +
-                                "hartford|hartmann|hartnett|hartsell|hartsock|hartwell|hartzell|hastings|hatchett|hatfield|hathaway|hathcock|" +
-                                "hazelton|headrick|heinrich|hemphill|hendrick|hennessy|hereford|hernadez|herrmann|hildreth|hilliard|hinojosa|" +
-                                "hoagland|hodgkins|hoffmann|holbrook|holcombe|holliday|holliman|holloman|holloway|holmberg|hornback|horowitz|" +
-                                "houghton|howerton|hudspeth|humphrey|hunsaker|huntsman|hutchens|hutchins)";
-    namesDict.lastNames.h[9] = "(hackworth|halverson|halvorson|harrelson|hartfield|hawthorne|hazelwood|hedgepeth|heffernan|hemingway|henderson|" +
-                                "hendricks|hennessey|henninger|henriquez|hernandes|hernandez|hickerson|highsmith|hightower|hitchcock|hoelscher|" +
-                                "holifield|hollander|hollinger|hollister|hollowell|holmquist|honeycutt|hostetler|hostetter|hotchkiss|humphreys|" +
-                                "humphries|huneycutt|hutcheson|hutchings|hutchison)";
-    namesDict.lastNames.i[3] = "(ide|ivy)";
-    namesDict.lastNames.i[4] = "(imes|irby|isom|ison|ives|ivey|ivie|izzo)";
-    namesDict.lastNames.i[5] = "(ingle|inman|irish|irons|irvin|irwin|isaac|isham|ivory)";
-    namesDict.lastNames.i[6] = "(ibanez|ibarra|imhoff|ingram|irvine|irving|isaacs|isbell|israel)";
-    namesDict.lastNames.i[7] = "(ibrahim|infante|ingalls|ireland|iverson)";
-    namesDict.lastNames.i[8] = "(iglesias|ingraham|irizarry|isaacson|isenberg)";
-    namesDict.lastNames.i[9] = "(ingersoll)";
-    namesDict.lastNames.j[3] = "(jay|joe|joy)";
-    namesDict.lastNames.j[4] = "(jack|jara|jean|jett|jobe|john|jone|jose|jost|juan|judd|jude|judy|jung|just)";
-    namesDict.lastNames.j[5] = "(jacks|jacob|jaffe|jaime|james|janes|jason|jasso|jenks|jesse|jeter|jiles|jinks|johns|jolly|jonas|jones|jorge|" +
-                                "joyce|judge)";
-    namesDict.lastNames.j[6] = "(jacobo|jacobs|jacoby|jaeger|jahnke|jaimes|jansen|jaquez|jarman|jarmon|jarvis|jasper|javier|jaynes|jensen|jenson|" +
-                                "jerome|jessen|jessie|jessup|jester|jewell|jewett|joiner|jolley|jordan|jordon|joseph|joslin|joyner|juarez|julian|" +
-                                "justus)";
-    namesDict.lastNames.j[7] = "(jackman|jackson|jacques|jameson|jamison|janssen|jardine|jarrell|jarrett|jeffers|jeffery|jeffrey|jemison|jenkins|" +
-                                "jimenez|jiminez|johnsen|johnson|joubert|judkins|justice)";
-    namesDict.lastNames.j[8] = "(jacobsen|jacobson|jamerson|jamieson|jauregui|jaworski|jeffcoat|jeffries|jennings|jernigan|jimerson|johansen|" +
-                                "johanson|johnston)";
-    namesDict.lastNames.j[9] = "(jablonski|jankowski|jaramillo|jefferies|jefferson|johnstone|jorgensen|jorgenson|josephson)";
-    namesDict.lastNames.k[10] = "(kilpatrick|kuykendall)";
-    namesDict.lastNames.k[11] = "(kirkpatrick)";
-    namesDict.lastNames.k[12] = "(klingensmith)";
-    namesDict.lastNames.k[13] = "(killingsworth)";
-    namesDict.lastNames.k[3] = "(kay|kee|key|kim)";
-    namesDict.lastNames.k[4] = "(kahl|kahn|kain|kane|kang|kapp|karl|karp|karr|kato|katz|kaye|kean|keck|keel|keen|keil|keim|kell|kemp|kent|kern|" +
-                                "kerr|keys|khan|kidd|kiel|kile|king|kipp|kirk|kish|kite|klug|knox|koch|kohl|kohn|kolb|kong|koon|kopp|korn|koss|" +
-                                "krug|kuhl|kuhn|kunz|kutz|kwan|kwon|kyle)";
-    namesDict.lastNames.k[5] = "(karns|kautz|keane|keefe|keele|keene|kehoe|keith|kelly|kelso|kempf|kenny|kerby|kerns|keyes|kiger|kight|kimes|" +
-                                "kirby|kiser|kitts|kizer|klatt|klaus|klein|kline|kling|klink|klotz|knapp|knoll|knopp|knott|koehn|koons|koski|" +
-                                "kowal|kozak|kraft|kranz|kratz|kraus|krebs|kress|kroll|kruse|kuehn|kuhns|kumar|kuntz|kurtz|kyles|kyser)";
-    namesDict.lastNames.k[6] = "(kahler|kaiser|kaplan|karnes|kasper|kasten|kaylor|kearns|kearse|keaton|keefer|keegan|keeler|keeley|keenan|keener|" +
-                                "keeney|keeton|keiser|kellam|kellar|keller|kelley|kellum|kelsey|kemper|kenner|kenney|kennon|kenyon|kerley|kersey|" +
-                                "kester|keyser|khoury|kibler|kidder|kiefer|kilmer|kimber|kimble|kimmel|kimsey|kimura|kinard|kinder|kinlaw|kinney|" +
-                                "kinser|kinsey|kirsch|kittle|knight|knotts|kocher|koenig|kohler|koller|koonce|koontz|koster|kovach|kovacs|kramer|" +
-                                "krantz|krause|krauss|kremer|kruger|kunkel|kunkle)";
-    namesDict.lastNames.k[7] = "(kastner|kaufman|kearney|keating|keeling|keister|kellner|kellogg|kendall|kennard|kennedy|kershaw|kessler|ketcham|" +
-                                "ketchum|kidwell|kieffer|kilburn|kilgore|killian|killion|kimball|kincaid|kindred|kingery|kinnard|kirkham|kirkman|" +
-                                "kirksey|kistler|kitchen|klinger|knepper|knisley|knowles|knudsen|knudson|knutson|koehler|koerner|koester|kraemer|" +
-                                "krieger|kroeger|krueger|kuhlman)";
-    namesDict.lastNames.k[8] = "(kaminski|kauffman|kaufmann|kavanagh|kelleher|kendrick|kerrigan|killough|kimbrell|kingsley|kingston|kinsella|" +
-                                "kirchner|kirkland|kirkwood|kitchens|kittrell|knighten|knighton|knowlton|kornegay|kowalski)";
-    namesDict.lastNames.k[9] = "(kavanaugh|kellerman|kessinger|kimbrough|kingsbury|kirschner|kissinger|kobayashi|kowalczyk|kozlowski)";
-    namesDict.lastNames.l[10] = "(lafontaine|lafountain|lamontagne|larochelle|lauderdale|leatherman|letourneau|litchfield|littlejohn|livingston|" +
-                                "loudermilk)";
-    namesDict.lastNames.l[11] = "(leatherwood|lewandowski|littlefield)";
-    namesDict.lastNames.l[2] = "(le|li|lo|lu|ly)";
-    namesDict.lastNames.l[3] = "(lai|lam|lau|law|lay|lea|lee|leo|lew|ley|lim|lin|liu|low|loy|lum|luu|lux)";
-    namesDict.lastNames.l[4] = "(lacy|ladd|lahr|lail|lair|lake|lamb|lamm|lamp|land|lane|lang|lapp|lara|lark|lash|laws|lazo|leak|leal|lear|lees|" +
-                                "legg|lehr|lent|lenz|leon|lett|levi|levy|lien|lima|lind|ling|link|linn|lira|list|lock|lohr|long|loos|lord|lott|" +
-                                "love|lowe|loya|loyd|luce|luck|lugo|luis|luke|luna|lund|lunn|lupo|lusk|lutz|lyle|lynn|lyon)";
-    namesDict.lastNames.l[5] = "(labbe|laboy|lacey|laine|laing|laird|lakey|lally|lamar|lampe|lance|landa|laney|lange|lantz|lanza|large|larry|larue|" +
-                                "latta|lauer|lavin|layne|lazar|leach|leahy|leake|leary|leath|ledet|leech|leger|leigh|leija|leiva|lemay|lemke|lemon|" +
-                                "lemos|lemus|lentz|leone|leong|lerma|leroy|leung|levin|lewin|lewis|leyva|liang|libby|light|ligon|liles|lilly|limon|" +
-                                "lines|lloyd|locke|loera|logan|logue|lomas|lomax|loney|longo|loper|lopes|lopez|lough|louie|louis|lower|lowry|lucas|" +
-                                "lucia|lucio|lucky|lujan|luker|lundy|luong|lutes|lyles|lyman|lynch|lyons|lytle)";
-    namesDict.lastNames.l[6] = "(labrie|lackey|ladner|lafave|lajoie|lamont|lander|landes|landin|landis|landon|landry|langer|lanham|lanier|larkin|" +
-                                "larosa|larose|larsen|larson|lasher|lasley|laster|latham|lavoie|lawler|lawlor|lawson|lawton|lawyer|layman|layton|" +
-                                "lebron|lebrun|ledoux|leeper|lehman|leland|lemire|lemley|lemmon|lemons|lenard|lennon|lennox|lenoir|lepage|lerner|" +
-                                "lesher|leslie|lester|levine|levitt|lilley|lillie|linden|linder|linker|linton|lipsey|lister|liston|little|litton|" +
-                                "lively|llamas|loftin|loftis|lofton|loftus|lohman|lomeli|london|loomis|looney|looper|lorenz|loucks|lovato|lovell|" +
-                                "lovely|lovett|loving|lowder|lowell|lowery|lowman|lowrey|lozada|lozano|lucero|lucier|luckey|ludwig|luster|luther|" +
-                                "lykins)";
-    namesDict.lastNames.l[7] = "(labelle|labonte|lacasse|lacombe|lacroix|lafleur|lalonde|lambert|lampkin|landers|landrum|langdon|langham|langley|" +
-                                "lanning|laporte|largent|larkins|laroche|lasalle|lasater|lashley|lathrop|latimer|laurent|lavelle|lavigne|lawhorn|" +
-                                "lawless|lazarus|leavitt|leblanc|leboeuf|leclair|leclerc|ledesma|ledezma|ledford|lefevre|leflore|leggett|legrand|" +
-                                "lehmann|lejeune|lemieux|lemmons|lemoine|lenhart|leonard|lessard|liddell|liggett|liggins|lillard|linares|lincoln|" +
-                                "lindley|lindner|lindsay|lindsey|linkous|lippert|lizotte|lockard|lockett|loggins|logsdon|lombard|lorenzo|lovejoy|" +
-                                "lowther|luciano|luckett|ludwick|luevano|lumpkin|lussier)";
-    namesDict.lastNames.l[8] = "(lachance|lafferty|laflamme|lafrance|landeros|landreth|langford|langlois|langston|lankford|lapierre|laplante|" +
-                                "lapointe|larrabee|lassiter|laughlin|laureano|lavallee|lavalley|lavender|lavergne|lawrence|leathers|lecompte|" +
-                                "lefebvre|leftwich|leighton|lemaster|leonardo|letendre|leverett|levesque|levinson|lheureux|lightner|lindberg|" +
-                                "lindeman|lindgren|linville|lipscomb|littrell|lockhart|locklear|lockwood|loeffler|lombardi|lombardo|longoria|" +
-                                "lovelace|lovelady|loveland|loveless|lundberg|lundgren|lunsford|luttrell)";
-    namesDict.lastNames.l[9] = "(labrecque|laliberte|lamoureux|lancaster|lattimore|ledbetter|leibowitz|levasseur|lieberman|lightfoot|lindquist|" +
-                                "lindstrom|lineberry|littleton|livengood|llewellyn|lockridge|lundquist)";
-    namesDict.lastNames.m[10] = "(malinowski|manchester|manzanares|martindale|martinelli|mascarenas|massengale|mendenhall|merrifield|michaelson|" +
-                                "miramontes|montelongo|montemayor|montenegro|montgomery|mulholland)";
-    namesDict.lastNames.m[11] = "(morrissette)";
-    namesDict.lastNames.m[12] = "(merriweather|middlebrooks)";
-    namesDict.lastNames.m[2] = "(ma)";
-    namesDict.lastNames.m[3] = "(mai|may|mix|moe|moy)";
-    namesDict.lastNames.m[4] = "(maas|mabe|mace|mach|mack|macy|maes|main|maki|mann|mapp|mark|marr|mars|marx|mask|mast|mata|matz|maus|maya|maye|" +
-                                "mayo|mays|maze|mead|meek|melo|mena|mesa|metz|meza|mick|mier|mims|mink|mize|mock|moen|mohr|moll|monk|moon|mora|" +
-                                "more|moss|mota|mott|moua|moya|moye|mudd|muia|muir|mull|munn|muro|muse|muth|myer)";
-    namesDict.lastNames.m[5] = "(mabry|macon|mader|magee|mahan|maher|mahon|maier|major|maley|malik|maloy|manis|manns|manor|manzo|mapes|maple|" +
-                                "march|marek|mares|marin|marks|marra|marrs|marsh|marty|martz|mason|massa|masse|mateo|matos|matta|mauro|maxey|" +
-                                "mayer|mayes|mayle|mazur|mazza|meade|means|mears|meeks|mehta|meier|mejia|mello|menke|meraz|merry|mertz|metts|" +
-                                "meyer|miele|milam|milan|miles|miley|mills|milne|miner|mingo|minor|mintz|mixon|moats|mohan|money|monge|moniz|" +
-                                "monte|moody|moore|moran|morel|morey|morin|morse|mosby|moser|moses|moten|moton|mount|mowry|moyer|muncy|mundy|" +
-                                "muniz|munoz|munro|murry|music|myatt|myers|myles)";
-    namesDict.lastNames.m[6] = "(macedo|macias|maciel|mackey|madden|maddox|maddux|madera|madore|madrid|madsen|magana|maggio|magill|mahler|mahone|" +
-                                "majors|malave|malcom|malley|malloy|malone|mandel|maness|mangan|mangum|manion|manley|manson|manuel|maples|marble|" +
-                                "marcum|marcus|marine|marino|marion|marker|markey|markle|markus|marler|marley|marlin|marlow|marrow|martel|martin|" +
-                                "marvin|massey|massie|mastin|mather|mathes|mathew|mathis|matias|matney|matson|mattos|mattox|mauney|maupin|maurer|" +
-                                "maxson|mayers|mayhew|meador|mecham|medina|medley|medlin|meehan|meeker|mejias|mellon|melton|melvin|menard|mendes|" +
-                                "mendez|mercer|merida|merino|merkel|merkle|messer|meyers|michel|mickey|mickle|miguel|milano|millan|millar|miller|" +
-                                "millet|milner|milton|mincey|minter|minton|mizell|mobley|modlin|mohler|mojica|molina|moller|molloy|molnar|monaco|" +
-                                "monday|monger|monroe|monroy|monson|montes|montez|mooney|moorer|moreau|moreno|morgan|moritz|morley|morris|morrow|" +
-                                "morton|mosely|mosher|mosier|mosley|motley|mounts|mouton|mowery|moxley|moyers|mulkey|mullen|muller|mullin|mullis|" +
-                                "mulvey|munger|munroe|munson|murphy|murray|musick|musser|myrick)";
-    namesDict.lastNames.m[7] = "(machado|macklin|madigan|madison|maestas|maggard|maguire|mahoney|malcolm|mallard|mallett|mallory|maloney|mancini|" +
-                                "mancuso|mangrum|manning|mannino|mansour|manzano|marable|marcano|mariano|markham|markley|marlowe|marquez|marquis|" +
-                                "marrero|marrufo|marston|martell|martens|martini|martino|martins|masters|matheny|mathers|mathews|mathias|mathieu|" +
-                                "matlock|mattern|matthew|mattson|mauldin|maurice|maxwell|maynard|mayorga|meacham|meadows|meagher|medford|medlock|" +
-                                "medrano|meekins|mefford|meister|melcher|mellott|melnick|mendoza|menefee|meneses|mercado|mercier|merrell|merrick|" +
-                                "merrill|merritt|mertens|messick|messier|messina|messner|metcalf|metzger|metzler|michael|michaud|michell|michels|" +
-                                "mickens|midkiff|milburn|milford|millard|million|millsap|minnick|miracle|miranda|mireles|mitchel|mitchem|mitchum|" +
-                                "moeller|moffatt|moffett|moffitt|mohamed|monahan|montana|montano|montero|montiel|montoya|moorman|morales|moralez|" +
-                                "moreira|morelli|morrell|morrill|moseley|moulton|mueller|mulcahy|mullens|mullins|mumford|munguia|murdoch|murdock|" +
-                                "murillo|murphey|murrell)";
-    namesDict.lastNames.m[8] = "(madrigal|magnuson|magruder|mahaffey|mallette|marchand|marchant|marchese|marcotte|marriott|marshall|martines|" +
-                                "martinez|mashburn|matherly|matherne|matheson|mathison|matteson|matthews|mattison|maxfield|mayberry|mayfield|" +
-                                "medeiros|medellin|melancon|melanson|melendez|menchaca|mendiola|menendez|merchant|mercurio|meredith|merriman|" +
-                                "merryman|metcalfe|michaels|milligan|milliken|mitchell|mohammed|monaghan|moncrief|montague|montalvo|montanez|" +
-                                "morehead|moreland|moriarty|morrison|mortimer|mosqueda|moultrie|moynihan|muhammad|mulligan|mullinax|murphree|" +
-                                "musgrave|musgrove)";
-    namesDict.lastNames.m[9] = "(maldonado|mansfield|marchetti|marinelli|markowitz|marquardt|marroquin|martineau|martinson|masterson|mathewson|" +
-                                "mattingly|messenger|michalski|mickelson|middleton|mondragon|moorehead|morehouse|morrissey|mortensen|mortenson|" +
-                                "murchison|musselman)";
-    namesDict.lastNames.n[10] = "(napolitano|nottingham)";
-    namesDict.lastNames.n[11] = "(nightingale)";
-    namesDict.lastNames.n[2] = "(ng)";
-    namesDict.lastNames.n[3] = "(new|nez|ngo|nix|noe|nye)";
-    namesDict.lastNames.n[4] = "(nagy|nail|nall|nash|nava|nave|neal|neel|neff|neil|neri|nero|ness|nino|noah|noel|noll|nord|null|nunn|nutt)";
-    namesDict.lastNames.n[5] = "(nagel|nagle|nance|nason|neace|neale|nealy|neary|neely|neese|neill|nelms|newby|nicol|niemi|nieto|nigro|niles|" +
-                                "nixon|noble|nolan|nolen|nolte|north|novak|nowak|noyes|nunes|nunez)";
-    namesDict.lastNames.n[6] = "(nabors|nadeau|najera|nakano|nalley|napier|napoli|napper|naquin|natale|nathan|nation|naylor|neeley|negron|nelsen|" +
-                                "nelson|nemeth|nesbit|nester|nestor|neuman|nevels|nevins|newell|newlin|newman|newsom|newson|newton|nguyen|nickel|" +
-                                "nieman|nieves|nissen|nobles|noland|noonan|norman|norris|norton|nowell|nowlin|nugent|nunley|nutter)";
-    namesDict.lastNames.n[7] = "(naranjo|narvaez|nations|navarro|nazario|necaise|needham|negrete|neilson|nesbitt|nesmith|nettles|neumann|nevarez|" +
-                                "neville|newcomb|newkirk|newland|newport|newsome|nichols|nickell|nickels|nickens|nickles|nicolas|nielsen|nielson|" +
-                                "nilsson|nolasco|noriega|norvell|norwood|novotny|nowicki|numbers)";
-    namesDict.lastNames.n[8] = "(nakamura|neubauer|newberry|newhouse|nicholas|nicholls|norfleet|northern|nunnally)";
-    namesDict.lastNames.n[9] = "(natividad|navarrete|neighbors|nicholson|nickerson|nordstrom|northcutt)";
-    namesDict.lastNames.o[10] = "(overstreet)";
-    namesDict.lastNames.o[2] = "(oh)";
-    namesDict.lastNames.o[3] = "(ong|orr|ott)";
-    namesDict.lastNames.o[4] = "(oaks|ochs|oden|odom|odum|ogle|olds|olin|orta|orth|otis|otte|otto|owen)";
-    namesDict.lastNames.o[5] = "(oakes|oates|oberg|ochoa|odell|ogden|ohara|ohare|ojeda|oliva|olive|olivo|olmos|olney|olsen|olson|omara|oneal|" +
-                                "oneil|ortiz|orton|oshea|oster|osuna|otero|otten|oubre|owens|oxley|oyler|ozuna)";
-    namesDict.lastNames.o[6] = "(oakley|obrian|obrien|obryan|ocampo|ocasio|offutt|ogburn|ogrady|okeefe|oldham|oleary|olguin|olivas|oliver|olvera|" +
-                                "omeara|oneill|oquinn|orange|orcutt|ordway|orosco|orozco|ortega|ortego|osborn|osburn|osgood|osorio|osteen|oswald|" +
-                                "oswalt|otoole|ousley|outlaw|ovalle|overby|owings|owsley|oxford)";
-    namesDict.lastNames.o[7] = "(obryant|oconner|oconnor|oglesby|okelley|olinger|olivera|olivier|omalley|oquendo|ordonez|oreilly|orlando|ornelas|" +
-                                "orourke|osborne|overman|overton)";
-    namesDict.lastNames.o[8] = "(oconnell|odonnell|ogletree|oliphant|olivares|olivarez|oliveira|olmstead|orellana|osterman|ottinger)";
-    namesDict.lastNames.o[9] = "(olszewski|ontiveros|ostrander|osullivan|ouellette)";
-    namesDict.lastNames.p[10] = "(pellegrino|pennington|pilkington|plascencia|poindexter|provencher)";
-    namesDict.lastNames.p[11] = "(pendergrass|porterfield|prendergast)";
-    namesDict.lastNames.p[3] = "(pak|paz|poe)";
-    namesDict.lastNames.p[4] = "(pace|pack|paez|page|palm|pang|papa|pape|pare|park|parr|pass|pate|paul|peak|peck|peek|peel|pena|penn|pepe|pete|" +
-                                "pham|phan|pigg|pike|pina|pine|pino|pitt|pohl|polk|pond|pool|pope|popp|post|powe|pray|puga|pugh|pyle)";
-    namesDict.lastNames.p[5] = "(pabon|pagan|paige|paine|palma|pardo|paris|parke|parks|parra|parry|patch|patel|paulk|payne|peace|peach|peake|" +
-                                "pearl|pease|peavy|peden|pedro|peele|peery|pence|penny|pepin|percy|perea|peres|perez|perri|perry|peter|petry|" +
-                                "petty|pfaff|pharr|piatt|pinto|piper|pires|pitre|pitts|place|plank|plant|platt|plaza|pless|plumb|pogue|ponce|" +
-                                "poole|poore|posey|potts|power|prado|pratt|price|pride|prine|prior|pryor|purdy|pyles)";
-    namesDict.lastNames.p[6] = "(packer|padron|pagano|palmer|palomo|pankey|pappas|paquin|pardue|parent|parham|parish|parisi|parker|parmer|parris|" +
-                                "parson|partin|parton|pastor|patino|patten|patton|pauley|paulus|paxton|payton|pearce|pedigo|peeler|pegues|pelayo|" +
-                                "pelkey|pelton|pender|penner|penney|penrod|penton|pepper|perdue|perrin|perron|person|peters|petrie|pettis|pettit|" +
-                                "pettus|peyton|phelan|phelps|phifer|philip|phipps|piazza|picard|pickle|pieper|pierce|piercy|pierre|pillow|pinder|" +
-                                "pineda|pinson|pipkin|pippin|pirtle|pisano|pitman|plante|player|poland|poling|polley|polson|ponder|pooler|porras|" +
-                                "porter|portis|posada|poston|poteat|poteet|potter|poulin|poulos|pounds|powell|powers|prater|preece|priddy|priest|" +
-                                "prieto|prince|probst|propst|proulx|prouty|pruett|pruitt|puente|pulido|pullen|pulley|pulver|purser|purvis|putman|" +
-                                "putnam)";
-    namesDict.lastNames.p[7] = "(pacheco|packard|paddock|padgett|padilla|painter|palacio|palermo|palmore|palumbo|pannell|pantoja|paradis|paredes|" +
-                                "parkman|parnell|parrish|parrott|parsley|parsons|partain|partida|paschal|pascual|pastore|patrick|paulino|paulsen|" +
-                                "paulson|paynter|peabody|peachey|peacock|pearman|pearson|peckham|pedraza|pedroza|peebles|peeples|peltier|pendley|" +
-                                "penland|pennell|peoples|peppers|perales|peralta|perdomo|pereira|perkins|perlman|perrine|perrone|persaud|pettway|" +
-                                "pfeffer|pfeifer|pfister|philips|phillip|philpot|pickard|pickens|pickett|pierson|pilcher|pilgrim|pinkham|pinkney|" +
-                                "pitcher|pittman|pizarro|plourde|plowman|plumley|plummer|pointer|poirier|poisson|polanco|pollack|pollard|pollock|" +
-                                "pomeroy|poynter|prather|presley|preston|prevost|prewitt|pridgen|pringle|proctor|prosser|provost|puckett|pulliam|" +
-                                "purcell|purnell|pursley|puryear)";
-    namesDict.lastNames.p[8] = "(palacios|palmieri|palomino|paniagua|paquette|paradise|paschall|pasquale|passmore|paterson|pattison|pearsall|" +
-                                "pedersen|pederson|pellerin|perryman|peterman|petersen|peterson|pettaway|pfeiffer|phillips|philpott|pichardo|" +
-                                "pimental|pimentel|pinckney|pinkston|pleasant|plunkett|portillo|preciado|prentice|prescott|presnell|pressley|" +
-                                "prichard|proffitt|pugliese|pumphrey)";
-    namesDict.lastNames.p[9] = "(palladino|parenteau|parkhurst|parkinson|parmenter|partridge|patterson|pelletier|pemberton|pendleton|perreault|" +
-                                "persinger|petterson|pettiford|pettigrew|pickering|pinkerton|pridemore|pritchard|pritchett)";
-    namesDict.lastNames.q[11] = "(quintanilla)";
-    namesDict.lastNames.q[4] = "(quan)";
-    namesDict.lastNames.q[5] = "(quade|queen|quick|quinn|quirk)";
-    namesDict.lastNames.q[6] = "(qualls|quiles|quimby|quiroz)";
-    namesDict.lastNames.q[7] = "(quarles|quesada|quezada|quigley|quillen|quinlan)";
-    namesDict.lastNames.q[8] = "(quinones|quinonez|quintana|quintero)";
-    namesDict.lastNames.r[10] = "(rademacher|richardson|rutherford)";
-    namesDict.lastNames.r[11] = "(rittenhouse|rosenberger)";
-    namesDict.lastNames.r[3] = "(rae|rao|rau|ray|rea|red|rex|rey|roe|roy|rue)";
-    namesDict.lastNames.r[4] = "(raab|rabe|raby|race|rael|rahn|rand|rapp|rash|rath|razo|read|real|redd|reed|reel|rees|rego|reid|reis|remy|reno|" +
-                                "rhea|rice|rich|rick|rico|ries|rife|ring|rios|ritz|robb|roby|rock|rohr|rojo|roll|rome|romo|rood|roof|roop|root|" +
-                                "rosa|rose|ross|roth|rowe|ruby|ruch|rudd|rudy|ruff|ruhl|ruiz|rule|rupp|rush|rusk|russ|rust|ruth|ryan)";
-    namesDict.lastNames.r[5] = "(rader|ragan|rager|rains|rakes|raley|ralph|rambo|ramer|ramey|ramon|ramos|raney|range|raper|rauch|rawls|ready|reams|" +
-                                "reber|reddy|reece|reedy|reese|reeve|regan|reich|reiss|reitz|revis|reyes|reyna|rhine|rhone|rhyne|ricci|ricks|rider|" +
-                                "ridge|riffe|rigby|riggs|riley|rivas|rizzo|roach|roark|robey|robin|rocco|rocha|roche|rodas|roddy|roden|roger|rohde|" +
-                                "rojas|rolfe|rolon|roman|romeo|roney|rooks|roper|roque|rosas|rosen|rossi|rouse|roush|rowan|royal|royce|royer|rubin|" +
-                                "rubio|ruble|rueda|rumph|runge|russo|ryals|ryder)";
-    namesDict.lastNames.r[6] = "(racine|radtke|rahman|railey|raines|rainey|ramage|ramsay|ramsey|randle|rangel|rankin|ransom|ranson|rascon|rausch|" +
-                                "rawson|raymer|rayner|raynor|reader|reagan|reagan|reaves|reavis|rector|redden|redman|redmon|reeder|reeves|reilly|" +
-                                "reimer|reinke|reiter|renaud|rendon|renfro|renner|reuter|revell|rhoads|rhoden|rhodes|richey|richie|ricker|riddle|" +
-                                "ridley|riedel|rieger|riffle|rigney|rigsby|rimmer|rincon|ringer|riojas|ripley|risley|risner|ritter|rivard|rivera|" +
-                                "rivero|rivers|robert|robins|robles|robson|rodman|roeder|rogers|rohrer|roland|roldan|roller|romano|romans|romero|" +
-                                "romine|rooker|rooney|rosado|roscoe|rosser|rounds|roundy|rowden|rowell|rowley|roybal|rozier|rubino|rucker|ruelas|" +
-                                "ruffin|rumsey|runion|runyan|runyon|rupert|russel|rutter)";
-    namesDict.lastNames.r[7] = "(rackley|radford|ragland|raleigh|ralston|rameriz|ramirez|randall|randell|rankins|rathbun|ratliff|rawlins|rayborn|" +
-                                "rayburn|rayford|raymond|reading|reardon|reddick|redding|redmond|rembert|renfroe|renfrow|renshaw|reynoso|rhoades|" +
-                                "richard|richman|richter|rickard|rickert|rickman|riddell|riddick|rideout|ridgway|riggins|rinaldi|riordan|ritchey|" +
-                                "ritchie|robbins|roberge|roberts|robison|robledo|rodarte|rodgers|roebuck|rollins|rondeau|rosales|rosario|rossman|" +
-                                "rothman|roussel|rowland|rowlett|royster|rudolph|ruggles|runnels|ruppert|rushing|russell|rutland)";
-    namesDict.lastNames.r[8] = "(radcliff|rafferty|ragsdale|rancourt|randazzo|randolph|rasberry|ratcliff|rathbone|rawlings|regalado|register|" +
-                                "reichert|reinhart|renteria|resendez|reynolds|richards|richburg|richmond|ricketts|ridenour|ridgeway|riendeau|" +
-                                "rinehart|risinger|roberson|robinett|robinson|rochelle|rockwell|roderick|rodrigez|rodrigue|rountree|rousseau|" +
-                                "ruggiero|rutledge)";
-    namesDict.lastNames.r[9] = "(radcliffe|rainwater|rasmussen|ratcliffe|reinhardt|remillard|remington|rhinehart|richerson|ridenhour|robertson|" +
-                                "robichaud|robichaux|robinette|rochester|rodrigues|rodriguez|rodriques|rodriquez|roseberry|rosenbaum|rosenberg|" +
-                                "rosenblum|rosenfeld|rosenthal|rothstein|roundtree|ruvalcaba)";
-    namesDict.lastNames.s[10] = "(santamaria|scarbrough|schoonover|schumacher|schweitzer|shropshire|singletary|smitherman|somerville|southworth|" +
-                                "stackhouse|stallworth|standridge|stansberry|stephenson|strickland|sturdivant|sunderland|sutherland|swearingen)";
-    namesDict.lastNames.s[11] = "(satterfield|satterwhite|scarborough|schexnayder|schoonmaker|shackelford|shaughnessy|silverstein|southerland|" +
-                                "summerville)";
-    namesDict.lastNames.s[12] = "(stringfellow|stubblefield)";
-    namesDict.lastNames.s[2] = "(su)";
-    namesDict.lastNames.s[3] = "(sam|see|sim|son|suh|sun)";
-    namesDict.lastNames.s[4] = "(saad|sabo|saez|sage|sain|saiz|sale|sams|sand|sapp|sass|sato|saul|seal|seay|self|sell|sena|seng|senn|shah|shaw|" +
-                                "shay|shea|shin|sims|sink|sipe|sisk|slay|snow|song|sosa|soto|swan)";
-    namesDict.lastNames.s[5] = "(saari|sabin|sacco|sachs|saenz|sager|salas|salem|sales|sands|sandy|santo|sauer|sauls|savoy|saxon|sayre|scalf|" +
-                                "scott|seale|seals|sealy|sears|seely|segal|seger|seitz|selby|sells|serna|serra|shade|shane|shank|sharp|shedd|" +
-                                "shell|shine|shinn|shipe|shipp|shirk|shook|shoop|shope|shore|short|shoup|shrum|shuck|shull|shupe|shutt|sides|" +
-                                "sikes|silas|siler|sills|silva|simms|simon|sines|singh|sipes|sisco|sites|skeen|slack|slade|slate|sloan|slone|" +
-                                "small|smart|smith|smock|smoot|smyth|snapp|snead|sneed|snell|snook|sokol|soler|solis|soliz|soper|soria|soucy|" +
-                                "soule|sousa|south|souza|spain|spann|spear|speck|speed|speer|spell|spina|stack|stacy|stahl|stamm|stamp|stark|" +
-                                "starr|staub|stcyr|steed|steel|steen|steib|stein|stepp|stern|still|stine|stith|stitt|stock|stoll|stone|storm|" +
-                                "story|stott|stout|stowe|stroh|strom|stull|stump|sturm|suber|suggs|swaim|swain|swank|swann|sweat|sweet|swett|" +
-                                "swift|swink|swope|sykes|szabo)";
-    namesDict.lastNames.s[6] = "(sadler|sallee|salley|salmon|salter|salyer|samons|sample|samson|samuel|sander|sankey|santos|sartin|sarver|" +
-                                "sasser|savage|savoie|sawyer|saxton|sayers|sayles|saylor|scales|schade|scharf|schatz|schaub|scheer|schell|" +
-                                "schenk|schick|schiff|schmid|schock|schoen|scholl|scholz|schott|schram|schulz|schutt|schutz|schwab|scully|" +
-                                "seaman|searcy|searle|seaton|seeger|seeley|segura|seiber|seidel|seiler|settle|setzer|seward|sewell|sexton|" +
-                                "shafer|shaner|shanks|sharma|sharpe|shaver|shealy|shears|sheets|shelby|shelly|sherer|sherry|shirey|shiver|" +
-                                "shores|shouse|shreve|shuler|shults|shultz|shuman|sibley|siegel|sierra|sigler|sigmon|sikora|silvas|silver|" +
-                                "silvey|silvia|simmon|simone|simons|singer|sipple|sirois|sisson|skaggs|skiles|slagle|slater|slaton|slavin|" +
-                                "sledge|slocum|smalls|smiley|smythe|snider|snipes|snyder|soares|solano|somers|sommer|sotelo|sowder|sowell|" +
-                                "sowers|sparks|speaks|spears|spence|sperry|spicer|spiker|spikes|spinks|spires|spivey|spring|squire|stacey|" +
-                                "staggs|staley|stamey|stamps|starks|staten|staton|steele|steger|stella|steven|stiles|stites|stjohn|stocks|" +
-                                "stoker|stokes|stoltz|stoner|stonge|stoops|storer|storey|storms|stotts|stover|strain|strait|strand|straub|" +
-                                "strawn|street|strode|strong|stroud|stroup|struck|strunk|stuart|stubbs|studer|stultz|stumpf|styles|suarez|" +
-                                "suiter|summer|sumner|surber|sutter|suttle|sutton|suzuki|swarey|swartz|sweatt|swiger|sylvia)";
-    namesDict.lastNames.s[7] = "(sackett|saddler|safford|salazar|salcedo|salcido|saldana|salerno|salgado|salinas|salmons|salyers|sammons|" +
-                                "samples|sampson|samuels|sanborn|sanches|sanchez|sanders|sandler|sandlin|sanford|sansone|santana|santoro|" +
-                                "santoyo|sargent|sattler|sauceda|saucedo|saucier|saville|sawyers|scalise|scanlan|scanlon|schafer|schenck|" +
-                                "scherer|schmidt|schmitt|schmitz|schnell|schramm|schrock|schuler|schulte|schultz|schulze|schuman|schwarz|" +
-                                "scruggs|scudder|seabolt|searles|sedillo|segovia|seibert|seifert|sellars|sellers|seltzer|serrano|serrato|" +
-                                "session|sessoms|settles|sevilla|seymore|seymour|shaffer|shankle|shannon|shapiro|sharkey|shearer|sheehan|" +
-                                "sheldon|shelley|shelton|shepard|sherman|sherrod|sherwin|shields|shipley|shipman|shirley|shively|shivers|" +
-                                "shockey|shorter|showers|shrader|shriver|shubert|shumate|shumway|shuster|siebert|sievers|silvers|simmons|" +
-                                "simonds|simpson|singley|skelton|skinner|skipper|slayton|slusher|smalley|snowden|soileau|solberg|solomon|" +
-                                "solorio|sommers|sonnier|soriano|sorrell|sparrow|speight|spencer|spiegel|spiller|spinner|spitzer|spooner|" +
-                                "sprague|spriggs|springs|sprouse|spruill|squires|stadler|stamper|stancil|stanley|stanton|staples|starkey|" +
-                                "starnes|stclair|stearns|steffen|stegall|steiner|steinke|stephan|stephen|sterner|stevens|steward|stewart|" +
-                                "stidham|stinson|stlouis|stocker|stovall|stowell|stowers|strader|strahan|strange|strauss|strobel|stroman|" +
-                                "struble|stuckey|sturgis|sublett|sudduth|sullins|summers|sumpter|sumrall|surface|surratt|sussman|sutphin|" +
-                                "suttles|swanson|sweeney|swenson|swindle|swinney|swinton|swisher|switzer)";
-    namesDict.lastNames.s[8] = "(saavedra|sadowski|saldivar|salvador|sanabria|sandberg|sandifer|sandoval|santiago|saunders|scarlett|schaefer|" +
-                                "schaffer|schaller|schiller|schlegel|schrader|schroder|schubert|schulman|schumann|schuster|schwartz|scofield|" +
-                                "scoggins|scribner|sessions|severson|shanahan|shanklin|shattuck|shephard|shepherd|sheppard|sheridan|sherlock|" +
-                                "sherrill|sherwood|shilling|shockley|shoemake|shoffner|shotwell|shumaker|silveira|simonson|simpkins|sinclair|" +
-                                "sisneros|sizemore|skidmore|slattery|smithers|smithson|smothers|sorensen|sorenson|sorrells|southard|southern|" +
-                                "spalding|spangler|sparkman|spearman|spellman|sperling|spillman|spinelli|spradlin|springer|sprinkle|spurgeon|" +
-                                "spurlock|stafford|stallard|standley|stanfill|stanford|starling|stauffer|steadman|stebbins|steelman|steffens|" +
-                                "stephens|sterling|stickney|stiffler|stillman|stiltner|stilwell|stinnett|stockman|stockton|stoddard|stouffer|" +
-                                "stpierre|straight|stratton|strawser|streeter|stringer|strother|sturgeon|sturgill|stutzman|sullivan|sundberg|" +
-                                "swafford|sweitzer|swindell)";
-    namesDict.lastNames.s[9] = "(salisbury|salvatore|samaniego|samuelson|sanderson|sandstrom|santacruz|santillan|sarmiento|scarberry|schaeffer|" +
-                                "schaffner|scheffler|schilling|schindler|schlosser|schlueter|schneider|schofield|schreiber|schreiner|schroeder|" +
-                                "scroggins|sebastian|sepulveda|severance|sheffield|shifflett|shoemaker|shoulders|showalter|sifuentes|silverman|" +
-                                "singleton|slaughter|smallwood|snodgrass|solorzano|spaulding|stallings|stalnaker|standifer|stanfield|stansbury|" +
-                                "stapleton|steinberg|steinmetz|sternberg|stevenson|stgermain|sthilaire|stillwell|stockdale|stockwell|stollings|" +
-                                "stoltzfus|stribling|strickler|stricklin|stromberg|summerlin|sylvester|szymanski)";
-    namesDict.lastNames.t[10] = "(tankersley|thibodeaux|timberlake|trowbridge)";
-    namesDict.lastNames.t[2] = "(to)";
-    namesDict.lastNames.t[3] = "(tam|tan|tew|tom|toy|tse|tso|tye)";
-    namesDict.lastNames.t[4] = "(tabb|taft|tait|tang|tapp|tarr|tate|teal|teel|thai|thao|thom|tice|till|timm|todd|toms|tong|toon|toro|toth|towe|" +
-                                "tran|troy|tsai|tuck|tull|turk)";
-    namesDict.lastNames.t[5] = "(taber|tabor|tamez|tapia|tatro|tatum|tello|terry|tesch|testa|tharp|theis|thiel|thies|thoma|thorn|thorp|tibbs|" +
-                                "tighe|timms|titus|tobey|tobin|toler|tolle|tomas|toner|toney|toole|tovar|tower|towle|towne|towns|tracy|trapp|" +
-                                "trask|treat|trejo|trent|trice|trigg|trinh|tripp|trott|trout|truax|trull|tsang|tubbs|tucci|tudor|tully|twigg|" +
-                                "tyler|tyner|tynes|tyree|tyson)";
-    namesDict.lastNames.t[6] = "(tafoya|talbot|talley|tamayo|tanaka|tanner|tapley|tarter|tarver|taylor|teague|tedder|teeter|tejada|tejeda|telles|" +
-                                "tellez|temple|tenney|thames|tharpe|thayer|thomas|thorne|thorpe|thrash|tiller|tilley|tillis|tilton|tingle|tinker|" +
-                                "tinney|tipton|tirado|tobias|toledo|tolley|tolman|tolson|tomlin|tooley|toombs|toomey|torres|torrey|torrez|totten|" +
-                                "towers|towner|townes|tracey|trader|trahan|travis|treece|troupe|troyer|truitt|truman|truong|tsosie|tucker|tuggle|" +
-                                "tullis|turley|turman|turner|turney|turpin|tuttle|twitty|twomey)";
-    namesDict.lastNames.t[7] = "(tackett|taggart|talbert|talbott|tallent|tallman|tarango|tardiff|tarrant|tavares|tavarez|taveras|teasley|tedesco|" +
-                                "tedford|tennant|tenorio|terrell|terrill|tessier|thacker|thaxton|theisen|theriot|thielen|thigpen|thomsen|thomson|" +
-                                "thorson|thorton|thrower|thurber|thurman|tidwell|tierney|tiffany|tillery|tillman|timmons|tincher|tindall|tinsley|" +
-                                "tisdale|tolbert|toliver|toscano|townley|trainor|travers|traylor|trevino|tribble|trimble|trotman|trotter|trudeau|" +
-                                "tunnell|turgeon|turnage|turnbow|tyndall|tyrrell)";
-    namesDict.lastNames.t[8] = "(teixeira|tennyson|terrazas|thatcher|therrien|thibault|thomason|thompson|thornton|thrasher|thurmond|thurston|" +
-                                "tibbetts|tijerina|tolliver|tompkins|torrence|townsend|trammell|trantham|treadway|tremblay|trinidad|triplett|" +
-                                "trombley|troutman|trujillo|trussell|tunstall|turcotte|turnbull)";
-    namesDict.lastNames.t[9] = "(takahashi|templeton|tetreault|theriault|thibeault|thibodeau|thompkins|thornburg|thornhill|tillotson|timmerman|" +
-                                "tolentino|tomlinson|torgerson|toussaint|treadwell|truesdale)";
-    namesDict.lastNames.u[3] = "(uhl)";
-    namesDict.lastNames.u[5] = "(ulloa|ulmer|unger|unruh|upton|urban|urena|urias|uribe|usher|utley|utter)";
-    namesDict.lastNames.u[6] = "(ulrich|upshaw|urbina|ussery)";
-    namesDict.lastNames.u[8] = "(ulibarri|upchurch|urquhart)";
-    namesDict.lastNames.u[9] = "(underhill|underwood)";
-    namesDict.lastNames.v[10] = "(valenzuela|valladares|vanbuskirk|vandenberg|vanderpool|vermillion|villagomez|villalobos|villanueva|villarreal|" +
-                                "villasenor)";
-    namesDict.lastNames.v[11] = "(villalpando)";
-    namesDict.lastNames.v[12] = "(vaillancourt)";
-    namesDict.lastNames.v[13] = "(vanlandingham)";
-    namesDict.lastNames.v[2] = "(vo|vu)";
-    namesDict.lastNames.v[3] = "(van|via|vue)";
-    namesDict.lastNames.v[4] = "(vaca|vail|vang|vann|veal|vega|vela|vera|vest|vice|vick|vogt|volk|volz|voss)";
-    namesDict.lastNames.v[5] = "(vaden|valle|vance|varga|vargo|veach|velez|veliz|vidal|viera|vigil|villa|vines|viola|vogel|voigt|volpe|vuong)";
-    namesDict.lastNames.v[6] = "(vinson|valles|vaughn|valley|varner|varney|vetter|verret|vitale|vachon|vereen|valdes|vernon|vierra|vaught|valdez|" +
-                                "vargas|verdin|victor|varela|vestal|virgil|vannoy|vining|voyles|vieira)";
-    namesDict.lastNames.v[7] = "(vaccaro|valadez|valente|valenti|valerio|vallejo|vandyke|vanegas|vanhorn|vanover|vanpelt|vanzant|vasquez|vaughan|" +
-                                "vazquez|velarde|velasco|venable|venegas|ventura|verdugo|vergara|vickers|vickery|vidrine|vincent|vollmer)";
-    namesDict.lastNames.v[8] = "(valdivia|valencia|valentin|valliere|valverde|vanburen|vandiver|vandusen|vanhoose|vanmeter|veilleux|verduzco|" +
-                                "victoria|villegas|vineyard|violette|voorhees)";
-    namesDict.lastNames.v[9] = "(valentine|valentino|vanhouten|vansickle|vanwinkle|velasquez|velazquez|villareal)";
-    namesDict.lastNames.w[10] = "(wisniewski|wainwright|wooldridge|winchester|williamson|willoughby|washington|waterhouse|weathersby|whitehouse|" +
-                                "whittemore|willingham|westbrooks|wellington|whitehurst|warrington)";
-    namesDict.lastNames.w[11] = "(weatherford|whittington|witherspoon|worthington)";
-    namesDict.lastNames.w[12] = "(weatherspoon|westmoreland)";
-    namesDict.lastNames.w[2] = "(wu)";
-    namesDict.lastNames.w[3] = "(way|woo)";
-    namesDict.lastNames.w[4] = "(wade|wahl|walk|wall|walz|wang|ward|ware|watt|webb|weed|weil|weir|weis|wert|west|wick|wild|will|wilt|wine|wing|" +
-                                "winn|wise|witt|wold|wolf|wong|wood|word|wray|wren|wynn)";
-    namesDict.lastNames.w[5] = "(wages|waite|waits|waldo|wales|walls|walsh|waltz|watts|waugh|wayne|weber|weeks|weems|weese|weise|weiss|welch|wells|" +
-                                "welsh|welty|wendt|wentz|werth|wertz|wheat|white|whitt|whyte|wicks|wiese|wiggs|wight|wilde|wiles|wiley|wilke|wilks|" +
-                                "wills|wingo|wirth|witte|wolfe|wolff|woods|woody|woolf|worth|wrenn|wyant|wyatt|wyche|wylie|wyman|wynne)";
-    namesDict.lastNames.w[6] = "(wessel|wilkie|waller|wesley|wacker|werner|wilder|wilber|webber|womble|wexler|wilcox|wayman|wicker|winder|wiener|" +
-                                "weller|womack|wisner|wester|wetzel|whalen|winton|wallis|weston|willis|wojcik|wesson|whited|wadley|whelan|wright|" +
-                                "wilson|walton|winter|walker|wallin|waites|weiler|warren|worthy|walter|witham|warden|wooden|warner|wooley|winner|" +
-                                "winger|weldon|walden|weaver|willie|wilkes|waddle|wallen|wimmer|walley|wasson|wisdom|wagner|wyrick|wenzel|weimer|" +
-                                "weiner|welton|weddle|willey|wegner|weigel|wendel|wilbur|wenger|waring|weiser|welker|wilmot|whaley|worley|worden|" +
-                                "wooten|witter|waters|watson|waldon)";
-    namesDict.lastNames.w[7] = "(wilhite|wilmoth|winston|william|willett|wallace|willard|wiggins|wigfall|witcher|wortham|wilhelm|willson|wilburn|" +
-                                "windsor|wheeler|windham|winters|wilcher|wilborn|wolcott|wingard|wittman|withrow|wilkins|winslow|watters|waldman|" +
-                                "wagoner|wilkens|waldrop|wyckoff|worrell|weisman|waddell|wachter|wingate|warwick|webster|worsham|warnock|walston|" +
-                                "watkins|warrick|walters|wolford|watford|walther|whitley|wysocki|worthen|welborn|wofford|woolley|wozniak|winkler|" +
-                                "woodson|withers|weekley|wildman|walling|wetmore|whitted|wilfong|whitman|woodall|winfrey|whiting|whipple|wheaton|" +
-                                "whatley|woodley|woodman|wieland|whittle|whitten|wiegand|wickham|whorton|whitmer|whitson|waldron|weiland|woodard|" +
-                                "wellman|woolery|wortman|whitlow|weidner|wampler|woosley|woolard|woolsey|wharton|whitney|wescott|wiseman|workman)";
-    namesDict.lastNames.w[8] = "(waggoner|warfield|washburn|watanabe|waterman|weathers|weinberg|westcott|westfall|westover|westphal|wheatley|" +
-                                "whitacre|whitaker|whitcomb|whiteley|whiteman|whitener|whitford|whitlock|whitmire|whitmore|wilbanks|willette|" +
-                                "williams|wimberly|winchell|winfield|winstead|woodbury|woodcock|woodford|woodland|woodring|woodruff|woodward)";
-    namesDict.lastNames.w[9] = "(wadsworth|wakefield|wasserman|watterson|weatherby|weatherly|weinstein|weintraub|wentworth|westbrook|westerman|" +
-                                "whetstone|whisenant|whitehead|whiteside|whitfield|whittaker|whitworth|wilkerson|wilkinson|williford|wingfield|" +
-                                "witkowski|woodhouse|woodworth)";
-    namesDict.lastNames.x[5] = "(xiong)";
-    namesDict.lastNames.y[10] = "(youngblood|yarborough)";
-    namesDict.lastNames.y[2] = "(yi|yu)";
-    namesDict.lastNames.y[3] = "(yan|yee|yon|yoo)";
-    namesDict.lastNames.y[4] = "(yang|yoho|yoon|york|yost|yuen)";
-    namesDict.lastNames.y[5] = "(yager|yancy|yanez|yates|yocum|yoder|young|yount)";
-    namesDict.lastNames.y[6] = "(yamada|yancey|yazzie|ybarra|yeager|youngs)";
-    namesDict.lastNames.y[7] = "(yoshida|youmans|younger)";
-    namesDict.lastNames.y[8] = "(yingling|yamamoto|youngman)";
-    namesDict.lastNames.y[9] = "(yarbrough)";
-    namesDict.lastNames.z[10] = "(zimmermann)";
-    namesDict.lastNames.z[4] = "(zack|zahn|zink|zinn|zito|zook|zorn)";
-    namesDict.lastNames.z[5] = "(zayas|zhang|zuber)";
-    namesDict.lastNames.z[6] = "(zamora|zander|zapata|zarate|zavala|zelaya|zeller|zepeda|zimmer|zuniga)";
-    namesDict.lastNames.z[7] = "(zachary|zamudio|zeigler|ziegler)";
-    namesDict.lastNames.z[8] = "(zambrano|zaragoza)";
-    namesDict.lastNames.z[9] = "(zielinski|zimmerman)";
-    placeList = "(afghanistan|abu\\sdhabi|abuja|accra|adamstown|addis\\sababa|åland\\sislands|albania|albany|algeria|algiers|alofi|" +
-             "american\\ssamoa|amman|amsterdam|anchorage|andorra|andorra\\sla\\svella|angola|anguilla|ankara|annapolis|" +
-             "antananarivo|antarctica|antigua\\sand\\sbarbuda|apia|argentina|armenia|aruba|ashgabat|asmara|astana|" +
-             "asunción|athens|atlanta|augusta|austin|australia|austria|avarua|azerbaijan|baghdad|bahamas|bahrain|baku|" +
-             "bamako|bandar\\sseri\\sbegawan|bangkok|bangladesh|bangui|banjul|barbados|basseterre|baton\\srouge|beijing|" +
-             "beirut|belarus|belgium|belgrade|belize|belmopan|benin|berlin|bermuda|bern|bhutan|billings|birmingham|" +
-             "bishkek|bismarck|bissau|bogotá|boise|bolivia|bosnia\\sand\\sherzegovina|boston|botswana|bouvet\\sisland|brasília|" +
-             "bratislava|brazil|brazzaville|bridgeport|bridgetown|british\\sindian\\socean\\sterritory|brunei\\sdarussalam|" +
-             "brussels|bucharest|budapest|buenos\\saires|bujumbura|bulgaria|burkina\\sfaso|burundi|cairo|cambodia|" +
-             "cameroon|canada|canberra|cape\\sverde|caracas|carson\\scity|castries|cayman\\sislands|central\\safrican\\srepublic|" +
-             "chad|charleston|charlotte|charlotte\\samalie|charlotte\\samalie|cheyenne|chicago|chile|china|chisinau|" +
-             "christmas\\sisland|cincinnati|cleveland|cockburn\\stown|cocos\\s(keeling)\\sislands|colombia|columbia|columbus|" +
-             "comoros|conakry|concord|congo|cook\\sislands|copenhagen|costa\\srica|côte\\sd'ivoire|croatia|cuba|cyprus|" +
-             "czech\\srepublic|czechoslovakia|dakar|damascus|denmark|denver|des\\smoines|dhaka|dili|djibouti|djibouti|" +
-             "dodoma|doha|dominica|dominican\\srepublic|douglas|dover|dublin|dushanbe|east\\stimor|ecuador|egypt|" +
-             "el\\ssalvador|episkopi\\scantonment|equatorial\\sguinea|eritrea|estonia|ethiopia|fagatogo|falkland\\sislands\\s(malvinas)|" +
-             "fargo|faroe\\sislands|fiji|finland|france|frankfort|freetown|french\\sguiana|french\\spolynesia|funafuti|" +
-             "gabon|gaborone|gambia|george\\stown|georgetown|georgia|germany|ghana|gibraltar|gibraltar|greece|greenland|" +
-             "grenada|grytviken|guadeloupe|guam|guatemala|guatemala\\scity|guernsey|guinea|guinea-bissau|gustavia|guyana|" +
-             "hagåtña|hagåtña|haiti|hamilton|hanoi|harare|hargeisa|harrisburg|hartford|havana|harvard|yale|johns hopkins|" +
-             "heard\\sisland\\sand\\smcdonald\\sislands|helena|helsinki|holy\\ssee|honduras|hong\\skong|honiara|honolulu|houston|" +
-             "hungary|iceland|india|indianapolis|indonesia|iran|iraq|ireland|islamabad|isle\\sof\\sman|israel|italy|jackson|" +
-             "jacksonville|jakarta|jamaica|jamestown|japan|jefferson\\scity|jersey|jerusalem|jordan|juneau|kabul|kampala|" +
-             "kansas\\scity|kathmandu|kazakhstan|kenya|khartoum|kiev\\s(kyiv)|kigali|kingston|kingstown|kinshasa|" +
-             "kiribati|korea|kuala\\slumpur|kuwait|kuwait\\scity|kyrgyzstan|la\\spaz|laâyoune\\s(el\\saaiún)|lansing|laos|" +
-             "las\\svegas|latvia|lebanon|lesotho|liberia|libreville|libyan\\sarab\\sjamahiriya|liechtenstein|lilongwe|lima|" +
-             "lincoln|lisbon|lithuania|little\\srock|ljubljana|lomé|london|los\\sangeles|louisville|luanda|lusaka|luxembourg|" +
-             "luxembourg\\scity|macao|macedonia|madagascar|madison|madrid|majuro|malabo|malawi|malaysia|maldives|malé|mali|malta|" +
-             "mamoudzou|managua|manama|manchester|manila|maputo|marigot|marshall\\sislands|martinique|maseru|mata-utu|" +
-             "mauritania|mauritius|mayotte|mbabane|melekeok|memphis|mexico|mexico\\scity\\s\\se|micronesia|milwaukee|minneapolis|" +
-             "minsk|mogadishu|moldova|monaco|monaco|mongolia|monrovia|montenegro|montevideo|montgomery|montpelier|montserrat|" +
-             "morocco|moroni|moscow|mozambique|muscat|myanmar|n'djamena|nairobi|namibia|nashville|nassau|nauru|naypyidaw|" +
-             "nepal|netherlands|netherlands\\santilles|new\\scaledonia|new\\sdelhi|new\\sorleans|new\\syork\\scity|new\\szealand|newark|niamey|" +
-             "nicaragua|nicosia|niger|nigeria|niue|norfolk\\sisland|north\\skorea|northern\\smariana\\sislands|norway|nouakchott|nouméa|" +
-             "nukuʻalofa|nuuk|oklahoma\\scity|olympia|omaha|oman|oranjestad|oslo|ottawa|ouagadougou|p'yŏngyang|pago\\spago|" +
-             "pago\\spago|pakistan|palau|palestine|palestinian\\sterritory|palikir|panama|panama\\scity|papeete|papua\\snew\\sguinea|" +
-             "paraguay|paramaribo|paris|peru|philadelphia|philippines|phnom\\spenh|phoenix|pierre|pitcairn|plymouth\\sf|podgorica|" +
-             "poland|port\\slouis|port\\smoresby|port\\sof\\sspain|port\\svila|port-au-prince|portland|porto-novo|portugal|prague|" +
-             "praia|pretoria|priština|providence|puerto\\srico|putrajaya|qatar|quito|rabat|raleigh|ramallah|reunion|reykjavík|" +
-             "richmond|riga|riyadh|road\\stown|romania|rome|roseau|russian\\sfederation|rwanda|sacramento|saint\\sbarthélemy|" +
-             "saint\\shelena|saint\\skitts\\sand\\snevis|saint\\slucia|saint\\smartin|saint\\spaul|saint\\spierre\\sand\\smiquelon|saint\\svincent|" +
-             "grenadines|saint-martin|saipan|saipan|salem|salt\\slake\\scity|samoa|san\\sfrancisco|san\\sjosé|san\\sjuan|san\\sjuan|" +
-             "san\\smarino|san\\smarino|san\\ssalvador|sanaá|santa\\sfe|santiago|santo\\sdomingo|são\\stomé|sao\\stome\\sand\\sprincipe|" +
-             "sarajevo|saudi\\sarabia|seattle|senegal|seoul|serbia|seychelles|sierra\\sleone|singapore|singapore|sioux\\sfalls|skopje|" +
-             "slovakia|slovenia|sofia|solomon\\sislands|somalia|south\\safrica|south\\sgeorgia\\sand\\sthe\\ssouth\\ssandwich\\sislands|south\\skorea|" +
-             "south\\starawa|spain|springfield|sri\\sjayawardenepura|sri\\slanka|st.\\sgeorge's|st.\\shelier|st.\\sjohn's|st.\\slouis|" +
-             "st.\\speter\\sport|st.\\spierre|stanley|stockholm|sucre|sudan|sukhum|suriname|suva|svalbard\\sand\\sjan\\smayen|" +
-             "swaziland|sweden|switzerland|syrian\\sarab\\srepublic|taipei|taiwan|tajikistan|tallahassee|tallinn|tanzania|tashkent|" +
-             "tbilisi|tegucigalpa|tehran|thailand|the\\ssettlement|thimphu|tibet|timor-leste|tirana|tiraspol|togo|tokelau|" +
-             "tokyo|tonga|topeka|tórshavn|trenton|trinidad\\sand\\stobago|tripoli|tskhinval|tunis|tunisia|turkey|turkmenistan|" +
-             "turks\\sand\\scaicos\\sislands|tuvalu|uganda|ukraine|ulaanbaatar|united\\sarab\\semirates|united\\skingdom|united\\sstates|" +
-             "uruguay|uzbekistan|vaduz|valletta|vanuatu|vatican\\scity|vatican\\scity|venezuela|victoria|vienna|vientiane|" +
-             "vietnam|vilnius|virgin\\sislands|virginia\\sbeach|wallis\\sand\\sfutuna|warsaw|washington|wellington|western\\ssahara|" +
-             "wichita|willemstad|wilmington|windhoek|yamoussoukro|yaoundé|yaren|yemen|yerevan|yugoslavia|zagreb|zaire|" +
-             "zambia|zimbabwe)";
diff --git a/root/static/scripts/common/es_search_replace.js b/root/static/scripts/common/es_search_replace.js
deleted file mode 100644
index 89896e4..0000000
--- a/root/static/scripts/common/es_search_replace.js
+++ /dev/null
@@ -1,126 +0,0 @@
-$(function() {
-    /* -------------------------------------------------------------------------*/
-    /* Turn on show/hide functionality
-    /* -------------------------------------------------------------------------*/
-    $("#js-fieldset-sr-trigger-show").click(function() {
-        $("#js-fieldset-sr").removeClass("hidden");
-        $("#js-fieldset-sr-trigger-hide").removeClass("hidden");
-        $("#js-fieldset-sr-trigger-show").addClass("hidden");
-    });
-    $("#js-fieldset-sr-trigger-hide").click(function() {
-        $("#js-fieldset-sr").addClass("hidden");
-        $("#js-fieldset-sr-trigger-show").removeClass("hidden");
-        $("#js-fieldset-sr-trigger-hide").addClass("hidden");
-    });
-    var setSearchField = function(str) {
-        $("#es-sr-input-search").attr("value",str);
-    }
-    var setReplaceField = function(str) {
-        $("#es-sr-input-replace").attr("value",str);
-    }
-    var setUseRegExp = function() {
-        $("#es-sr-opt1").attr("checked","checked");
-    }
-    /* Turn on the tooltips. */
-    $("#js-fieldset-sr *").tooltip();
-    /* Add presets functionality. */
-    $("#es-sr-selection").click(function() {
-        setUseRegExp();
-        setReplaceField("");
-        switch ($("#es-sr-selection").selectedValues()[0]) {
-            case "1":
-                setSearchField("\\(|\\)");
-                break;
-            case "2":
-                setSearchField("\\[|\\]");
-                break;
-            case "3":
-                setSearchField("\\{|\\}");
-                break;
-            case "4":
-                setSearchField("\\(|\\)|\\[|\\]|\\{|\\}");
-                break;
-            case "5":
-                setSearchField("\\[([^\\]]*)\\]");
-                setReplaceField("($1)");
-                break;
-            case "6":
-                setSearchField("\\(([^\\)]*)\\)");
-                setReplaceField("[$1]");
-                break;
-            case "7":
-                setSearchField("#(\\d*)");
-                setReplaceField("No. $1");
-                break;
-            case "8":
-                setSearchField("((\\d)(\\d).\\s?)");
-                break;
-            default:
-        };
-    });
-    /* Add swap fields functionality. */
-    $('#es-sr-button-swap').click(function() {
-        var tempFieldValue = $("#es-sr-input-search").attr("value");
-        setSearchField($("#es-sr-input-replace").attr("value"));
-        setReplaceField(tempFieldValue);
-    });
-    /* Add clear fields functionality. */
-    $('#es-sr-button-clear').click(function() {
-        setSearchField("");
-        setReplaceField("");
-    });
-    /* Add Search and Replace undo functionality. */
-    $('#es-sr-button-undo').click(function() {
-        if ($("#es-sr-opt3").attr("checked")) {
-            $("input[id$='-artist-undo']").click();
-        }
-        if ($("#es-sr-opt4").attr("checked")) {
-            $("input[id$='-title-undo']").click();
-        }
-    });
-    /* Add search / replace functionality. */
-    $('#es-sr-button-sr').click(function() {
-        var doReplacement = function(actionFields, type) {
-            jQuery.each(actionFields, function(i) {
-                storeHistory($(this).attr("value"), type, i);
-                $(this).attr("value", $(this).attr("value").replace(searchRegExp, $("#es-sr-input-replace").attr("value")));
-            });
-        },
-            artistFields = $("#es-sr-opt3").attr("checked"),
-            trackFields = $("#es-sr-opt4").attr("checked");
-        if (!artistFields && !trackFields) {
-            alertUser("warning", text.NothingSelected);
-        } else {
-            var searchRegExp;
-            if ($("#es-sr-opt1").attr("checked")) {
-                searchRegExp = new RegExp($("#es-sr-input-search").attr("value"), "g"+($("#es-sr-opt2").attr("checked") ? "":"i"));
-            } else {
-                searchRegExp = new RegExp($("#es-sr-input-search").attr("value").replace(/[.*+?|()\[\]{}\\]/g, "\\$&"), "g"+($("#es-sr-opt2").attr("checked") ? "":"i"));
-            }
-            if (trackFields) {
-                if (typeof($trackTitleGroup) != "undefined") {
-                    if ($trackTitleGroup.length > 0) {
-                        doReplacement($trackTitleGroup, "title");
-                    }
-                }
-                if (typeof($textTextGroup) != "undefined") {
-                    if ($textTextGroup.length > 0) {
-                        doReplacement($textTextGroup, "text");
-                    }
-                }
-            }
-            if (artistFields) {
-                if (typeof($artistGroup) != "undefined") {
-                    if ($artistGroup.length > 0) {
-                        doReplacement($artistGroup, "artist");
-                    }
-                }
-                if (typeof($textArtistGroup) != "undefined") {
-                    if ($textArtistGroup.length > 0) {
-                        doReplacement($textArtistGroup, "textartist");
-                    }
-                }
-            }
-        }
-    });
-});
diff --git a/root/static/scripts/common/es_stack.js b/root/static/scripts/common/es_stack.js
deleted file mode 100644
index fe36eae..0000000
--- a/root/static/scripts/common/es_stack.js
+++ /dev/null
@@ -1,108 +0,0 @@
-/* This file contains stack creation and handling functions
-   used by the Edit Suite to record and undo changes to data */
-
-var dataHistory = [];
-var errorLog = [];
-
-/* Return the number of items in the history of a particular field */
-function howMuchHistory(type, number) {
-    return dataHistory[type][number].length;
-}
-/* Store text in history, if it has been changed */
-function storeHistory(text, type, number) {
-    if (dataHistory[type][number][howMuchHistory(type, number)] != text || howMuchHistory(type, number) === 0) {
-        dataHistory[type][number].push(text);
-    }
-}
-/* Read the most recent item in history */
-function readHistory(type, number) {
-    return dataHistory[type][number][howMuchHistory(type, number) - 1];
-}
-/* Read and remove the most recent item in history */
-function takeHistory(type, number) {
-    if (howMuchHistory(type, number) > 0) {
-        return dataHistory[type][number].pop();
-    } else {
-        return "";
-    }
-}
-/* Empty all change histories, but keep the stored initial state */
-function emptyHistory() {
-    $gcFieldsTitles.each(function(k) {
-        for (var i = 0; i < dataHistory[$gcFieldsTitles[k]].length; i++) {
-            $gcFieldsTitles[k].length = 1;
-        }
-    });
-}
-/* Return the number of items in the history of a particular field */
-function howManyErrors(type, number) {
-    return errorLog[type][number].length;
-}
-/* Store text in history, if it has been changed */
-function storeError(text, type, number) {
-    if (errorLog[type][number][howManyErrors(type, number)] != text || howManyErrors(type, number) === 0) {
-        errorLog[type][number].push("\u2043 "+text);
-    }
-}
-/* Return all errors for a given type+number pair */
-function clearErrors(type, number) {
-    errorLog[type][number].length = 0;
-    return true;
-}
-/* Return and remove all errors for a given type+number pair as a string, <br /> separated */
-function takeErrors(type, number) {
-    var itemErrors = errorLog[type][number].join("<br />");
-    errorLog[type][number].length = 0;
-    return itemErrors;
-}
-/* Add a new item to the end of each array.  (Used for adding a track on the fly.) */
-function addNewRecord(recordCount) {
-    recordCount = recordCount - 1;
-    jQuery.each(["title", "artist", "duration"], function() {
-        dataHistory[this][recordCount] = [""];
-        errorLog[this][recordCount] = [];
-    });
-}
-/* Add a new item within the array. */
-function insertNewRecord(insertionPoint, recordCount) {
-    addNewRecord(recordCount);
-    jQuery.each(["title", "artist", "duration"], function() {
-        var currentRecord = recordCount - 1;
-        do {
-            dataHistory[this][currentRecord] = dataHistory[this][currentRecord-1];  // Shift all relevant histories forward by one.
-            currentRecord--;
-        } while (currentRecord > insertionPoint && currentRecord != 0);
-        dataHistory[this][currentRecord] = [""];  // Empty the history for the inserted record.
-    });
-}
-/* Remove an item from the array. */
-function removeRecord(recordCount, recordToRemove) {
-    jQuery.each(["title", "artist", "duration"], function() {
-        var currentRecord = recordToRemove - 1;
-        if (recordCount != recordToRemove) {  // Check that we're not removing the last track.
-            do {
-                dataHistory[this][currentRecord] = dataHistory[this][currentRecord+1];  // Shift all relevant histories backwards by one.
-                currentRecord++;
-            } while (currentRecord < recordCount);
-        }
-        dataHistory[this].pop();
-    });
-}
-$(function() {
-    /* Create two array of arrays to store data changes and error reports, then initialize them */
-    $gcFieldsGroup.each(function(group) {
-        dataHistory[$gcFieldsTitles[group]] = [];
-        errorLog[$gcFieldsTitles[group]] = [];
-        var j = $gcFieldsTitles[group];
-        $gcFieldsGroup[group].each(function(i) {
-            dataHistory[$gcFieldsTitles[group]][i] = [];
-            errorLog[$gcFieldsTitles[group]][i] = [];
-        });
-    });
-    /* Store onload form field values */
-    $gcFieldsGroup.each(function(group) {
-        $gcFieldsGroup[group].each(function(i) {
-            storeHistory($(this).attr("value"), $gcFieldsTitles[group], i);
-        });
-    });
-});
diff --git a/root/static/scripts/common/es_style_guidelines.js b/root/static/scripts/common/es_style_guidelines.js
deleted file mode 100644
index 9ec7e23..0000000
--- a/root/static/scripts/common/es_style_guidelines.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/*********************************************************
-   Capture all anchor links within loaded WikiDoc pages
-   so they 1) load the /bare version, and 2) load within
-   the DIV, and don't browse the user away from the edit
-   page.
-*********************************************************/
-function fixLinks() {
-    $("#es-sg a").each(function() {
-        if ($(this).attr("href") !== undefined) {
-            var oldtarget = $(this).attr("href");
-            $(this).click(function(e) {
-                e.preventDefault();
-                $("#es-sg").empty();
-                jQuery(function($) {
-                    $("#es-sg").load(oldtarget.replace(/\/doc\/(.*)"\s/g, '/doc/$1/bare" '));
-                    fixLinks();
-                });
-            });
-        }
-    });
-}
-$(function() {
-    /* -------------------------------------------------------------------------*/
-    /* Turn on show/hide functionality
-    /* -------------------------------------------------------------------------*/
-    $("#js-fieldset-sg-trigger-show").click(function() {
-        $("#js-fieldset-sg").removeClass("hidden");
-        $("#js-fieldset-sg-row").removeClass("floatRight");
-        $("#js-fieldset-sg-trigger-hide").removeClass("hidden");
-        $("#js-fieldset-sg-trigger-show").addClass("hidden");
-    });
-    $("#js-fieldset-sg-trigger-hide").click(function() {
-        $("#es-sg").css({"height" : "0px"});
-        $("#es-sg").empty();
-        $("#js-fieldset-sg").addClass("hidden");
-        $("#js-fieldset-sg-row").addClass("floatRight");
-        $("#js-fieldset-sg-trigger-show").removeClass("hidden");
-        $("#js-fieldset-sg-trigger-hide").addClass("hidden");
-    });
-    $("#js-fieldset-sg-row").addClass("floatRight");
-    var loadGuideline = function(selection) {
-        jQuery(function($) {
-            $("#es-sg").load("/doc/" + selection + "/bare/");
-        });
-        $("#es-sg").css({"height" : "450px"});
-    };
-    $("#es-sg-guidelines").blur(function() {
-        loadGuideline($("#es-sg-guidelines").val())
-    });
-    $("#es-sg-guidelines").keyup(function() {
-        loadGuideline($("#es-sg-guidelines").val())
-    });
-    $("#es-sg-capitalization").blur(function() {
-        loadGuideline($("#es-sg-capitalization").val())
-    });
-    $("#es-sg-capitalization").keyup(function() {
-        loadGuideline($("#es-sg-capitalization").val())
-    });
-    $("#es-sg").bind("ajaxSend", function(){
-        $("#es-sg-explain").html('<img src="/static/images/icons/throbber.gif" /> ' + text.Loading + '&hellip;').fadeIn("1000");
-    }).bind("ajaxStop", function(){
-        fixLinks();
-        $("#es-sg-explain").html(text.Loaded);
-    });
-});
diff --git a/root/static/scripts/common/es_track_parser.js b/root/static/scripts/common/es_track_parser.js
deleted file mode 100644
index 8cefb4d..0000000
--- a/root/static/scripts/common/es_track_parser.js
+++ /dev/null
@@ -1,256 +0,0 @@
-$(function() {
-    /* -------------------------------------------------------------------------*/
-    /* Turn on show/hide functionality
-    /* -------------------------------------------------------------------------*/
-    $("#js-fieldset-tp-trigger-show").click(function() {
-        $("#js-fieldset-tp").removeClass("hidden");
-        $("#js-fieldset-tp-trigger-hide").removeClass("hidden");
-        $("#js-fieldset-tp-trigger-show").addClass("hidden");
-    });
-    $("#js-fieldset-tp-trigger-hide").click(function() {
-        $("#js-fieldset-tp").addClass("hidden");
-        $("#js-fieldset-tp-trigger-show").removeClass("hidden");
-        $("#js-fieldset-tp-trigger-hide").addClass("hidden");
-    });
-    var inputField,
-        tempArtistStore = "",
-        trackCount,
-        inputLines,
-        inputTitles = [],
-        inputArtists = [],
-        inputDurations = [];
-    /* Turn on the tooltips. */
-    $("#js-fieldset-tp *").tooltip();
-    /* Handle options which don't make sense unless other options are also selected. */
-    $("#es-tp-opt2").change(function() {
-        if ($("#es-tp-opt2").attr("checked")) {
-            $("#es-tp-opt3-span").show();
-        } else {
-            $("#es-tp-opt3").attr("checked",false);
-            $("#es-tp-opt3-span").hide();
-        }
-    });
-    $("#es-tp-opt4").change(function() {
-        if ($("#es-tp-opt4").attr("checked")) {
-            $("#es-tp-opt5-span").show();
-            $("#es-tp-button-times").show();
-        } else {
-            $("#es-tp-opt5").attr("checked",false);
-            $("#es-tp-opt5-span").hide();
-            $("#es-tp-button-times").hide();
-        }
-    });
-    $("#es-tp-opt9").change(function() {
-        if ($("#es-tp-opt9").attr("checked")) {
-            $("#es-tp-button-artists").show();
-            $("#es-tp-opt9b-span").css("visibility","visible");
-            $("#es-tp-opt9b-row").show();
-        } else {
-            $("#es-tp-button-artists").hide();
-            $("#es-tp-opt9b-span").css("visibility","hidden");
-            $("#es-tp-opt9b-row").hide();
-        }
-    });
-    $("#es-tp-opt9b").attr("value","-/");
-    $("#es-tp-opt2").change();
-    $("#es-tp-opt4").change();
-    $("#es-tp-opt9").change();
-    /* Get user input. */
-    inputField = $("#es-tp-textarea").attr("value");
-    /* Hide the file loader function in all browsers that cannot use it. */
-    if (jQuery.browser != "mozilla" && jQuery.browser.version.substr(0,3) != "1.9") {
-        $("#es-tp-loadfromfile").hide();
-    }
-    /* File loader functionality. */
-    $("#es-tp-loadfile").change(function () {
-        $("#es-tp-textarea").attr("value",$("#es-tp-loadfile")[0].files[0].getAsText("UTF-8"));
-    });
-    /* Swap title / artist functionality. */
-    /* We can count on title fields always being present.  Artist fields might be "locked", */
-    /* however, so only swap those fields where the artist field is visible. */ 
-// TODO: Add release title / artist support
-    $("#es-tp-button-swap").click(function() {
-        trackCount = parseInt($trackTitleGroup.length, 10);
-        for (var currTrack = 1; currTrack <= trackCount; currTrack++) {
-            if (!$("#form-add-release-tracks-artist-" + currTrack).is(':hidden')) {
-                tempArtistStore = $("#form-add-release-tracks-artist-" + currTrack).attr("value");
-                $("#form-add-release-tracks-artist-" + currTrack).attr("value",$("#form-add-release-tracks-track_" + currTrack + "-name").attr("value"));
-                $("#form-add-release-tracks-track_" + currTrack + "-name").attr("value",tempArtistStore);
-            }
-        }
-    });
-    var storeUndoData = function () {
-            jQuery.each($trackTitleGroup, function(i) {
-                storeHistory($(this).attr("value"),"title",i);
-            });
-            jQuery.each($durationGroup, function(i) {
-                storeHistory($(this).attr("value"),"duration",i);
-            });
-            jQuery.each($artistGroup, function(i) {
-                storeHistory($(this).attr("value"),"artist",i);
-            });
-        },
-        getTrackInput = function () {
-            inputLines = jQuery.trim($("#es-tp-textarea").attr("value")).split("\n");
-        },
-        removeTrackNumbers = function() {
-            if ($("#es-tp-opt3").attr("checked")) { // Vinyl track numbers
-                jQuery.each(inputLines, function(i) {
-                    inputLines[i] = this.replace(/^[\s\(]*[-\.0-90-9a-z]+[\.\)\s]+/i, "");
-                });
-            } else if ($("#es-tp-opt2").attr("checked")) { // Non-vinyl track numbers
-                jQuery.each(inputLines, function(i) {
-                    inputLines[i] = this.replace(/^[\s\(]*([-\.0-90-9\.]+(-[0-90-9]+)?)[\.\)\s]+/, "");
-                });
-            }
-        },
-        parseTimes = function() {
-            jQuery.each(inputLines, function(i) {
-                if ($("#es-tp-opt1").attr("checked")) { // Set release title from first line option.
-                    if (i != 0) {
-                        inputLines[i] = this.replace(/\(?\s?([0-90-9]*[:,.':,.][0-90-9]+)\s?\)?$/, function(str, p1) {
-                        inputDurations[i-1] = fullWidthConverter(p1);
-                        return "";
-                        });
-                    }
-                } else {
-                    inputLines[i] = this.replace(/\(?\s?([0-90-9]*[:,.':,.][0-90-9]+)\s?\)?$/, function(str, p1) {
-                        inputDurations[i] = fullWidthConverter(p1);
-                        return "";
-                    });
-                }
-            });
-        },
-        cleanSpaces = function() {
-            jQuery.each(inputLines, function(i) {
-                inputLines[i] = jQuery.trim(inputLines[i]);
-            });           
-        },
-        cleanBork = function() {
-            var AllMusicGuideBork = /(Listen Now!|AMG Pick)/g,
-                AmazonBork = /[£$€]\d.\d{2}$/,
-                TrailingListen = /\s\s*(listen(music)?|\s)+$/gi;
-            jQuery.each(inputLines, function(i) {
-                inputLines[i] = jQuery.trim(inputLines[i]).replace(AllMusicGuideBork, "")
-                                                          .replace(AmazonBork, "")
-                                                          .replace(TrailingListen, "");
-            });           
-        },
-        cleanTitles = function() {
-            jQuery.each(inputLines, function(i) {
-                inputLines[i] = inputLines[i].replace(/(.*),\sThe$/i, "The $1")
-                                            .replace(/\s*,/g, ",");
-                if ($("#es-tp-opt6").attr("checked")) { 
-                    inputLines[i] = inputLines[i].replace(/\[.*\]/g, "");
-                }
-            });
-        },
-        parseArtists = function() {
-            var artistSeparator = new RegExp("\\s[" + $("#es-tp-opt9b").attr("value") + "\\t]");
-            jQuery.each(inputLines, function(i) {
-                if ($("#es-tp-opt1").attr("checked")) { // Set release title from first line option.
-                    if (i != 0) {
-                        if (inputLines[i].match(artistSeparator)) {
-                            inputArtists[i-1] = inputLines[i].split(artistSeparator,2)[1]
-                                                             .replace(/(.*),\sThe$/i, "The $1")
-                                                             .replace(/\s*,/g, ",");
-                            inputLines[i] = inputLines[i].split(artistSeparator,1)[0];
-                        }
-                    }
-                } else {
-                    if (inputLines[i].match(artistSeparator)) {
-                        inputArtists[i] = inputLines[i].split(artistSeparator,2)[1]
-                                                       .replace(/(.*),\sThe$/i, "The $1")
-                                                       .replace(/\s*,/g, ",");
-                        inputLines[i] = inputLines[i].split(artistSeparator,1)[0];
-                    }
-                }
-            });
-        },
-        fillInData = function() {
-            addTracks = function(counter) {
-                while (counter > $trackTitleGroup.length) {  // We parsed out more tracks than are present in the current form.
-                    insertTrack();  // Add tracks to the form until we have enough to fit the parsed track data.
-                }
-            }
-            if (inputTitles.length > 0) {  // We have track title data to fill into the form.
-                if ($("#es-tp-opt1").attr("checked")) { // Set release title from first line option.
-                    $("#form-add-release-tracks-title").attr("value",inputTitles.shift());
-                }
-                addTracks(inputTitles.length);
-                jQuery.each($trackTitleGroup, function(i) {
-                    $(this).attr("value",inputTitles[i]);  // Fill in the track titles.
-                    $(this).change();
-                });
-            }
-            if ($("#es-tp-opt5").attr("checked")) { // Fill in track times option.
-                if (inputDurations.length > 0) {  // We have track duration data to fill into the form.
-                    addTracks(inputDurations.length);
-                    jQuery.each($durationGroup, function(i) {
-                        $(this).attr("value",inputDurations[i]);  // Fill in the track durations.
-                        $(this).change();
-                        $("label.overlabel").overlabel();  // Refresh ?:?? hints, to remove them if we just put data into those fields.
-                    });
-                }
-            }
-            if (inputArtists.length > 0) {  // We have track duration data to fill into the form.
-                addTracks(inputArtists.length);
-                jQuery.each($artistGroup, function(i) {
-                    $(this).attr("value",inputArtists[i]);  // Fill in the track artists.
-                    $(this).change();
-                });
-            }
-        };
-    $("#es-tp-button-titles").click(function() {  // Parse Titles
-        storeUndoData();
-        getTrackInput();
-        cleanBork();
-        removeTrackNumbers();
-        if ($("#es-tp-opt4").attr("checked")) { // Detect track times option
-            jQuery.each(inputLines, function(i) {
-                inputLines[i] = this.replace(/\(?\s?([0-90-9]+[:,.:,.][0-90-9]+)\s?\)?$/, "");
-            });
-        }
-        cleanSpaces();
-        if ($("#es-tp-opt9").attr("checked")) { // Data contains artist info option.
-            parseArtists();  // Get the artist data out of the track titles.
-            inputArtists = [];  // Throw away the artist data.
-        }
-        cleanTitles();
-        inputTitles = inputLines;
-        fillInData();
-    });
-    $("#es-tp-button-times").click(function() {  // Parse Track Times
-        storeUndoData();
-        getTrackInput();
-        cleanBork();
-        parseTimes();
-        fillInData();
-    });
-    $("#es-tp-button-all").click(function() {  // Parse All
-        storeUndoData();
-        getTrackInput();
-        cleanBork();
-        removeTrackNumbers();
-        parseTimes();
-        cleanSpaces();
-        if ($("#es-tp-opt9").attr("checked")) { // Data contains artist info option.
-            parseArtists();
-        }
-        cleanTitles();
-        inputTitles = inputLines;
-        fillInData();
-    });
-    $("#es-tp-button-artists").click(function() {  // Parse Artists
-        storeUndoData();
-        getTrackInput();
-        cleanBork();
-        removeTrackNumbers();
-        parseTimes(); // Get any times out of the input data.
-        inputDurations = [];  // Throw away the parsed times.
-        cleanSpaces();
-        parseArtists();  // Get the artist data out of the track titles.
-        inputTitles = [];  // Throw away the parsed titles.
-        fillInData();
-    });
-});
diff --git a/root/static/scripts/common/es_undo_revert.js b/root/static/scripts/common/es_undo_revert.js
deleted file mode 100644
index 6657ee3..0000000
--- a/root/static/scripts/common/es_undo_revert.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/********************************************************************************************
- * File: es_undo_revert.js
- * 
- * Function: 1) Hooks into the Undo / Revert panel in the Edit Suite, to make that panel
- *              functional.
- *           2) Enables the functionality for the Undo All and Revert All buttons.
- * 
- * Note: The Undo buttons are not created in this file.  They are created automatically when 
- *       any Guess Case button is created, using the button factory in es_main.
- *
- * Note: If Undo All and Revert are not needed in a form, this module can be safely excluded
- *       within the Edit Suite options in the form's template.
- * 
- ********************************************************************************************/
-
-/********************************************************************************************
- * function: (default)
- * 
- * Create, bind, and insert Undo All and Revert All buttons into a form.
- * 
- ********************************************************************************************/
-$(function() {
-    var $esControlsDiv = $("#esControlsDiv");
-    var $spaceBetween = $("#es-ur-spacer");
-    /* Separate the Undo All and Revert All buttons from Guess Case controls.  */
-    $esControlsDiv.append(document.createElement('br'))
-                  .append(document.createElement('br'))
-                  .css({"marginRight" : "-10pt"});  // Unpad the buttons from the parent fieldset.
-    /* Create the Undo All button                                              */
-    $form.each(function(i) {
-        $esControlsDiv.append(new UndoAllButton().makeButton(i));
-    });
-    /* Separate the two buttons a little.                                      */
-    esText = jQuery(document.createElement('span')).attr("id", "es-ur-spacer")
-                                                   .html("&nbsp;&nbsp;&nbsp;")
-                                                   .appendTo($esControlsDiv);
-    /* Create the Undo All button.                                             */
-    $form.each(function(i) {
-        $esControlsDiv.append(new RevertAllButton().makeButton(i));
-    });
-    /* Insert the the Undo All and Revert div into the form.                   */
-    $esControlsDiv.appendTo($form.get(0));
-    $(".es-form").css("margin-bottom", "20pt");
-});
-/* Run Undo for each element in each group.                                    */
-function undoAll() {
-    $gcFieldsGroup.each(function(group) {
-        $gcFieldsGroup[group].each(function(i) {
-            $(this).attr("value", takeHistory($gcFieldsTitles[group], i));
-        });
-    });
-}
-/* Run Revert for each element in each group.                                  */
-function revertAll() {
-    emptyHistory();
-    $gcFieldsGroup.each(function(group) {
-        $gcFieldsGroup[group].each(function(i) {
-            $(this).attr("value", readHistory($gcFieldsTitles[group], i));
-        });
-    });
-}
diff --git a/root/static/scripts/diff_match_patch_GPL2.js b/root/static/scripts/diff_match_patch_GPL2.js
deleted file mode 100644
index 498f648..0000000
--- a/root/static/scripts/diff_match_patch_GPL2.js
+++ /dev/null
@@ -1,2042 +0,0 @@
-/**
- * Diff Match and Patch
- *
- * Copyright 2006 Google Inc.
- * http://code.google.com/p/google-diff-match-patch/
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-/**
- * @fileoverview Computes the difference between two texts to create a patch.
- * Applies the patch onto another text, allowing for errors.
- * @author fraser at google.com (Neil Fraser)
- */
-
-/**
- * Class containing the diff, match and patch methods.
- * @constructor
- */
-function diff_match_patch() {
-
-  // Defaults.
-  // Redefine these in your program to override the defaults.
-
-  // Number of seconds to map a diff before giving up.  (0 for infinity)
-  this.Diff_Timeout = 1.0;
-  // Cost of an empty edit operation in terms of edit characters.
-  this.Diff_EditCost = 4;
-  // The size beyond which the double-ended diff activates.
-  // Double-ending is twice as fast, but less accurate.
-  this.Diff_DualThreshold = 32;
-  // Tweak the relative importance (0.0 = accuracy, 1.0 = proximity)
-  this.Match_Balance = 0.5;
-  // At what point is no match declared (0.0 = perfection, 1.0 = very loose)
-  this.Match_Threshold = 0.5;
-  // The min and max cutoffs used when computing text lengths.
-  this.Match_MinLength = 100;
-  this.Match_MaxLength = 1000;
-  // Chunk size for context length.
-  this.Patch_Margin = 4;
-
-  /**
-   * Compute the number of bits in an int.
-   * The normal answer for JavaScript is 32.
-   * @return {number} Max bits
-   */
-  function getMaxBits() {
-    var maxbits = 0;
-    var oldi = 1;
-    var newi = 2;
-    while (oldi != newi) {
-      maxbits++;
-      oldi = newi;
-      newi = newi << 1;
-    }
-    return maxbits;
-  }
-  // How many bits in a number?
-  this.Match_MaxBits = getMaxBits();
-}
-
-
-//  DIFF FUNCTIONS
-
-
-/**
- * The data structure representing a diff is an array of tuples:
- * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
- * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
- */
-var DIFF_DELETE = -1;
-var DIFF_INSERT = 1;
-var DIFF_EQUAL = 0;
-
-
-/**
- * Find the differences between two texts.  Simplifies the problem by stripping
- * any common prefix or suffix off the texts before diffing.
- * @param {string} text1 Old string to be diffed.
- * @param {string} text2 New string to be diffed.
- * @param {boolean} opt_checklines Optional speedup flag.  If present and false,
- *     then don't run a line-level diff first to identify the changed areas.
- *     Defaults to true, which does a faster, slightly less optimal diff
- * @return {Array.<Array.<*>>} Array of diff tuples.
- */
-diff_match_patch.prototype.diff_main = function(text1, text2, opt_checklines) {
-  // Check for equality (speedup)
-  if (text1 == text2) {
-    return [[DIFF_EQUAL, text1]];
-  }
-
-  if (typeof opt_checklines == 'undefined') {
-    opt_checklines = true;
-  }
-  var checklines = opt_checklines;
-
-  // Trim off common prefix (speedup)
-  var commonlength = this.diff_commonPrefix(text1, text2);
-  var commonprefix = text1.substring(0, commonlength);
-  text1 = text1.substring(commonlength);
-  text2 = text2.substring(commonlength);
-
-  // Trim off common suffix (speedup)
-  commonlength = this.diff_commonSuffix(text1, text2);
-  var commonsuffix = text1.substring(text1.length - commonlength);
-  text1 = text1.substring(0, text1.length - commonlength);
-  text2 = text2.substring(0, text2.length - commonlength);
-
-  // Compute the diff on the middle block
-  var diffs = this.diff_compute(text1, text2, checklines);
-
-  // Restore the prefix and suffix
-  if (commonprefix) {
-    diffs.unshift([DIFF_EQUAL, commonprefix]);
-  }
-  if (commonsuffix) {
-    diffs.push([DIFF_EQUAL, commonsuffix]);
-  }
-  this.diff_cleanupMerge(diffs);
-  return diffs;
-};
-
-
-/**
- * Find the differences between two texts.  Assumes that the texts do not
- * have any common prefix or suffix.
- * @param {string} text1 Old string to be diffed.
- * @param {string} text2 New string to be diffed.
- * @param {boolean} checklines Speedup flag.  If false, then don't run a
- *     line-level diff first to identify the changed areas.
- *     If true, then run a faster, slightly less optimal diff
- * @return {Array.<Array.<*>>} Array of diff tuples.
- * @private
- */
-diff_match_patch.prototype.diff_compute = function(text1, text2, checklines) {
-  var diffs;
-
-  if (!text1) {
-    // Just add some text (speedup)
-    return [[DIFF_INSERT, text2]];
-  }
-
-  if (!text2) {
-    // Just delete some text (speedup)
-    return [[DIFF_DELETE, text1]];
-  }
-
-  var longtext = text1.length > text2.length ? text1 : text2;
-  var shorttext = text1.length > text2.length ? text2 : text1;
-  var i = longtext.indexOf(shorttext);
-  if (i != -1) {
-    // Shorter text is inside the longer text (speedup)
-    diffs = [[DIFF_INSERT, longtext.substring(0, i)],
-             [DIFF_EQUAL, shorttext],
-             [DIFF_INSERT, longtext.substring(i + shorttext.length)]];
-    // Swap insertions for deletions if diff is reversed.
-    if (text1.length > text2.length) {
-      diffs[0][0] = diffs[2][0] = DIFF_DELETE;
-    }
-    return diffs;
-  }
-  longtext = shorttext = null;  // Garbage collect
-
-  // Check to see if the problem can be split in two.
-  var hm = this.diff_halfMatch(text1, text2);
-  if (hm) {
-    // A half-match was found, sort out the return data.
-    var text1_a = hm[0];
-    var text1_b = hm[1];
-    var text2_a = hm[2];
-    var text2_b = hm[3];
-    var mid_common = hm[4];
-    // Send both pairs off for separate processing.
-    var diffs_a = this.diff_main(text1_a, text2_a, checklines);
-    var diffs_b = this.diff_main(text1_b, text2_b, checklines);
-    // Merge the results.
-    return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b);
-  }
-
-  // Perform a real diff.
-  if (checklines && (text1.length < 100 || text2.length < 100)) {
-    // Too trivial for the overhead.
-    checklines = false;
-  }
-  var linearray;
-  if (checklines) {
-    // Scan the text on a line-by-line basis first.
-    var a = this.diff_linesToChars(text1, text2);
-    text1 = a[0];
-    text2 = a[1];
-    linearray = a[2];
-  }
-  diffs = this.diff_map(text1, text2);
-  if (!diffs) {
-    // No acceptable result.
-    diffs = [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];
-  }
-  if (checklines) {
-    // Convert the diff back to original text.
-    this.diff_charsToLines(diffs, linearray);
-    // Eliminate freak matches (e.g. blank lines)
-    this.diff_cleanupSemantic(diffs);
-
-    // Rediff any replacement blocks, this time character-by-character.
-    // Add a dummy entry at the end.
-    diffs.push([DIFF_EQUAL, '']);
-    var pointer = 0;
-    var count_delete = 0;
-    var count_insert = 0;
-    var text_delete = '';
-    var text_insert = '';
-    while (pointer < diffs.length) {
-      switch (diffs[pointer][0]) {
-        case DIFF_INSERT:
-          count_insert++;
-          text_insert += diffs[pointer][1];
-          break;
-        case DIFF_DELETE:
-          count_delete++;
-          text_delete += diffs[pointer][1];
-          break;
-        case DIFF_EQUAL:
-          // Upon reaching an equality, check for prior redundancies.
-          if (count_delete >= 1 && count_insert >= 1) {
-            // Delete the offending records and add the merged ones.
-            var a = this.diff_main(text_delete, text_insert, false);
-            diffs.splice(pointer - count_delete - count_insert,
-                         count_delete + count_insert);
-            pointer = pointer - count_delete - count_insert;
-            for (var j = a.length - 1; j >= 0; j--) {
-              diffs.splice(pointer, 0, a[j]);
-            }
-            pointer = pointer + a.length;
-          }
-          count_insert = 0;
-          count_delete = 0;
-          text_delete = '';
-          text_insert = '';
-          break;
-      }
-     pointer++;
-    }
-    diffs.pop();  // Remove the dummy entry at the end.
-  }
-  return diffs;
-};
-
-
-/**
- * Split two texts into an array of strings.  Reduce the texts to a string of
- * hashes where each Unicode character represents one line.
- * @param {string} text1 First string.
- * @param {string} text2 Second string.
- * @return {Array.<string|Array.<string>>} Three element Array, containing the
- *     encoded text1, the encoded text2 and the array of unique strings.  The
- *     zeroth element of the array of unique strings is intentionally blank.
- * @private
- */
-diff_match_patch.prototype.diff_linesToChars = function(text1, text2) {
-  var lineArray = [];  // e.g. lineArray[4] == 'Hello\n'
-  var lineHash = {};   // e.g. lineHash['Hello\n'] == 4
-
-  // '\x00' is a valid character, but various debuggers don't like it.
-  // So we'll insert a junk entry to avoid generating a null character.
-  lineArray[0] = '';
-
-  /**
-   * Split a text into an array of strings.  Reduce the texts to a string of
-   * hashes where each Unicode character represents one line.
-   * Modifies linearray and linehash through being a closure.
-   * @param {string} text String to encode
-   * @return {string} Encoded string
-   * @private
-   */
-  function diff_linesToCharsMunge(text) {
-    var chars = '';
-    // Walk the text, pulling out a substring for each line.
-    // text.split('\n') would would temporarily double our memory footprint.
-    // Modifying text would create many large strings to garbage collect.
-    var lineStart = 0;
-    var lineEnd = -1;
-    // Keeping our own length variable is faster than looking it up.
-    var lineArrayLength = lineArray.length;
-    while (lineEnd < text.length - 1) {
-      lineEnd = text.indexOf('\n', lineStart);
-      if (lineEnd == -1) {
-        lineEnd = text.length - 1;
-      }
-      var line = text.substring(lineStart, lineEnd + 1);
-      lineStart = lineEnd + 1;
-
-      if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) :
-          (lineHash[line] !== undefined)) {
-        chars += String.fromCharCode(lineHash[line]);
-      } else {
-        chars += String.fromCharCode(lineArrayLength);
-        lineHash[line] = lineArrayLength;
-        lineArray[lineArrayLength++] = line;
-      }
-    }
-    return chars;
-  }
-
-  var chars1 = diff_linesToCharsMunge(text1);
-  var chars2 = diff_linesToCharsMunge(text2);
-  return [chars1, chars2, lineArray];
-};
-
-
-/**
- * Rehydrate the text in a diff from a string of line hashes to real lines of
- * text.
- * @param {Array.<Array.<*>>} diffs Array of diff tuples.
- * @param {Array.<string>} lineArray Array of unique strings.
- * @private
- */
-diff_match_patch.prototype.diff_charsToLines = function(diffs, lineArray) {
-  for (var x = 0; x < diffs.length; x++) {
-    var chars = diffs[x][1];
-    var text = [];
-    for (var y = 0; y < chars.length; y++) {
-      text[y] = lineArray[chars.charCodeAt(y)];
-    }
-    diffs[x][1] = text.join('');
-  }
-};
-
-
-/**
- * Explore the intersection points between the two texts.
- * @param {string} text1 Old string to be diffed.
- * @param {string} text2 New string to be diffed.
- * @return {Array.<Array.<*>>?} Array of diff tuples or null if no diff
- *     available.
- * @private
- */
-diff_match_patch.prototype.diff_map = function(text1, text2) {
-  // Don't run for too long.
-  var ms_end = (new Date()).getTime() + this.Diff_Timeout * 1000;
-  var max_d = text1.length + text2.length - 1;
-  var doubleEnd = this.Diff_DualThreshold * 2 < max_d;
-  var v_map1 = [];
-  var v_map2 = [];
-  var v1 = {};
-  var v2 = {};
-  v1[1] = 0;
-  v2[1] = 0;
-  var x, y;
-  var footstep;  // Used to track overlapping paths.
-  var footsteps = {};
-  var done = false;
-  // Safari 1.x doesn't have hasOwnProperty
-  var hasOwnProperty = !!(footsteps.hasOwnProperty);
-  // If the total number of characters is odd, then the front path will collide
-  // with the reverse path.
-  var front = (text1.length + text2.length) % 2;
-  for (var d = 0; d < max_d; d++) {
-    // Bail out if timeout reached.
-    if (this.Diff_Timeout > 0 && (new Date()).getTime() > ms_end) {
-      return null;
-    }
-
-    // Walk the front path one step.
-    v_map1[d] = {};
-    for (var k = -d; k <= d; k += 2) {
-      if (k == -d || k != d && v1[k - 1] < v1[k + 1]) {
-        x = v1[k + 1];
-      } else {
-        x = v1[k - 1] + 1;
-      }
-      y = x - k;
-      if (doubleEnd) {
-        footstep = x + ',' + y;
-        if (front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) :
-                      (footsteps[footstep] !== undefined))) {
-          done = true;
-        }
-        if (!front) {
-          footsteps[footstep] = d;
-        }
-      }
-      while (!done && x < text1.length && y < text2.length &&
-             text1.charAt(x) == text2.charAt(y)) {
-        x++;
-        y++;
-        if (doubleEnd) {
-          footstep = x + ',' + y;
-          if (front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) :
-              (footsteps[footstep] !== undefined))) {
-            done = true;
-          }
-          if (!front) {
-            footsteps[footstep] = d;
-          }
-        }
-      }
-      v1[k] = x;
-      v_map1[d][x + ',' + y] = true;
-      if (x == text1.length && y == text2.length) {
-        // Reached the end in single-path mode.
-        return this.diff_path1(v_map1, text1, text2);
-      } else if (done) {
-        // Front path ran over reverse path.
-        v_map2 = v_map2.slice(0, footsteps[footstep] + 1);
-        var a = this.diff_path1(v_map1, text1.substring(0, x),
-                                text2.substring(0, y));
-        return a.concat(this.diff_path2(v_map2, text1.substring(x),
-                                        text2.substring(y)));
-      }
-    }
-
-    if (doubleEnd) {
-      // Walk the reverse path one step.
-      v_map2[d] = {};
-      for (var k = -d; k <= d; k += 2) {
-        if (k == -d || k != d && v2[k - 1] < v2[k + 1]) {
-          x = v2[k + 1];
-        } else {
-          x = v2[k - 1] + 1;
-        }
-        y = x - k;
-        footstep = (text1.length - x) + ',' + (text2.length - y);
-        if (!front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) :
-                       (footsteps[footstep] !== undefined))) {
-          done = true;
-        }
-        if (front) {
-          footsteps[footstep] = d;
-        }
-        while (!done && x < text1.length && y < text2.length &&
-               text1.charAt(text1.length - x - 1) ==
-               text2.charAt(text2.length - y - 1)) {
-          x++;
-          y++;
-          footstep = (text1.length - x) + ',' + (text2.length - y);
-          if (!front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) :
-                         (footsteps[footstep] !== undefined))) {
-            done = true;
-          }
-          if (front) {
-            footsteps[footstep] = d;
-          }
-        }
-        v2[k] = x;
-        v_map2[d][x + ',' + y] = true;
-        if (done) {
-          // Reverse path ran over front path.
-          v_map1 = v_map1.slice(0, footsteps[footstep] + 1);
-          var a = this.diff_path1(v_map1, text1.substring(0, text1.length - x),
-                                  text2.substring(0, text2.length - y));
-          return a.concat(this.diff_path2(v_map2,
-                          text1.substring(text1.length - x),
-                          text2.substring(text2.length - y)));
-        }
-      }
-    }
-  }
-  // Number of diffs equals number of characters, no commonality at all.
-  return null;
-};
-
-
-/**
- * Work from the middle back to the start to determine the path.
- * @param {Array.<Object>} v_map Array of paths.
- * @param {string} text1 Old string fragment to be diffed.
- * @param {string} text2 New string fragment to be diffed.
- * @return {Array.<Array.<*>>} Array of diff tuples.
- * @private
- */
-diff_match_patch.prototype.diff_path1 = function(v_map, text1, text2) {
-  var path = [];
-  var x = text1.length;
-  var y = text2.length;
-  /** @type {number?} */
-  var last_op = null;
-  for (var d = v_map.length - 2; d >= 0; d--) {
-    while (1) {
-      if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty((x - 1) + ',' + y) :
-          (v_map[d][(x - 1) + ',' + y] !== undefined)) {
-        x--;
-        if (last_op === DIFF_DELETE) {
-          path[0][1] = text1.charAt(x) + path[0][1];
-        } else {
-          path.unshift([DIFF_DELETE, text1.charAt(x)]);
-        }
-        last_op = DIFF_DELETE;
-        break;
-      } else if (v_map[d].hasOwnProperty ?
-                 v_map[d].hasOwnProperty(x + ',' + (y - 1)) :
-                 (v_map[d][x + ',' + (y - 1)] !== undefined)) {
-        y--;
-        if (last_op === DIFF_INSERT) {
-          path[0][1] = text2.charAt(y) + path[0][1];
-        } else {
-          path.unshift([DIFF_INSERT, text2.charAt(y)]);
-        }
-        last_op = DIFF_INSERT;
-        break;
-      } else {
-        x--;
-        y--;
-        //if (text1.charAt(x) != text2.charAt(y)) {
-        //  throw new Error('No diagonal.  Can\'t happen. (diff_path1)');
-        //}
-        if (last_op === DIFF_EQUAL) {
-          path[0][1] = text1.charAt(x) + path[0][1];
-        } else {
-          path.unshift([DIFF_EQUAL, text1.charAt(x)]);
-        }
-        last_op = DIFF_EQUAL;
-      }
-    }
-  }
-  return path;
-};
-
-
-/**
- * Work from the middle back to the end to determine the path.
- * @param {Array.<Object>} v_map Array of paths.
- * @param {string} text1 Old string fragment to be diffed.
- * @param {string} text2 New string fragment to be diffed.
- * @return {Array.<Array.<*>>} Array of diff tuples.
- * @private
- */
-diff_match_patch.prototype.diff_path2 = function(v_map, text1, text2) {
-  var path = [];
-  var pathLength = 0;
-  var x = text1.length;
-  var y = text2.length;
-  /** @type {number?} */
-  var last_op = null;
-  for (var d = v_map.length - 2; d >= 0; d--) {
-    while (1) {
-      if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty((x - 1) + ',' + y) :
-          (v_map[d][(x - 1) + ',' + y] !== undefined)) {
-        x--;
-        if (last_op === DIFF_DELETE) {
-          path[pathLength - 1][1] += text1.charAt(text1.length - x - 1);
-        } else {
-          path[pathLength++] =
-              [DIFF_DELETE, text1.charAt(text1.length - x - 1)];
-        }
-        last_op = DIFF_DELETE;
-        break;
-      } else if (v_map[d].hasOwnProperty ?
-                 v_map[d].hasOwnProperty(x + ',' + (y - 1)) :
-                 (v_map[d][x + ',' + (y - 1)] !== undefined)) {
-        y--;
-        if (last_op === DIFF_INSERT) {
-          path[pathLength - 1][1] += text2.charAt(text2.length - y - 1);
-        } else {
-          path[pathLength++] =
-              [DIFF_INSERT, text2.charAt(text2.length - y - 1)];
-        }
-        last_op = DIFF_INSERT;
-        break;
-      } else {
-        x--;
-        y--;
-        //if (text1.charAt(text1.length - x - 1) !=
-        //    text2.charAt(text2.length - y - 1)) {
-        //  throw new Error('No diagonal.  Can\'t happen. (diff_path2)');
-        //}
-        if (last_op === DIFF_EQUAL) {
-          path[pathLength - 1][1] += text1.charAt(text1.length - x - 1);
-        } else {
-          path[pathLength++] =
-              [DIFF_EQUAL, text1.charAt(text1.length - x - 1)];
-        }
-        last_op = DIFF_EQUAL;
-      }
-    }
-  }
-  return path;
-};
-
-
-/**
- * Determine the common prefix of two strings
- * @param {string} text1 First string.
- * @param {string} text2 Second string.
- * @return {number} The number of characters common to the start of each
- *     string.
- */
-diff_match_patch.prototype.diff_commonPrefix = function(text1, text2) {
-  // Quick check for common null cases.
-  if (!text1 || !text2 || text1.charCodeAt(0) !== text2.charCodeAt(0)) {
-    return 0;
-  }
-  // Binary search.
-  // Performance analysis: http://neil.fraser.name/news/2007/10/09/
-  var pointermin = 0;
-  var pointermax = Math.min(text1.length, text2.length);
-  var pointermid = pointermax;
-  var pointerstart = 0;
-  while (pointermin < pointermid) {
-    if (text1.substring(pointerstart, pointermid) ==
-        text2.substring(pointerstart, pointermid)) {
-      pointermin = pointermid;
-      pointerstart = pointermin;
-    } else {
-      pointermax = pointermid;
-    }
-    pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
-  }
-  return pointermid;
-};
-
-
-/**
- * Determine the common suffix of two strings
- * @param {string} text1 First string.
- * @param {string} text2 Second string.
- * @return {number} The number of characters common to the end of each string.
- */
-diff_match_patch.prototype.diff_commonSuffix = function(text1, text2) {
-  // Quick check for common null cases.
-  if (!text1 || !text2 || text1.charCodeAt(text1.length - 1) !==
-                          text2.charCodeAt(text2.length - 1)) {
-    return 0;
-  }
-  // Binary search.
-  // Performance analysis: http://neil.fraser.name/news/2007/10/09/
-  var pointermin = 0;
-  var pointermax = Math.min(text1.length, text2.length);
-  var pointermid = pointermax;
-  var pointerend = 0;
-  while (pointermin < pointermid) {
-    if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==
-        text2.substring(text2.length - pointermid, text2.length - pointerend)) {
-      pointermin = pointermid;
-      pointerend = pointermin;
-    } else {
-      pointermax = pointermid;
-    }
-    pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
-  }
-  return pointermid;
-};
-
-
-/**
- * Do the two texts share a substring which is at least half the length of the
- * longer text?
- * @param {string} text1 First string.
- * @param {string} text2 Second string.
- * @return {Array.<string>?} Five element Array, containing the prefix of
- *     text1, the suffix of text1, the prefix of text2, the suffix of
- *     text2 and the common middle.  Or null if there was no match.
- */
-diff_match_patch.prototype.diff_halfMatch = function(text1, text2) {
-  var longtext = text1.length > text2.length ? text1 : text2;
-  var shorttext = text1.length > text2.length ? text2 : text1;
-  if (longtext.length < 10 || shorttext.length < 1) {
-    return null;  // Pointless.
-  }
-  var dmp = this;  // 'this' becomes 'window' in a closure.
-
-  /**
-   * Does a substring of shorttext exist within longtext such that the substring
-   * is at least half the length of longtext?
-   * Closure, but does not reference any external variables.
-   * @param {string} longtext Longer string.
-   * @param {string} shorttext Shorter string.
-   * @param {number} i Start index of quarter length substring within longtext
-   * @return {Array.<string>?} Five element Array, containing the prefix of
-   *     longtext, the suffix of longtext, the prefix of shorttext, the suffix
-   *     of shorttext and the common middle.  Or null if there was no match.
-   * @private
-   */
-  function diff_halfMatchI(longtext, shorttext, i) {
-    // Start with a 1/4 length substring at position i as a seed.
-    var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));
-    var j = -1;
-    var best_common = '';
-    var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;
-    while ((j = shorttext.indexOf(seed, j + 1)) != -1) {
-      var prefixLength = dmp.diff_commonPrefix(longtext.substring(i),
-                                               shorttext.substring(j));
-      var suffixLength = dmp.diff_commonSuffix(longtext.substring(0, i),
-                                               shorttext.substring(0, j));
-      if (best_common.length < suffixLength + prefixLength) {
-        best_common = shorttext.substring(j - suffixLength, j) +
-            shorttext.substring(j, j + prefixLength);
-        best_longtext_a = longtext.substring(0, i - suffixLength);
-        best_longtext_b = longtext.substring(i + prefixLength);
-        best_shorttext_a = shorttext.substring(0, j - suffixLength);
-        best_shorttext_b = shorttext.substring(j + prefixLength);
-      }
-    }
-    if (best_common.length >= longtext.length / 2) {
-      return [best_longtext_a, best_longtext_b,
-              best_shorttext_a, best_shorttext_b, best_common];
-    } else {
-      return null;
-    }
-  }
-
-  // First check if the second quarter is the seed for a half-match.
-  var hm1 = diff_halfMatchI(longtext, shorttext,
-                            Math.ceil(longtext.length / 4));
-  // Check again based on the third quarter.
-  var hm2 = diff_halfMatchI(longtext, shorttext,
-                            Math.ceil(longtext.length / 2));
-  var hm;
-  if (!hm1 && !hm2) {
-    return null;
-  } else if (!hm2) {
-    hm = hm1;
-  } else if (!hm1) {
-    hm = hm2;
-  } else {
-    // Both matched.  Select the longest.
-    hm = hm1[4].length > hm2[4].length ? hm1 : hm2;
-  }
-
-  // A half-match was found, sort out the return data.
-  var text1_a, text1_b, text2_a, text2_b;
-  if (text1.length > text2.length) {
-    text1_a = hm[0];
-    text1_b = hm[1];
-    text2_a = hm[2];
-    text2_b = hm[3];
-  } else {
-    text2_a = hm[0];
-    text2_b = hm[1];
-    text1_a = hm[2];
-    text1_b = hm[3];
-  }
-  var mid_common = hm[4];
-  return [text1_a, text1_b, text2_a, text2_b, mid_common];
-};
-
-
-/**
- * Reduce the number of edits by eliminating semantically trivial equalities.
- * @param {Array.<Array.<*>>} diffs Array of diff tuples.
- */
-diff_match_patch.prototype.diff_cleanupSemantic = function(diffs) {
-  var changes = false;
-  var equalities = [];  // Stack of indices where equalities are found.
-  var equalitiesLength = 0;  // Keeping our own length var is faster in JS.
-  var lastequality = null;  // Always equal to equalities[equalitiesLength-1][1]
-  var pointer = 0;  // Index of current position.
-  // Number of characters that changed prior to the equality.
-  var length_changes1 = 0;
-  // Number of characters that changed after the equality.
-  var length_changes2 = 0;
-  while (pointer < diffs.length) {
-    if (diffs[pointer][0] == DIFF_EQUAL) {  // equality found
-      equalities[equalitiesLength++] = pointer;
-      length_changes1 = length_changes2;
-      length_changes2 = 0;
-      lastequality = diffs[pointer][1];
-    } else {  // an insertion or deletion
-      length_changes2 += diffs[pointer][1].length;
-      if (lastequality !== null && (lastequality.length <= length_changes1) &&
-          (lastequality.length <= length_changes2)) {
-        // Duplicate record
-        diffs.splice(equalities[equalitiesLength - 1], 0,
-                     [DIFF_DELETE, lastequality]);
-        // Change second copy to insert.
-        diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;
-        // Throw away the equality we just deleted.
-        equalitiesLength--;
-        // Throw away the previous equality (it needs to be reevaluated).
-        equalitiesLength--;
-        pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;
-        length_changes1 = 0;  // Reset the counters.
-        length_changes2 = 0;
-        lastequality = null;
-        changes = true;
-      }
-    }
-    pointer++;
-  }
-  if (changes) {
-    this.diff_cleanupMerge(diffs);
-  }
-  this.diff_cleanupSemanticLossless(diffs);
-};
-
-
-/**
- * Look for single edits surrounded on both sides by equalities
- * which can be shifted sideways to align the edit to a word boundary.
- * e.g: The c<ins>at c</ins>ame. -> The <ins>cat </ins>came.
- * @param {Array.<Array.<*>>} diffs Array of diff tuples.
- */
-diff_match_patch.prototype.diff_cleanupSemanticLossless = function(diffs) {
-  // Define some regex patterns for matching boundaries. 
-  var punctuation = /[^a-zA-Z0-9]/;
-  var whitespace = /\s/;
-  var linebreak = /[\r\n]/;
-  var blanklineEnd = /\n\r?\n$/;
-  var blanklineStart = /^\r?\n\r?\n/;
-
-  /**
-   * Given two strings, compute a score representing whether the internal
-   * boundary falls on logical boundaries.
-   * Scores range from 5 (best) to 0 (worst).
-   * Closure, makes reference to regex patterns defined above.
-   * @param {string} one First string
-   * @param {string} two Second string
-   * @return {number} The score.
-   */
-  function diff_cleanupSemanticScore(one, two) {
-    if (!one || !two) {
-      // Edges are the best.
-      return 5;
-    }
-
-    // Each port of this function behaves slightly differently due to
-    // subtle differences in each language's definition of things like
-    // 'whitespace'.  Since this function's purpose is largely cosmetic,
-    // the choice has been made to use each language's native features
-    // rather than force total conformity.
-    var score = 0;
-    // One point for non-alphanumeric.
-    if (one.charAt(one.length - 1).match(punctuation) ||
-        two.charAt(0).match(punctuation)) {
-      score++;
-      // Two points for whitespace.
-      if (one.charAt(one.length - 1).match(whitespace) ||
-          two.charAt(0).match(whitespace)) {
-        score++;
-        // Three points for line breaks.
-        if (one.charAt(one.length - 1).match(linebreak) ||
-            two.charAt(0).match(linebreak)) {
-          score++;
-          // Four points for blank lines.
-          if (one.match(blanklineEnd) || two.match(blanklineStart)) {
-            score++;
-          }
-        }
-      }
-    }
-    return score;
-  }
-
-  var pointer = 1;
-  // Intentionally ignore the first and last element (don't need checking).
-  while (pointer < diffs.length - 1) {
-    if (diffs[pointer - 1][0] == DIFF_EQUAL &&
-        diffs[pointer + 1][0] == DIFF_EQUAL) {
-      // This is a single edit surrounded by equalities.
-      var equality1 = diffs[pointer - 1][1];
-      var edit = diffs[pointer][1];
-      var equality2 = diffs[pointer + 1][1];
-
-      // First, shift the edit as far left as possible.
-      var commonOffset = this.diff_commonSuffix(equality1, edit);
-      if (commonOffset) {
-        var commonString = edit.substring(edit.length - commonOffset);
-        equality1 = equality1.substring(0, equality1.length - commonOffset);
-        edit = commonString + edit.substring(0, edit.length - commonOffset);
-        equality2 = commonString + equality2;
-      }
-
-      // Second, step character by character right, looking for the best fit.
-      var bestEquality1 = equality1;
-      var bestEdit = edit;
-      var bestEquality2 = equality2;
-      var bestScore = diff_cleanupSemanticScore(equality1, edit) +
-          diff_cleanupSemanticScore(edit, equality2);
-      while (edit.charAt(0) === equality2.charAt(0)) {
-        equality1 += edit.charAt(0);
-        edit = edit.substring(1) + equality2.charAt(0);
-        equality2 = equality2.substring(1);
-        var score = diff_cleanupSemanticScore(equality1, edit) +
-            diff_cleanupSemanticScore(edit, equality2);
-        // The >= encourages trailing rather than leading whitespace on edits.
-        if (score >= bestScore) {
-          bestScore = score;
-          bestEquality1 = equality1;
-          bestEdit = edit;
-          bestEquality2 = equality2;
-        }
-      }
-
-      if (diffs[pointer - 1][1] != bestEquality1) {
-        // We have an improvement, save it back to the diff.
-        if (bestEquality1) {
-          diffs[pointer - 1][1] = bestEquality1;
-        } else {
-          diffs.splice(pointer - 1, 1);
-          pointer--;
-        }
-        diffs[pointer][1] = bestEdit;
-        if (bestEquality2) {
-          diffs[pointer + 1][1] = bestEquality2;
-        } else {
-          diffs.splice(pointer + 1, 1);
-          pointer--;
-        }
-      }
-    }
-    pointer++;
-  }
-};
-
-
-/**
- * Reduce the number of edits by eliminating operationally trivial equalities.
- * @param {Array.<Array.<*>>} diffs Array of diff tuples.
- */
-diff_match_patch.prototype.diff_cleanupEfficiency = function(diffs) {
-  var changes = false;
-  var equalities = [];  // Stack of indices where equalities are found.
-  var equalitiesLength = 0;  // Keeping our own length var is faster in JS.
-  var lastequality = '';  // Always equal to equalities[equalitiesLength-1][1]
-  var pointer = 0;  // Index of current position.
-  // Is there an insertion operation before the last equality.
-  var pre_ins = false;
-  // Is there a deletion operation before the last equality.
-  var pre_del = false;
-  // Is there an insertion operation after the last equality.
-  var post_ins = false;
-  // Is there a deletion operation after the last equality.
-  var post_del = false;
-  while (pointer < diffs.length) {
-    if (diffs[pointer][0] == DIFF_EQUAL) {  // equality found
-      if (diffs[pointer][1].length < this.Diff_EditCost &&
-          (post_ins || post_del)) {
-        // Candidate found.
-        equalities[equalitiesLength++] = pointer;
-        pre_ins = post_ins;
-        pre_del = post_del;
-        lastequality = diffs[pointer][1];
-      } else {
-        // Not a candidate, and can never become one.
-        equalitiesLength = 0;
-        lastequality = '';
-      }
-      post_ins = post_del = false;
-    } else {  // an insertion or deletion
-      if (diffs[pointer][0] == DIFF_DELETE) {
-        post_del = true;
-      } else {
-        post_ins = true;
-      }
-      /*
-       * Five types to be split:
-       * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
-       * <ins>A</ins>X<ins>C</ins><del>D</del>
-       * <ins>A</ins><del>B</del>X<ins>C</ins>
-       * <ins>A</del>X<ins>C</ins><del>D</del>
-       * <ins>A</ins><del>B</del>X<del>C</del>
-       */
-      if (lastequality && ((pre_ins && pre_del && post_ins && post_del) ||
-                           ((lastequality.length < this.Diff_EditCost / 2) &&
-                            (pre_ins + pre_del + post_ins + post_del) == 3))) {
-        // Duplicate record
-        diffs.splice(equalities[equalitiesLength - 1], 0,
-                     [DIFF_DELETE, lastequality]);
-        // Change second copy to insert.
-        diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;
-        equalitiesLength--;  // Throw away the equality we just deleted;
-        lastequality = '';
-        if (pre_ins && pre_del) {
-          // No changes made which could affect previous entry, keep going.
-          post_ins = post_del = true;
-          equalitiesLength = 0;
-        } else {
-          equalitiesLength--;  // Throw away the previous equality;
-          pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;
-          post_ins = post_del = false;
-        }
-        changes = true;
-      }
-    }
-    pointer++;
-  }
-
-  if (changes) {
-    this.diff_cleanupMerge(diffs);
-  }
-};
-
-
-/**
- * Reorder and merge like edit sections.  Merge equalities.
- * Any edit section can move as long as it doesn't cross an equality.
- * @param {Array.<Array.<*>>} diffs Array of diff tuples.
- */
-diff_match_patch.prototype.diff_cleanupMerge = function(diffs) {
-  diffs.push([DIFF_EQUAL, '']);  // Add a dummy entry at the end.
-  var pointer = 0;
-  var count_delete = 0;
-  var count_insert = 0;
-  var text_delete = '';
-  var text_insert = '';
-  var commonlength;
-  while (pointer < diffs.length) {
-    switch (diffs[pointer][0]) {
-      case DIFF_INSERT:
-        count_insert++;
-        text_insert += diffs[pointer][1];
-        pointer++;
-        break;
-      case DIFF_DELETE:
-        count_delete++;
-        text_delete += diffs[pointer][1];
-        pointer++;
-        break;
-      case DIFF_EQUAL:
-        // Upon reaching an equality, check for prior redundancies.
-        if (count_delete !== 0 || count_insert !== 0) {
-          if (count_delete !== 0 && count_insert !== 0) {
-            // Factor out any common prefixies.
-            commonlength = this.diff_commonPrefix(text_insert, text_delete);
-            if (commonlength !== 0) {
-              if ((pointer - count_delete - count_insert) > 0 &&
-                  diffs[pointer - count_delete - count_insert - 1][0] ==
-                  DIFF_EQUAL) {
-                diffs[pointer - count_delete - count_insert - 1][1] +=
-                    text_insert.substring(0, commonlength);
-              } else {
-                diffs.splice(0, 0, [DIFF_EQUAL,
-                    text_insert.substring(0, commonlength)]);
-                pointer++;
-              }
-              text_insert = text_insert.substring(commonlength);
-              text_delete = text_delete.substring(commonlength);
-            }
-            // Factor out any common suffixies.
-            commonlength = this.diff_commonSuffix(text_insert, text_delete);
-            if (commonlength !== 0) {
-              diffs[pointer][1] = text_insert.substring(text_insert.length -
-                  commonlength) + diffs[pointer][1];
-              text_insert = text_insert.substring(0, text_insert.length -
-                  commonlength);
-              text_delete = text_delete.substring(0, text_delete.length -
-                  commonlength);
-            }
-          }
-          // Delete the offending records and add the merged ones.
-          if (count_delete === 0) {
-            diffs.splice(pointer - count_delete - count_insert,
-                count_delete + count_insert, [DIFF_INSERT, text_insert]);
-          } else if (count_insert === 0) {
-            diffs.splice(pointer - count_delete - count_insert,
-                count_delete + count_insert, [DIFF_DELETE, text_delete]);
-          } else {
-            diffs.splice(pointer - count_delete - count_insert,
-                count_delete + count_insert, [DIFF_DELETE, text_delete],
-                [DIFF_INSERT, text_insert]);
-          }
-          pointer = pointer - count_delete - count_insert +
-                    (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1;
-        } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {
-          // Merge this equality with the previous one.
-          diffs[pointer - 1][1] += diffs[pointer][1];
-          diffs.splice(pointer, 1);
-        } else {
-          pointer++;
-        }
-        count_insert = 0;
-        count_delete = 0;
-        text_delete = '';
-        text_insert = '';
-        break;
-    }
-  }
-  if (diffs[diffs.length - 1][1] === '') {
-    diffs.pop();  // Remove the dummy entry at the end.
-  }
-
-  // Second pass: look for single edits surrounded on both sides by equalities
-  // which can be shifted sideways to eliminate an equality.
-  // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
-  var changes = false;
-  pointer = 1;
-  // Intentionally ignore the first and last element (don't need checking).
-  while (pointer < diffs.length - 1) {
-    if (diffs[pointer - 1][0] == DIFF_EQUAL &&
-        diffs[pointer + 1][0] == DIFF_EQUAL) {
-      // This is a single edit surrounded by equalities.
-      if (diffs[pointer][1].substring(diffs[pointer][1].length -
-          diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {
-        // Shift the edit over the previous equality.
-        diffs[pointer][1] = diffs[pointer - 1][1] +
-            diffs[pointer][1].substring(0, diffs[pointer][1].length -
-                                        diffs[pointer - 1][1].length);
-        diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];
-        diffs.splice(pointer - 1, 1);
-        changes = true;
-      } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==
-          diffs[pointer + 1][1]) {
-        // Shift the edit over the next equality.
-        diffs[pointer - 1][1] += diffs[pointer + 1][1];
-        diffs[pointer][1] =
-            diffs[pointer][1].substring(diffs[pointer + 1][1].length) +
-            diffs[pointer + 1][1];
-        diffs.splice(pointer + 1, 1);
-        changes = true;
-      }
-    }
-    pointer++;
-  }
-  // If shifts were made, the diff needs reordering and another shift sweep.
-  if (changes) {
-    this.diff_cleanupMerge(diffs);
-  }
-};
-
-
-/**
- * loc is a location in text1, compute and return the equivalent location in
- * text2.
- * e.g. 'The cat' vs 'The big cat', 1->1, 5->8
- * @param {Array.<Array.<*>>} diffs Array of diff tuples.
- * @param {number} loc Location within text1.
- * @return {number} Location within text2.
- */
-diff_match_patch.prototype.diff_xIndex = function(diffs, loc) {
-  var chars1 = 0;
-  var chars2 = 0;
-  var last_chars1 = 0;
-  var last_chars2 = 0;
-  var x;
-  for (x = 0; x < diffs.length; x++) {
-    if (diffs[x][0] !== DIFF_INSERT) {  // Equality or deletion.
-      chars1 += diffs[x][1].length;
-    }
-    if (diffs[x][0] !== DIFF_DELETE) {  // Equality or insertion.
-      chars2 += diffs[x][1].length;
-    }
-    if (chars1 > loc) {  // Overshot the location.
-      break;
-    }
-    last_chars1 = chars1;
-    last_chars2 = chars2;
-  }
-  // Was the location was deleted?
-  if (diffs.length != x && diffs[x][0] === DIFF_DELETE) {
-    return last_chars2;
-  }
-  // Add the remaining character length.
-  return last_chars2 + (loc - last_chars1);
-};
-
-
-/**
- * Convert a diff array into a pretty HTML report.
- * @param {Array.<Array.<*>>} diffs Array of diff tuples.
- * @return {string} HTML representation.
- */
-diff_match_patch.prototype.diff_prettyHtml = function(diffs) {
-  var html = [];
-  var i = 0;
-  for (var x = 0; x < diffs.length; x++) {
-    var op = diffs[x][0];    // Operation (insert, delete, equal)
-    var data = diffs[x][1];  // Text of change.
-    var text = data.replace(/&/g, '&amp;').replace(/</g, '&lt;')
-        .replace(/>/g, '&gt;').replace(/\n/g, '&para;<BR>');
-    switch (op) {
-      case DIFF_INSERT:
-        html[x] = '<INS STYLE="background:#E6FFE6;" TITLE="i=' + i + '">' +
-                text + '</INS>';
-        break;
-      case DIFF_DELETE:
-        html[x] = '<DEL STYLE="background:#FFE6E6;" TITLE="i=' + i + '">' +
-                text + '</DEL>';
-        break;
-      case DIFF_EQUAL:
-        html[x] = '<SPAN TITLE="i=' + i + '">' + text + '</SPAN>';
-        break;
-    }
-    if (op !== DIFF_DELETE) {
-      i += data.length;
-    }
-  }
-  return html.join('');
-};
-
-
-/**
- * Compute and return the source text (all equalities and deletions).
- * @param {Array.<Array.<*>>} diffs Array of diff tuples.
- * @return {string} Source text.
- */
-diff_match_patch.prototype.diff_text1 = function(diffs) {
-  var text = [];
-  for (var x = 0; x < diffs.length; x++) {
-    if (diffs[x][0] !== DIFF_INSERT) {
-      text[x] = diffs[x][1];
-    }
-  }
-  return text.join('');
-};
-
-
-/**
- * Compute and return the destination text (all equalities and insertions).
- * @param {Array.<Array.<*>>} diffs Array of diff tuples.
- * @return {string} Destination text.
- */
-diff_match_patch.prototype.diff_text2 = function(diffs) {
-  var text = [];
-  for (var x = 0; x < diffs.length; x++) {
-    if (diffs[x][0] !== DIFF_DELETE) {
-      text[x] = diffs[x][1];
-    }
-  }
-  return text.join('');
-};
-
-
-/**
- * Crush the diff into an encoded string which describes the operations
- * required to transform text1 into text2.
- * E.g. =3\t-2\t+ing  -> Keep 3 chars, delete 2 chars, insert 'ing'.
- * Operations are tab-separated.  Inserted text is escaped using %xx notation.
- * @param {Array.<Array.<*>>} diffs Array of diff tuples.
- * @return {string} Delta text.
- */
-diff_match_patch.prototype.diff_toDelta = function(diffs) {
-  var text = [];
-  for (var x = 0; x < diffs.length; x++) {
-    switch (diffs[x][0]) {
-      case DIFF_INSERT:
-        text[x] = '+' + encodeURI(diffs[x][1]);
-        break;
-      case DIFF_DELETE:
-        text[x] = '-' + diffs[x][1].length;
-        break;
-      case DIFF_EQUAL:
-        text[x] = '=' + diffs[x][1].length;
-        break;
-    }
-  }
-  // Opera doesn't know how to encode char 0.
-  return text.join('\t').replace(/\x00/g, '%00').replace(/%20/g, ' ');
-};
-
-
-/**
- * Given the original text1, and an encoded string which describes the
- * operations required to transform text1 into text2, compute the full diff.
- * @param {string} text1 Source string for the diff.
- * @param {string} delta Delta text.
- * @return {Array.<Array.<*>>} Array of diff tuples.
- * @throws {Error} If invalid input.
- */
-diff_match_patch.prototype.diff_fromDelta = function(text1, delta) {
-  var diffs = [];
-  var diffsLength = 0;  // Keeping our own length var is faster in JS.
-  var pointer = 0;  // Cursor in text1
-  // Opera doesn't know how to decode char 0.
-  delta = delta.replace(/%00/g, '\0');
-  var tokens = delta.split(/\t/g);
-  for (var x = 0; x < tokens.length; x++) {
-    // Each token begins with a one character parameter which specifies the
-    // operation of this token (delete, insert, equality).
-    var param = tokens[x].substring(1);
-    switch (tokens[x].charAt(0)) {
-      case '+':
-        try {
-          diffs[diffsLength++] = [DIFF_INSERT, decodeURI(param)];
-        } catch (ex) {
-          // Malformed URI sequence.
-          throw new Error('Illegal escape in diff_fromDelta: ' + param);
-        }
-        break;
-      case '-':
-        // Fall through.
-      case '=':
-        var n = parseInt(param, 10);
-        if (isNaN(n) || n < 0) {
-          throw new Error('Invalid number in diff_fromDelta: ' + param);
-        }
-        var text = text1.substring(pointer, pointer += n);
-        if (tokens[x].charAt(0) == '=') {
-          diffs[diffsLength++] = [DIFF_EQUAL, text];
-        } else {
-          diffs[diffsLength++] = [DIFF_DELETE, text];
-        }
-        break;
-      default:
-        // Blank tokens are ok (from a trailing \t).
-        // Anything else is an error.
-        if (tokens[x]) {
-          throw new Error('Invalid diff operation in diff_fromDelta: ' +
-                          tokens[x]);
-        }
-    }
-  }
-  if (pointer != text1.length) {
-    throw new Error('Delta length (' + pointer +
-        ') does not equal source text length (' + text1.length + ').');
-  }
-  return diffs;
-};
-
-
-//  MATCH FUNCTIONS
-
-
-/**
- * Locate the best instance of 'pattern' in 'text' near 'loc'.
- * @param {string} text The text to search.
- * @param {string} pattern The pattern to search for.
- * @param {number} loc The location to search around.
- * @return {number?} Best match index or null.
- */
-diff_match_patch.prototype.match_main = function(text, pattern, loc) {
-  loc = Math.max(0, Math.min(loc, text.length - pattern.length));
-  if (text == pattern) {
-    // Shortcut (potentially not guaranteed by the algorithm)
-    return 0;
-  } else if (text.length === 0) {
-    // Nothing to match.
-    return null;
-  } else if (text.substring(loc, loc + pattern.length) == pattern) {
-    // Perfect match at the perfect spot!  (Includes case of null pattern)
-    return loc;
-  } else {
-    // Do a fuzzy compare.
-    return this.match_bitap(text, pattern, loc);
-  }
-};
-
-
-/**
- * Locate the best instance of 'pattern' in 'text' near 'loc' using the
- * Bitap algorithm.
- * @param {string} text The text to search.
- * @param {string} pattern The pattern to search for.
- * @param {number} loc The location to search around.
- * @return {number?} Best match index or null.
- * @private
- */
-diff_match_patch.prototype.match_bitap = function(text, pattern, loc) {
-  if (pattern.length > this.Match_MaxBits) {
-    throw new Error('Pattern too long for this browser.');
-  }
-
-  // Initialise the alphabet.
-  var s = this.match_alphabet(pattern);
-
-  var score_text_length = text.length;
-  // Coerce the text length between reasonable maximums and minimums.
-  score_text_length = Math.max(score_text_length, this.Match_MinLength);
-  score_text_length = Math.min(score_text_length, this.Match_MaxLength);
-
-  var dmp = this;  // 'this' becomes 'window' in a closure.
-
-  /**
-   * Compute and return the score for a match with e errors and x location.
-   * Accesses loc, score_text_length and pattern through being a closure.
-   * @param {number} e Number of errors in match
-   * @param {number} x Location of match
-   * @return {number} Overall score for match
-   * @private
-   */
-  function match_bitapScore(e, x) {
-    var d = Math.abs(loc - x);
-    return (e / pattern.length / dmp.Match_Balance) +
-           (d / score_text_length / (1.0 - dmp.Match_Balance));
-  }
-
-  // Highest score beyond which we give up.
-  var score_threshold = this.Match_Threshold;
-  // Is there a nearby exact match? (speedup)
-  var best_loc = text.indexOf(pattern, loc);
-  if (best_loc != -1) {
-    score_threshold = Math.min(match_bitapScore(0, best_loc), score_threshold);
-  }
-  // What about in the other direction? (speedup)
-  best_loc = text.lastIndexOf(pattern, loc + pattern.length);
-  if (best_loc != -1) {
-    score_threshold = Math.min(match_bitapScore(0, best_loc), score_threshold);
-  }
-
-  // Initialise the bit arrays.
-  var matchmask = 1 << (pattern.length - 1);
-  best_loc = null;
-
-  var bin_min, bin_mid;
-  var bin_max = Math.max(loc + loc, text.length);
-  var last_rd;
-  for (var d = 0; d < pattern.length; d++) {
-    // Scan for the best match; each iteration allows for one more error.
-    var rd = Array(text.length);
-
-    // Run a binary search to determine how far from 'loc' we can stray at this
-    // error level.
-    bin_min = loc;
-    bin_mid = bin_max;
-    while (bin_min < bin_mid) {
-      if (match_bitapScore(d, bin_mid) < score_threshold) {
-        bin_min = bin_mid;
-      } else {
-        bin_max = bin_mid;
-      }
-      bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);
-    }
-    // Use the result from this iteration as the maximum for the next.
-    bin_max = bin_mid;
-    var start = Math.max(0, loc - (bin_mid - loc) - 1);
-    var finish = Math.min(text.length - 1, pattern.length + bin_mid);
-
-    if (text.charAt(finish) == pattern.charAt(pattern.length - 1)) {
-      rd[finish] = (1 << (d + 1)) - 1;
-    } else {
-      rd[finish] = (1 << d) - 1;
-    }
-    for (var j = finish - 1; j >= start; j--) {
-      // The alphabet (s) is a sparse hash, so the following lines generate
-      // warnings.
-      if (d === 0) {  // First pass: exact match.
-        rd[j] = ((rd[j + 1] << 1) | 1) & s[text.charAt(j)];
-      } else {  // Subsequent passes: fuzzy match.
-        rd[j] = ((rd[j + 1] << 1) | 1) & s[text.charAt(j)] |
-                ((last_rd[j + 1] << 1) | 1) | ((last_rd[j] << 1) | 1) |
-                last_rd[j + 1];
-      }
-      if (rd[j] & matchmask) {
-        var score = match_bitapScore(d, j);
-        // This match will almost certainly be better than any existing match.
-        // But check anyway.
-        if (score <= score_threshold) {
-          // Told you so.
-          score_threshold = score;
-          best_loc = j;
-          if (j > loc) {
-            // When passing loc, don't exceed our current distance from loc.
-            start = Math.max(0, loc - (j - loc));
-          } else {
-            // Already passed loc, downhill from here on in.
-            break;
-          }
-        }
-      }
-    }
-    // No hope for a (better) match at greater error levels.
-    if (match_bitapScore(d + 1, loc) > score_threshold) {
-      break;
-    }
-    last_rd = rd;
-  }
-  return best_loc;
-};
-
-
-/**
- * Initialise the alphabet for the Bitap algorithm.
- * @param {string} pattern The text to encode.
- * @return {Object} Hash of character locations.
- * @private
- */
-diff_match_patch.prototype.match_alphabet = function(pattern) {
-  var s = {};
-  for (var i = 0; i < pattern.length; i++) {
-    s[pattern.charAt(i)] = 0;
-  }
-  for (var i = 0; i < pattern.length; i++) {
-    s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1);
-  }
-  return s;
-};
-
-
-//  PATCH FUNCTIONS
-
-
-/**
- * Increase the context until it is unique,
- * but don't let the pattern expand beyond Match_MaxBits.
- * @param {patch_obj} patch The patch to grow.
- * @param {string} text Source text.
- * @private
- */
-diff_match_patch.prototype.patch_addContext = function(patch, text) {
-  var pattern = text.substring(patch.start2, patch.start2 + patch.length1);
-  var padding = 0;
-  while (text.indexOf(pattern) != text.lastIndexOf(pattern) &&
-         pattern.length < this.Match_MaxBits - this.Patch_Margin
-         - this.Patch_Margin) {
-    padding += this.Patch_Margin;
-    pattern = text.substring(patch.start2 - padding,
-                             patch.start2 + patch.length1 + padding);
-  }
-  // Add one chunk for good luck.
-  padding += this.Patch_Margin;
-  // Add the prefix.
-  var prefix = text.substring(patch.start2 - padding, patch.start2);
-  if (prefix !== '') {
-    patch.diffs.unshift([DIFF_EQUAL, prefix]);
-  }
-  // Add the suffix.
-  var suffix = text.substring(patch.start2 + patch.length1,
-                              patch.start2 + patch.length1 + padding);
-  if (suffix !== '') {
-    patch.diffs.push([DIFF_EQUAL, suffix]);
-  }
-
-  // Roll back the start points.
-  patch.start1 -= prefix.length;
-  patch.start2 -= prefix.length;
-  // Extend the lengths.
-  patch.length1 += prefix.length + suffix.length;
-  patch.length2 += prefix.length + suffix.length;
-};
-
-
-/**
- * Compute a list of patches to turn text1 into text2.
- * Use diffs if provided, otherwise compute it ourselves.
- * There are four ways to call this function, depending on what data is
- * available to the caller:
- * Method 1:
- * a = text1, b = text2
- * Method 2:
- * a = diffs
- * Method 3 (optimal):
- * a = text1, b = diffs
- * Method 4 (deprecated, use method 3):
- * a = text1, b = text2, c = diffs
- *
- * @param {string|Array.<Array.<*>>} a text1 (methods 1,3,4) or Array of diff
- * tuples for text1 to text2 (method 2).
- * @param {string|Array.<Array.<*>>} opt_b text2 (methods 1,4) or Array of diff
- * tuples for text1 to text2 (method 3) or undefined (method 2).
- * @param {string|Array.<Array.<*>>} opt_c Array of diff tuples for text1 to
- * text2 (method 4) or undefined (methods 1,2,3).
- * @return {Array.<Array.<*>>} Array of patch objects.
- */
-diff_match_patch.prototype.patch_make = function(a, opt_b, opt_c) {
-  var text1, diffs;
-  if (typeof a == 'string' && typeof opt_b == 'string' &&
-      typeof opt_c == 'undefined') {
-    // Method 1: text1, text2
-    // Compute diffs from text1 and text2.
-    text1 = a;
-    diffs = this.diff_main(text1, opt_b, true);
-    if (diffs.length > 2) {
-      this.diff_cleanupSemantic(diffs);
-      this.diff_cleanupEfficiency(diffs);
-    }
-  } else if (typeof a == 'object' && typeof opt_b == 'undefined' &&
-      typeof opt_c == 'undefined') {
-    // Method 2: diffs
-    // Compute text1 from diffs.
-    diffs = a;
-    text1 = this.diff_text1(diffs);
-  } else if (typeof a == 'string' && typeof opt_b == 'object' &&
-      typeof opt_c == 'undefined') {
-    // Method 3: text1, diffs
-    text1 = a;
-    diffs = opt_b;
-  } else if (typeof a == 'string' && typeof opt_b == 'string' &&
-      typeof opt_c == 'object') {
-    // Method 4: text1, text2, diffs
-    // text2 is not used.
-    text1 = a;
-    diffs = opt_c;
-  } else {
-    throw new Error('Unknown call format to patch_make.');
-  }
-
-  if (diffs.length === 0) {
-    return [];  // Get rid of the null case.
-  }
-  var patches = [];
-  var patch = new patch_obj();
-  var patchDiffLength = 0;  // Keeping our own length var is faster in JS.
-  var char_count1 = 0;  // Number of characters into the text1 string.
-  var char_count2 = 0;  // Number of characters into the text2 string.
-  // Start with text1 (prepatch_text) and apply the diffs until we arrive at
-  // text2 (postpatch_text).  We recreate the patches one by one to determine
-  // context info.
-  var prepatch_text = text1;
-  var postpatch_text = text1;
-  for (var x = 0; x < diffs.length; x++) {
-    var diff_type = diffs[x][0];
-    var diff_text = diffs[x][1];
-
-    if (!patchDiffLength && diff_type !== DIFF_EQUAL) {
-      // A new patch starts here.
-      patch.start1 = char_count1;
-      patch.start2 = char_count2;
-    }
-
-    switch (diff_type) {
-      case DIFF_INSERT:
-        patch.diffs[patchDiffLength++] = diffs[x];
-        patch.length2 += diff_text.length;
-        postpatch_text = postpatch_text.substring(0, char_count2) + diff_text +
-                         postpatch_text.substring(char_count2);
-        break;
-      case DIFF_DELETE:
-        patch.length1 += diff_text.length;
-        patch.diffs[patchDiffLength++] = diffs[x];
-        postpatch_text = postpatch_text.substring(0, char_count2) +
-                         postpatch_text.substring(char_count2 + diff_text.length);
-        break;
-      case DIFF_EQUAL:
-        if (diff_text.length <= 2 * this.Patch_Margin &&
-            patchDiffLength && diffs.length != x + 1) {
-          // Small equality inside a patch.
-          patch.diffs[patchDiffLength++] = diffs[x];
-          patch.length1 += diff_text.length;
-          patch.length2 += diff_text.length;
-        } else if (diff_text.length >= 2 * this.Patch_Margin) {
-          // Time for a new patch.
-          if (patchDiffLength) {
-            this.patch_addContext(patch, prepatch_text);
-            patches.push(patch);
-            patch = new patch_obj();
-            patchDiffLength = 0;
-            prepatch_text = postpatch_text;
-          }
-        }
-        break;
-    }
-
-    // Update the current character count.
-    if (diff_type !== DIFF_INSERT) {
-      char_count1 += diff_text.length;
-    }
-    if (diff_type !== DIFF_DELETE) {
-      char_count2 += diff_text.length;
-    }
-  }
-  // Pick up the leftover patch if not empty.
-  if (patchDiffLength) {
-    this.patch_addContext(patch, prepatch_text);
-    patches.push(patch);
-  }
-
-  return patches;
-};
-
-
-/**
- * Given an array of patches, return another array that is identical.
- * @param {Array.<patch_obj>} patches Array of patch objects.
- * @return {Array.<patch_obj>} Array of patch objects.
- * @private
- */
-diff_match_patch.prototype.patch_deepCopy = function(patches) {
-  // Making deep copies is hard in JavaScript.
-  var patchesCopy = [];
-  for (var x = 0; x < patches.length; x++) {
-    var patch = patches[x];
-    var patchCopy = new patch_obj();
-    patchCopy.diffs = [];
-    for (var y = 0; y < patch.diffs.length; y++) {
-      patchCopy.diffs[y] = patch.diffs[y].slice();
-    }
-    patchCopy.start1 = patch.start1;
-    patchCopy.start2 = patch.start2;
-    patchCopy.length1 = patch.length1;
-    patchCopy.length2 = patch.length2;
-    patchesCopy[x] = patchCopy;
-  }
-  return patchesCopy;
-};
-
-
-/**
- * Merge a set of patches onto the text.  Return a patched text, as well
- * as a list of true/false values indicating which patches were applied.
- * @param {Array.<patch_obj>} patches Array of patch objects.
- * @param {string} text Old text.
- * @return {Array.<string|Array.<boolean>>} Two element Array, containing the
- *      new text and an array of boolean values.
- */
-diff_match_patch.prototype.patch_apply = function(patches, text) {
-  if (patches.length == 0) {
-    return [text, []];
-  }
-
-  // Deep copy the patches so that no changes are made to originals.
-  patches = this.patch_deepCopy(patches);
-
-  var nullPadding = this.patch_addPadding(patches);
-  text = nullPadding + text + nullPadding;
-
-  this.patch_splitMax(patches);
-  // delta keeps track of the offset between the expected and actual location
-  // of the previous patch.  If there are patches expected at positions 10 and
-  // 20, but the first patch was found at 12, delta is 2 and the second patch
-  // has an effective expected position of 22.
-  var delta = 0;
-  var results = [];
-  for (var x = 0; x < patches.length; x++) {
-    var expected_loc = patches[x].start2 + delta;
-    var text1 = this.diff_text1(patches[x].diffs);
-    var start_loc = this.match_main(text, text1, expected_loc);
-    if (start_loc === null) {
-      // No match found.  :(
-      results[x] = false;
-    } else {
-      // Found a match.  :)
-      results[x] = true;
-      delta = start_loc - expected_loc;
-      var text2 = text.substring(start_loc, start_loc + text1.length);
-      if (text1 == text2) {
-        // Perfect match, just shove the replacement text in.
-        text = text.substring(0, start_loc) +
-               this.diff_text2(patches[x].diffs) +
-               text.substring(start_loc + text1.length);
-      } else {
-        // Imperfect match.  Run a diff to get a framework of equivalent
-        // indicies.
-        var diffs = this.diff_main(text1, text2, false);
-        this.diff_cleanupSemanticLossless(diffs);
-        var index1 = 0;
-        var index2;
-        for (var y = 0; y < patches[x].diffs.length; y++) {
-          var mod = patches[x].diffs[y];
-          if (mod[0] !== DIFF_EQUAL) {
-            index2 = this.diff_xIndex(diffs, index1);
-          }
-          if (mod[0] === DIFF_INSERT) {  // Insertion
-            text = text.substring(0, start_loc + index2) + mod[1] +
-                   text.substring(start_loc + index2);
-          } else if (mod[0] === DIFF_DELETE) {  // Deletion
-            text = text.substring(0, start_loc + index2) +
-                   text.substring(start_loc + this.diff_xIndex(diffs,
-                       index1 + mod[1].length));
-          }
-          if (mod[0] !== DIFF_DELETE) {
-            index1 += mod[1].length;
-          }
-        }
-      }
-    }
-  }
-  // Strip the padding off.
-  text = text.substring(nullPadding.length, text.length - nullPadding.length);
-  return [text, results];
-};
-
-
-/**
- * Add some padding on text start and end so that edges can match something.
- * @param {Array.<patch_obj>} patches Array of patch objects.
- * @return {string} The padding string added to each side.
- * @private
- */
-diff_match_patch.prototype.patch_addPadding = function(patches) {
-  var nullPadding = '';
-  for (var x = 0; x < this.Patch_Margin; x++) {
-    nullPadding += String.fromCharCode(x);
-  }
-
-  // Bump all the patches forward.
-  for (var x = 0; x < patches.length; x++) {
-    patches[x].start1 += nullPadding.length;
-    patches[x].start2 += nullPadding.length;
-  }
-
-  // Add some padding on start of first diff.
-  var patch = patches[0];
-  var diffs = patch.diffs;
-  if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) {
-    // Add nullPadding equality.
-    diffs.unshift([DIFF_EQUAL, nullPadding]);
-    patch.start1 -= nullPadding.length;  // Should be 0.
-    patch.start2 -= nullPadding.length;  // Should be 0.
-    patch.length1 += nullPadding.length;
-    patch.length2 += nullPadding.length;
-  } else if (nullPadding.length > diffs[0][1].length) {
-    // Grow first equality.
-    var extraLength = nullPadding.length - diffs[0][1].length;
-    diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1];
-    patch.start1 -= extraLength;
-    patch.start2 -= extraLength;
-    patch.length1 += extraLength;
-    patch.length2 += extraLength;
-  }
-
-  // Add some padding on end of last diff.
-  patch = patches[patches.length - 1];
-  diffs = patch.diffs;
-  if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) {
-    // Add nullPadding equality.
-    diffs.push([DIFF_EQUAL, nullPadding]);
-    patch.length1 += nullPadding.length;
-    patch.length2 += nullPadding.length;
-  } else if (nullPadding.length > diffs[diffs.length - 1][1].length) {
-    // Grow last equality.
-    var extraLength = nullPadding.length - diffs[diffs.length - 1][1].length;
-    diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength);
-    patch.length1 += extraLength;
-    patch.length2 += extraLength;
-  }
-
-  return nullPadding;
-};
-
-
-/**
- * Look through the patches and break up any which are longer than the maximum
- * limit of the match algorithm.
- * @param {Array.<patch_obj>} patches Array of patch objects.
- */
-diff_match_patch.prototype.patch_splitMax = function(patches) {
-  for (var x = 0; x < patches.length; x++) {
-    if (patches[x].length1 > this.Match_MaxBits) {
-      var bigpatch = patches[x];
-      // Remove the big old patch.
-      patches.splice(x--, 1);
-      var patch_size = this.Match_MaxBits;
-      var start1 = bigpatch.start1;
-      var start2 = bigpatch.start2;
-      var precontext = '';
-      while (bigpatch.diffs.length !== 0) {
-        // Create one of several smaller patches.
-        var patch = new patch_obj();
-        var empty = true;
-        patch.start1 = start1 - precontext.length;
-        patch.start2 = start2 - precontext.length;
-        if (precontext !== '') {
-          patch.length1 = patch.length2 = precontext.length;
-          patch.diffs.push([DIFF_EQUAL, precontext]);
-        }
-        while (bigpatch.diffs.length !== 0 &&
-               patch.length1 < patch_size - this.Patch_Margin) {
-          var diff_type = bigpatch.diffs[0][0];
-          var diff_text = bigpatch.diffs[0][1];
-          if (diff_type === DIFF_INSERT) {
-            // Insertions are harmless.
-            patch.length2 += diff_text.length;
-            start2 += diff_text.length;
-            patch.diffs.push(bigpatch.diffs.shift());
-            empty = false;
-          } else {
-            // Deletion or equality.  Only take as much as we can stomach.
-            diff_text = diff_text.substring(0, patch_size - patch.length1 -
-                                               this.Patch_Margin);
-            patch.length1 += diff_text.length;
-            start1 += diff_text.length;
-            if (diff_type === DIFF_EQUAL) {
-              patch.length2 += diff_text.length;
-              start2 += diff_text.length;
-            } else {
-              empty = false;
-            }
-            patch.diffs.push([diff_type, diff_text]);
-            if (diff_text == bigpatch.diffs[0][1]) {
-              bigpatch.diffs.shift();
-            } else {
-              bigpatch.diffs[0][1] =
-                  bigpatch.diffs[0][1].substring(diff_text.length);
-            }
-          }
-        }
-        // Compute the head context for the next patch.
-        precontext = this.diff_text2(patch.diffs);
-        precontext =
-            precontext.substring(precontext.length - this.Patch_Margin);
-        // Append the end context for this patch.
-        var postcontext = this.diff_text1(bigpatch.diffs)
-                              .substring(0, this.Patch_Margin);
-        if (postcontext !== '') {
-          patch.length1 += postcontext.length;
-          patch.length2 += postcontext.length;
-          if (patch.diffs.length !== 0 &&
-              patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL) {
-            patch.diffs[patch.diffs.length - 1][1] += postcontext;
-          } else {
-            patch.diffs.push([DIFF_EQUAL, postcontext]);
-          }
-        }
-        if (!empty) {
-          patches.splice(++x, 0, patch);
-        }
-      }
-    }
-  }
-};
-
-
-/**
- * Take a list of patches and return a textual representation.
- * @param {Array.<patch_obj>} patches Array of patch objects.
- * @return {string} Text representation of patches.
- */
-diff_match_patch.prototype.patch_toText = function(patches) {
-  var text = [];
-  for (var x = 0; x < patches.length; x++) {
-    text[x] = patches[x];
-  }
-  return text.join('');
-};
-
-
-/**
- * Parse a textual representation of patches and return a list of patch objects.
- * @param {string} textline Text representation of patches.
- * @return {Array.<patch_obj>} Array of patch objects.
- * @throws {Error} If invalid input.
- */
-diff_match_patch.prototype.patch_fromText = function(textline) {
-  var patches = [];
-  if (!textline) {
-    return patches;
-  }
-  // Opera doesn't know how to decode char 0.
-  textline = textline.replace(/%00/g, '\0');
-  var text = textline.split('\n');
-  var textPointer = 0;
-  while (textPointer < text.length) {
-    var m = text[textPointer].match(/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/);
-    if (!m) {
-      throw new Error('Invalid patch string: ' + text[textPointer]);
-    }
-    var patch = new patch_obj();
-    patches.push(patch);
-    patch.start1 = parseInt(m[1], 10);
-    if (m[2] === '') {
-      patch.start1--;
-      patch.length1 = 1;
-    } else if (m[2] == '0') {
-      patch.length1 = 0;
-    } else {
-      patch.start1--;
-      patch.length1 = parseInt(m[2], 10);
-    }
-
-    patch.start2 = parseInt(m[3], 10);
-    if (m[4] === '') {
-      patch.start2--;
-      patch.length2 = 1;
-    } else if (m[4] == '0') {
-      patch.length2 = 0;
-    } else {
-      patch.start2--;
-      patch.length2 = parseInt(m[4], 10);
-    }
-    textPointer++;
-
-    while (textPointer < text.length) {
-      var sign = text[textPointer].charAt(0);
-      try {
-        var line = decodeURI(text[textPointer].substring(1));
-      } catch (ex) {
-        // Malformed URI sequence.
-        throw new Error('Illegal escape in patch_fromText: ' + line);
-      }
-      if (sign == '-') {
-        // Deletion.
-        patch.diffs.push([DIFF_DELETE, line]);
-      } else if (sign == '+') {
-        // Insertion.
-        patch.diffs.push([DIFF_INSERT, line]);
-      } else if (sign == ' ') {
-        // Minor equality.
-        patch.diffs.push([DIFF_EQUAL, line]);
-      } else if (sign == '@') {
-        // Start of next patch.
-        break;
-      } else if (sign === '') {
-        // Blank line?  Whatever.
-      } else {
-        // WTF?
-        throw new Error('Invalid patch mode "' + sign + '" in: ' + line);
-      }
-      textPointer++;
-    }
-  }
-  return patches;
-};
-
-
-/**
- * Class representing one patch operation.
- * @constructor
- */
-function patch_obj() {
-  this.diffs = [];
-  /** @type {number?} */
-  this.start1 = null;
-  /** @type {number?} */
-  this.start2 = null;
-  this.length1 = 0;
-  this.length2 = 0;
-}
-
-
-/**
- * Emmulate GNU diff's format.
- * Header: @@ -382,8 +481,9 @@
- * Indicies are printed as 1-based, not 0-based.
- * @return {string} The GNU diff string.
- */
-patch_obj.prototype.toString = function() {
-  var coords1, coords2;
-  if (this.length1 === 0) {
-    coords1 = this.start1 + ',0';
-  } else if (this.length1 == 1) {
-    coords1 = this.start1 + 1;
-  } else {
-    coords1 = (this.start1 + 1) + ',' + this.length1;
-  }
-  if (this.length2 === 0) {
-    coords2 = this.start2 + ',0';
-  } else if (this.length2 == 1) {
-    coords2 = this.start2 + 1;
-  } else {
-    coords2 = (this.start2 + 1) + ',' + this.length2;
-  }
-  var text = ['@@ -' + coords1 + ' +' + coords2 + ' @@\n'];
-  var op;
-  // Escape the body of the patch with %xx notation.
-  for (var x = 0; x < this.diffs.length; x++) {
-    switch (this.diffs[x][0]) {
-      case DIFF_INSERT:
-        op = '+';
-        break;
-      case DIFF_DELETE:
-        op = '-';
-        break;
-      case DIFF_EQUAL:
-        op = ' ';
-        break;
-    }
-    text[x + 1] = op + encodeURI(this.diffs[x][1]) + '\n';
-  }
-  // Opera doesn't know how to encode char 0.
-  return text.join('').replace(/\x00/g, '%00').replace(/%20/g, ' ');
-};
-
diff --git a/root/static/scripts/editDiff.js b/root/static/scripts/editDiff.js
deleted file mode 100644
index 1a38479..0000000
--- a/root/static/scripts/editDiff.js
+++ /dev/null
@@ -1,15 +0,0 @@
-$(function() {
-    $(".prev").each(function(i) {
-        $(".change:eq("+i+")").prev().html("<strong>Old:<br />New:<br />Diff:</strong>");
-        var dmp = new diff_match_patch();
-        var diffBefore = $(".prev:eq("+i+")").text();
-        var diffAfter = $(".new:eq("+i+")").text();
-        var diff = dmp.diff_main(diffBefore, diffAfter);
-        dmp.diff_cleanupSemantic(diff);
-        var diffHTML = dmp.diff_prettyHtml(diff);
-        $(".prev:eq("+i+")").parent().append("<br /><span>" + diffHTML + "</span>");
-    });
-    $(".change").removeClass("change");
-    $(".prev").removeClass("prev");
-    $(".new").removeClass("new");
-});
diff --git a/root/static/scripts/edit_work.js b/root/static/scripts/edit_work.js
deleted file mode 100644
index d498058..0000000
--- a/root/static/scripts/edit_work.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Copyright (C) 2009 Oliver Charles
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-(function ($) {
-    $(function() {
-        var acEditor = new MB.Control.ArtistCreditEditor($('#artist .artist-credit'));
-        acEditor.textDisplay.addClass('overlay');
-    });
-})($);
\ No newline at end of file
diff --git a/root/static/scripts/jquery/jquery.bgiframe.min.js b/root/static/scripts/jquery/jquery.bgiframe.min.js
deleted file mode 100644
index ef8679d..0000000
--- a/root/static/scripts/jquery/jquery.bgiframe.min.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
- * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
- * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
- *
- * $LastChangedDate: 2007-07-21 18:45:56 -0500 (Sat, 21 Jul 2007) $
- * $Rev: 2447 $
- *
- * Version 2.1.1
- */
-(function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+'style="display:block;position:absolute;z-index:-1;'+(s.opacity!==false?'filter:Alpha(Opacity=\'0\');':'')+'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+'"/>';return this.each(function(){if($('> iframe.bgiframe',this).length==0)this.insertBefore(document.createElement(html),this.firstChild);});}return this;};})(jQuery);
\ No newline at end of file
diff --git a/root/static/scripts/jquery/jquery.cookie.js b/root/static/scripts/jquery/jquery.cookie.js
deleted file mode 100644
index a80bfa2..0000000
--- a/root/static/scripts/jquery/jquery.cookie.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * Cookie plugin
- *
- * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- *
- */
-
-/**
- * Create a cookie with the given name and value and other optional parameters.
- *
- * @example $.cookie('the_cookie', 'the_value');
- * @desc Set the value of a cookie.
- * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
- * @desc Create a cookie with all available options.
- * @example $.cookie('the_cookie', 'the_value');
- * @desc Create a session cookie.
- * @example $.cookie('the_cookie', null);
- * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
- *       used when the cookie was set.
- *
- * @param String name The name of the cookie.
- * @param String value The value of the cookie.
- * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
- * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
- *                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
- *                             If set to null or omitted, the cookie will be a session cookie and will not be retained
- *                             when the the browser exits.
- * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
- * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
- * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
- *                        require a secure protocol (like HTTPS).
- * @type undefined
- *
- * @name $.cookie
- * @cat Plugins/Cookie
- * @author Klaus Hartl/klaus.hartl at stilbuero.de
- */
-
-/**
- * Get the value of a cookie with the given name.
- *
- * @example $.cookie('the_cookie');
- * @desc Get the value of a cookie.
- *
- * @param String name The name of the cookie.
- * @return The value of the cookie.
- * @type String
- *
- * @name $.cookie
- * @cat Plugins/Cookie
- * @author Klaus Hartl/klaus.hartl at stilbuero.de
- */
-jQuery.cookie = function(name, value, options) {
-    if (typeof value != 'undefined') { // name and value given, set cookie
-        options = options || {};
-        if (value === null) {
-            value = '';
-            options = $.extend({}, options); // clone object since it's unexpected behavior if the expired property were changed
-            options.expires = -1;
-        }
-        var expires = '';
-        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
-            var date;
-            if (typeof options.expires == 'number') {
-                date = new Date();
-                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
-            } else {
-                date = options.expires;
-            }
-            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
-        }
-        // NOTE Needed to parenthesize options.path and options.domain
-        // in the following expressions, otherwise they evaluate to undefined
-        // in the packed version for some reason...
-        var path = options.path ? '; path=' + (options.path) : '';
-        var domain = options.domain ? '; domain=' + (options.domain) : '';
-        var secure = options.secure ? '; secure' : '';
-        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
-    } else { // only name given, get cookie
-        var cookieValue = null;
-        if (document.cookie && document.cookie != '') {
-            var cookies = document.cookie.split(';');
-            for (var i = 0; i < cookies.length; i++) {
-                var cookie = jQuery.trim(cookies[i]);
-                // Does this cookie string begin with the name we want?
-                if (cookie.substring(0, name.length + 1) == (name + '=')) {
-                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
-                    break;
-                }
-            }
-        }
-        return cookieValue;
-    }
-};
\ No newline at end of file
diff --git a/root/static/scripts/jquery/jquery.dimensions.min.js b/root/static/scripts/jquery/jquery.dimensions.min.js
deleted file mode 100644
index 34c06de..0000000
--- a/root/static/scripts/jquery/jquery.dimensions.min.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Copyright (c) 2007 Paul Bakaus (paul.bakaus at googlemail.com) and Brandon Aaron (brandon.aaron at gmail.com || http://brandonaaron.net)
- * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
- * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
- *
- * $LastChangedDate: 2007-12-20 08:43:48 -0600 (Thu, 20 Dec 2007) $
- * $Rev: 4257 $
- *
- * Version: 1.2
- *
- * Requires: jQuery 1.2+
- */
-(function($){$.dimensions={version:'1.2'};$.each(['Height','Width'],function(i,name){$.fn['inner'+name]=function(){if(!this[0])return;var torl=name=='Height'?'Top':'Left',borr=name=='Height'?'Bottom':'Right';return this.is(':visible')?this[0]['client'+name]:num(this,name.toLowerCase())+num(this,'padding'+torl)+num(this,'padding'+borr);};$.fn['outer'+name]=function(options){if(!this[0])return;var torl=name=='Height'?'Top':'Left',borr=name=='Height'?'Bottom':'Right';options=$.extend({margin:false},options||{});var val=this.is(':visible')?this[0]['offset'+name]:num(this,name.toLowerCase())+num(this,'border'+torl+'Width')+num(this,'border'+borr+'Width')+num(this,'padding'+torl)+num(this,'padding'+borr);return val+(options.margin?(num(this,'margin'+torl)+num(this,'margin'+borr)):0);};});$.each(['Left','Top'],function(i,name){$.fn['scroll'+name]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(name=='Left'?val:$(window)['scrollLeft'](),name=='Top'?val:$(window)['scrollTop']()):this['scroll'+name]=val;}):this[0]==window||this[0]==document?self[(name=='Left'?'pageXOffset':'pageYOffset')]||$.boxModel&&document.documentElement['scroll'+name]||document.body['scroll'+name]:this[0]['scroll'+name];};});$.fn.extend({position:function(){var left=0,top=0,elem=this[0],offset,parentOffset,offsetParent,results;if(elem){offsetParent=this.offsetParent();offset=this.offset();parentOffset=offsetParent.offset();offset.top-=num(elem,'marginTop');offset.left-=num(elem,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&$.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return $(offsetParent);}});function num(el,prop){return parseInt($.curCSS(el.jquery?el[0]:el,prop,true))||0;};})(jQuery);
\ No newline at end of file
diff --git a/root/static/scripts/jquery/jquery.impromptu.js b/root/static/scripts/jquery/jquery.impromptu.js
deleted file mode 100644
index 1347a32..0000000
--- a/root/static/scripts/jquery/jquery.impromptu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * jQuery Impromptu
- * By: Trent Richardson [http://trentrichardson.com]
- * Version 2.5
- * Last Modified: 3/30/2009
- * 
- * Copyright 2009 Trent Richardson
- * Dual licensed under the MIT and GPL licenses.
- * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt
- * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt
- * 
- */
-(function($){$.prompt=function(message,options){options=$.extend({},$.prompt.defaults,options);$.prompt.currentPrefix=options.prefix;var ie6=($.browser.msie&&$.browser.version<7);var $body=$(document.body);var $window=$(window);var msgbox='<div class="'+options.prefix+'box" id="'+options.prefix+'box">';if(options.useiframe&&(($('object, applet').length>0)||ie6)){msgbox+='<iframe src="javascript:;" class="'+options.prefix+'fade" id="'+options.prefix+'fade"></iframe>';}else{if(ie6){$('select').css('visibility','hidden');}msgbox+='<div class="'+options.prefix+'fade" id="'+options.prefix+'fade"></div>';}msgbox+='<div class="'+options.prefix+'" id="'+options.prefix+'"><div class="'+options.prefix+'container"><div class="';msgbox+=options.prefix+'close">X</div><div id="'+options.prefix+'states"></div>';msgbox+='</div></div></div>';var $jqib=$(msgbox).appendTo($body);var $jqi=$jqib.children('#'+options.prefix);var $jqif=$jqib.children('#'+options.prefix+'fade');if(message.constructor==String){message={state0:{html:message,buttons:options.buttons,focus:options.focus,submit:options.submit}};}var states="";$.each(message,function(statename,stateobj){stateobj=$.extend({},$.prompt.defaults.state,stateobj);message[statename]=stateobj;states+='<div id="'+options.prefix+'_state_'+statename+'" class="'+options.prefix+'_state" style="display:none;"><div class="'+options.prefix+'message">'+stateobj.html+'</div><div class="'+options.prefix+'buttons">';$.each(stateobj.buttons,function(k,v){states+='<button name="'+options.prefix+'_'+statename+'_button'+k+'" id="'+options.prefix+'_'+statename+'_button'+k+'" value="'+v+'">'+k+'</button>';});states+='</div></div>';});$jqi.find('#'+options.prefix+'states').html(states).children('.'+options.prefix+'_state:first').css('display','block');$jqi.find('.'+options.prefix+'buttons:empty').css('display','none');$.each(message,function(statename,stateobj){var $state=$jqi.find('#'+options.prefix+'_state_'+statename);$state.children('.'+options.prefix+'buttons').children('button').click(function(){var msg=$state.children('.'+options.prefix+'message');var clicked=stateobj.buttons[$(this).text()];var forminputs={};$.each($jqi.find('#'+options.prefix+'states :input').serializeArray(),function(i,obj){if(forminputs[obj.name]===undefined){forminputs[obj.name]=obj.value;}else if(typeof forminputs[obj.name]==Array){forminputs[obj.name].push(obj.value);}else{forminputs[obj.name]=[forminputs[obj.name],obj.value];}});var close=stateobj.submit(clicked,msg,forminputs);if(close===undefined||close){removePrompt(true,clicked,msg,forminputs);}});$state.find('.'+options.prefix+'buttons button:eq('+stateobj.focus+')').addClass(options.prefix+'defaultbutton');});var ie6scroll=function(){$jqib.css({top:$window.scrollTop()});};var fadeClicked=function(){if(options.persistent){var i=0;$jqib.addClass(options.prefix+'warning');var intervalid=setInterval(function(){$jqib.toggleClass(options.prefix+'warning');if(i++>1){clearInterval(intervalid);$jqib.removeClass(options.prefix+'warning');}},100);}else{removePrompt();}};var escapeKeyClosePrompt=function(e){var key=(window.event)?event.keyCode:e.keyCode;if(key==27){removePrompt();}};var positionPrompt=function(){$jqib.css({position:(ie6)?"absolute":"fixed",height:$window.height(),width:"100%",top:(ie6)?$window.scrollTop():0,left:0,right:0,bottom:0});$jqif.css({position:"absolute",height:$window.height(),width:"100%",top:0,left:0,right:0,bottom:0});$jqi.css({position:"absolute",top:options.top,left:"50%",marginLeft:(($jqi.outerWidth()/2)*-1)});};var stylePrompt=function(){$jqif.css({zIndex:options.zIndex,display:"none",opacity:options.opacity});$jqi.css({zIndex:options.zIndex+1,display:"none"});$jqib.css({zIndex:options.zIndex});};var removePrompt=function(callCallback,clicked,msg,formvals){$jqi.remove();if(ie6){$body.unbind('scroll',ie6scroll);}$window.unbind('resize',positionPrompt);$jqif.fadeOut(options.overlayspeed,function(){$jqif.unbind('click',fadeClicked);$jqif.remove();if(callCallback){options.callback(clicked,msg,formvals);}$jqib.unbind('keypress',escapeKeyClosePrompt);$jqib.remove();if(ie6&&!options.useiframe){$('select').css('visibility','visible');}});};positionPrompt();stylePrompt();if(ie6){$window.scroll(ie6scroll);}$jqif.click(fadeClicked);$window.resize(positionPrompt);$jqib.keypress(escapeKeyClosePrompt);$jqi.find('.'+options.prefix+'close').click(removePrompt);$jqif.fadeIn(options.overlayspeed);$jqi[options.show](options.promptspeed,options.loaded);$jqi.find('#'+options.prefix+'states .'+options.prefix+'_state:first .'+options.prefix+'defaultbutton').focus();return $jqib;};$.prompt.defaults={prefix:'jqi',buttons:{Ok:true},loaded:function(){},submit:function(){return true;},callback:function(){},opacity:0.6,zIndex:999,overlayspeed:'slow',promptspeed:'fast',show:'fadeIn',focus:0,useiframe:false,top:"15%",persistent:true,state:{html:'',buttons:{Ok:true},focus:0,submit:function(){return true;}}};$.prompt.currentPrefix=$.prompt.defaults.prefix;$.prompt.setDefaults=function(o){$.prompt.defaults=$.extend({},$.prompt.defaults,o);};$.prompt.setStateDefaults=function(o){$.prompt.defaults.state=$.extend({},$.prompt.defaults.state,o);};$.prompt.getStateContent=function(state){return $('#'+$.prompt.currentPrefix+'_state_'+state);};$.prompt.goToState=function(state){$('.'+$.prompt.currentPrefix+'_state').slideUp('slow');$('#'+$.prompt.currentPrefix+'_state_'+state).slideDown('slow',function(){$(this).find('.'+$.prompt.currentPrefix+'defaultbutton').focus();});};$.prompt.nextState=function(){var $next=$('.'+$.prompt.currentPrefix+'_state:visible').next();$('.'+$.prompt.currentPrefix+'_state').slideUp('slow');$next.slideDown('slow',function(){$next.find('.'+$.prompt.currentPrefix+'defaultbutton').focus();});};$.prompt.prevState=function(){var $next=$('.'+$.prompt.currentPrefix+'_state:visible').prev();$('.'+$.prompt.currentPrefix+'_state').slideUp('slow');$next.slideDown('slow',function(){$next.find('.'+$.prompt.currentPrefix+'defaultbutton').focus();});};$.prompt.close=function(){$('#'+$.prompt.currentPrefix+'box').fadeOut('fast',function(){$(this).remove();});};})(jQuery);
-
diff --git a/root/static/scripts/jquery/jquery.inputHintBox.js b/root/static/scripts/jquery/jquery.inputHintBox.js
deleted file mode 100644
index e484af9..0000000
--- a/root/static/scripts/jquery/jquery.inputHintBox.js
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Input Floating Hint Box - jQuery plugin 1.1 Beta
- *
- * Copyright (c) 2008 Nicolae Namolovan (nicolae.namolovan gmail.com)
- *
- * Dual licensed under the MIT and GPL licenses:
- *   http://www.opensource.org/licenses/mit-license.php
- *   http://www.gnu.org/licenses/gpl.html
- *
- * Revision: 20
- *
- */
- /**
-  * Home page http://nicolae.namolovan.googlepages.com/jquery.inputHintBox.html
-  * Demo http://nicolae.namolovan.googlepages.com/jquery.inputHintBox.demo.html
-  **/
-
-/**
- * Provide an automatic box hint in the right side of a input when user click it, it disapear when focus change (blur)
- *
- * Depends on dimensions plugin's offset method for correct positioning of the hint box element
- *
- * The source(@source) of the text/html can be an attribute (title for example), or a pure html.
- * Attribute can contain escaped html, example: title="This will be &lt;b&gt;Bold&lt;/b&gt;"
- *
- * All hints can use one div element(@div option) with your custom design, and only some subelement of 
- * this @div will change (according to source).
- *
- * You can provide only the @className, and for each input a separate <div> element will be created
- * with @className as class.
- *
- * If user click on the box to select some text (for copy/paste for example), box will not disappear.
- *
- * If you need to make the box appear in more left, use incrementLeft, same for top - incrementTop,
- * you can use - sign if you want to decrement.
- **/
-
-/**
- * Example, you have a shiny div and you want to use it as a Shell for hint messages
- * <div id="shiny_box">
- *     <span id="round-tleft"><span id="round-tright">
- *    <div class="shiny_box_body"></div>
- *     <span id="round-bleft"><span id="round-bright">
- * </div>
- *
- * You have a inputs like:
- * <input name="username" type="text" class="titleHintBox" title="Only letters &lt;b&gt;(a-z)&lt;/b&gt;, numbers (0-9), and periods (.) are allowed">
- * <input name="password" type="text" class="titleHintBox" title="Minimum of 8 characters in length">
- *
- * Here is an example of js to use:
- * $('.titleHintBox').inputHintBox({div:$('#shiny_box'),div_sub:'.shiny_box_body',source:'attr',attr:'title',incrementLeft:12,incrementTop:-12});
- **/
-
-/**
- * Provide a hint box near input as a absolute positioned div.
- * @name InputHintBox
- * @cat Plugins/Forms
- * @type $
- * @param Map options Optional settings
- * @option jQueryDom @div box to show, if this is set then className do not apply
- * @option String @div_sub css selector, use this when you need to write the Dynamic html into a element Inside the @div box,
-                                                example: .body, this will search for .body in context of @div
- * @option String @className This class will be added to the dynamic created div box. Default: "input_hint_box"
- * @option String @source Source of box message text html: attr | html, Default: "attr"
- * @option String @attr If @source = "attr" then html will be taken from the attribute named @attr. Default: "title"
- * @option String @html If @source = "html" them html will be taken from @html
- * @option Integer @incrementLeft This value will be incremented to the left property of the absolute positioned hint box. Default: 10
- * @option Integer @incrementTop This value will be incremented to the top property of the absolute positioned hint box. Default: 10
- * @option String @attachTo Hint box will be appended to this. Default: "body"
- */
-
-(function($) {
-$.fn.inputHintBox = function(options) {
-    options = $.extend({}, $.inputHintBoxer.defaults, options);
-    
-    this.each(function(){
-        new $.inputHintBoxer(this,options);
-    });
-    return this;
-}
-
-$.inputHintBoxer = function(input, options) {
-    var $guideObject,$input = $guideObject = $(input), box, boxMouseDown = false;
-    
-    //$guideObject - in left of this object hint box will be positioned
-    
-    // If @type=radio then it must be inside a label and we should put the hint box in the right side of the label
-    if ( ($input.attr('type') == 'radio' || $input.attr('type') == 'checkbox') && $input.parent().is('label') ) {
-        $guideObject = $( $input.parent() );
-    }
-    
-
-    function init() {
-        var boxHtml = options.html != ''?options.html:
-                                        options.source == 'attr'?$input.attr(options.attr): '';
-                
-        if (typeof boxHtml === "undefined") boxHtml = '';
-        box = options.div != '' ? options.div.clone() : $("<div/>").addClass(options.className);
-        box = box.css('display','none').attr("id", options.id).addClass('_hintBox').appendTo(options.attachTo);
-        
-        if (options.div_sub == '') box.html(boxHtml);
-        else $(options.div_sub,box).html(boxHtml);
-        
-        $input.focus(function() {
-                $('body').mousedown(global_mousedown_listener);
-                show();
-        }).blur(function(){
-                prepare_hide();
-        });
-    }
-    
-    // This is evaluated each time to prevent probs with elements with display none
-    function align() {
-        var offsets = $guideObject.position(),
-                left = offsets.left + $guideObject.width() + options.incrementLeft + 5 + ($.browser.safari?5:($.browser.msie?10:($.browser.mozilla?6:0))),
-                top = offsets.top + options.incrementTop + ($.browser.msie?14:($.browser.mozilla?8:0));
-        box.css({position:"absolute",top:top,left:left});
-    }
-    
-    function show() {
-        align();
-        box.fadeIn('fast');
-    }
-    
-    function prepare_hide() {
-        // We want to allow user to select and copy/paste content from the box
-        // So delay a bit to see where user click
-        $('body').click(global_click_listener);
-        if (boxMouseDown) return;
-        $.inputHintBoxer.mostRecentHideTimer = setTimeout(function(){hide()},300);
-    }
-    
-    var global_click_listener = function(e) {
-        var $e = $(e.target),c='._hintBox';
-        clearTimeout($.inputHintBoxer.mostRecentHideTimer);
-        if ($e.parents(c).length == 0 && $e.is(c) == false) hide();
-    };
-    
-    // Prevent hiding when selecting..
-    // When user Select a text to select, a Mousedown is fired BEFORE blur of input
-    // This why we need to know when a Mousedown is done to our object
-    var global_mousedown_listener = function(e) {
-        var $e = $(e.target),c='._hintBox';
-        boxMouseDown = ($e.parents(c).length != 0 || $e.is(c) != false);
-    }
-    
-    function hide() {
-        $('body').unbind('click',global_click_listener);
-        $('body').unbind('mousedown',global_mousedown_listener);
-        align();
-        box.fadeOut('fast');
-    }
-    
-    init();
-    return {}
-};
-
-$.inputHintBoxer.mostRecentHideTimer = 0;
-
-$.inputHintBoxer.defaults = {
-    div: '',
-    className: 'input_hint_box',
-    source: 'attr', // attr or html
-    div_sub: '', // Where to write
-    attr: 'title',
-    html: '',
-        id: '',
-    incrementLeft: 5,
-    incrementTop: 0,
-    attachTo: 'body'
-}
-
-})(jQuery);
diff --git a/root/static/scripts/jquery/jquery.jquery-ui.js b/root/static/scripts/jquery/jquery.jquery-ui.js
deleted file mode 100644
index 1b1d2d8..0000000
--- a/root/static/scripts/jquery/jquery.jquery-ui.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * jQuery UI 1.7.1
- *
- * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI
- */
jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.1",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/*
- * jQuery UI Tabs 1.7.1
- *
- * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Tabs
- *
- * Depends:
- *    ui.core.js
- */
(function(a){a.widget("ui.tabs",{_init:function(){if(this.options.deselectable!==undefined){this.options.collapsible=this.options.deselectable}this._tabify(true)},_setData:function(b,c){if(b=="selected"){if(this.options.collapsible&&c==this.options.selected){return}this.select(c)}else{this.options[b]=c;if(b=="deselectable"){this.options.collapsible=c}this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+a.data(b)},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+a.data(this.list[0]));return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(c,b){return{tab:c,panel:b,index:this.anchors.index(c)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(n){this.list=this.element.children("ul:first");this.lis=a("li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return a("a",this)[0]});this.panels=a([]);var p=this,d=this.options;var c=/^#.+/;this.anchors.each(function(r,o){var q=a(o).attr("href");var s=q.split("#")[0],u;if(s&&(s===location.toString().split("#")[0]||(u=a("base")[0])&&s===u.href)){q=o.hash;o.href=q}if(c.test(q)){p.panels=p.panels.add(p._sanitizeSelector(q))}else{if(q!="#"){a.data(o,"href.tabs",q);a.data(o,"load.tabs",q.replace(/#.*$/,""));var w=p._tabId(o);o.href="#"+w;var v=a("#"+w);if(!v.length){v=a(d.panelTemplate).attr("id",w).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(p.panels[r-1]||p.list);v.data("destroy.tabs",true)}p.panels=p.panels.add(v)}else{d.disabled.push(r)}}});if(n){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(d.selected===undefined){if(location.hash){this.anchors.each(function(q,o){if(o.hash==location.hash){d.selected=q;return false}})}if(typeof d.selected!="number"&&d.cookie){d.selected=parseInt(p._cookie(),10)}if(typeof d.selected!="number"&&this.lis.filter(".ui-tabs-selected").length){d.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}d.selected=d.selected||0}else{if(d.selected===null){d.selected=-1}}d.selected=((d.selected>=0&&this.anchors[d.selected])||d.selected<0)?d.selected:0;d.disabled=a.unique(d.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(q,o){return p.lis.index(q)}))).sort();if(a.inArray(d.selected,d.disabled)!=-1){d.disabled.splice(a.inArray(d.selected,d.disabled),1)}this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");if(d.selected>=0&&this.anchors.length){this.panels.eq(d.selected).removeClass("ui-tabs-hide");this.lis.eq(d.selected).addClass("ui-tabs-selected ui-state-active");p.element.queue("tabs",function(){p._trigger("show",null,p._ui(p.anchors[d.selected],p.panels[d.selected]))});this.load(d.selected)}a(window).bind("unload",function(){p.lis.add(p.anchors).unbind(".tabs");p.lis=p.anchors=p.panels=null})}else{d.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}this.element[d.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");if(d.cookie){this._cookie(d.selected,d.cookie)}for(var g=0,m;(m=this.lis[g]);g++){a(m)[a.inArray(g,d.disabled)!=-1&&!a(m).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled")}if(d.cache===false){this.anchors.removeData("cache.tabs")}this.lis.add(this.anchors).unbind(".tabs");if(d.event!="mouseover"){var f=function(o,i){if(i.is(":not(.ui-state-disabled)")){i.addClass("ui-state-"+o)}};var j=function(o,i){i.removeClass("ui-state-"+o)};this.lis.bind("mouseover.tabs",function(){f("hover",a(this))});this.lis.bind("mouseout.tabs",function(){j("hover",a(this))});this.anchors.bind("focus.tabs",function(){f("focus",a(this).closest("li"))});this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var b,h;if(d.fx){if(a.isArray(d.fx)){b=d.fx[0];h=d.fx[1]}else{b=h=d.fx}}function e(i,o){i.css({display:""});if(a.browser.msie&&o.opacity){i[0].style.removeAttribute("filter")}}var k=h?function(i,o){a(i).closest("li").removeClass("ui-state-default").addClass("ui-tabs-selected ui-state-active");o.hide().removeClass("ui-tabs-hide").animate(h,h.duration||"normal",function(){e(o,h);p._trigger("show",null,p._ui(i,o[0]))})}:function(i,o){a(i).closest("li").removeClass("ui-state-default").addClass("ui-tabs-selected ui-state-active");o.removeClass("ui-tabs-hide");p._trigger("show",null,p._ui(i,o[0]))};var l=b?function(o,i){i.animate(b,b.duration||"normal",function(){p.lis.removeClass("ui-tabs-selected ui-state-active").addClass("ui-state-default");i.addClass("ui-tabs-hide");e(i,b);p.element.dequeue("tabs")})}:function(o,i,q){p.lis.removeClass("ui-tabs-selected ui-state-active").addClass("ui-state-default");i.addClass("ui-tabs-hide");p.element.dequeue("tabs")};this.anchors.bind(d.event+".tabs",function(){var o=this,r=a(this).closest("li"),i=p.panels.filter(":not(.ui-tabs-hide)"),q=a(p._sanitizeSelector(this.hash));if((r.hasClass("ui-tabs-selected")&&!d.collapsible)||r.hasClass("ui-state-disabled")||r.hasClass("ui-state-processing")||p._trigger("select",null,p._ui(this,q[0]))===false){this.blur();return false}d.selected=p.anchors.index(this);p.abort();if(d.collapsible){if(r.hasClass("ui-tabs-selected")){d.selected=-1;if(d.cookie){p._cookie(d.selected,d.cookie)}p.element.queue("tabs",function(){l(o,i)}).dequeue("tabs");this.blur();return false}else{if(!i.length){if(d.cookie){p._cookie(d.selected,d.cookie)}p.element.queue("tabs",function(){k(o,q)});p.load(p.anchors.index(this));this.blur();return false}}}if(d.cookie){p._cookie(d.selected,d.cookie)}if(q.length){if(i.length){p.element.queue("tabs",function(){l(o,i)})}p.element.queue("tabs",function(){k(o,q)});p.load(p.anchors.index(this))}else{throw"jQuery UI Tabs: Mismatching fragment identifier."}if(a.browser.msie){this.blur()}});this.anchors.bind("click.tabs",function(){return false})},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var c=a.data(this,"href.tabs");if(c){this.href=c}var d=a(this).unbind(".tabs");a.each(["href","load","cache"],function(e,f){d.removeData(f+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){if(a.data(this,"destroy.tabs")){a(this).remove()}else{a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}});if(b.cookie){this._cookie(null,b.cookie)}},add:function(e,d,c){if(c===undefined){c=this.anchors.length}var b=this,g=this.options,i=a(g.tabTemplate.replace(/#\{href\}/g,e).replace(/#\{label\}/g,d)),h=!e.indexOf("#")?e.replace("#",""):this._tabId(a("a",i)[0]);i.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var f=a("#"+h);if(!f.length){f=a(g.panelTemplate).attr("id",h).data("destroy.tabs",true)}f.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(c>=this.lis.length){i.appendTo(this.list);f.appendTo(this.list[0].parentNode)}else{i.insertBefore(this.lis[c]);f.insertBefore(this.panels[c])}g.disabled=a.map(g.disabled,function(k,j){return k>=c?++k:k});this._tabify();if(this.anchors.length==1){i.addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){b._trigger("show",null,b._ui(b.anchors[0],b.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[c],this.panels[c]))},remove:function(b){var d=this.options,e=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();if(e.hasClass("ui-tabs-selected")&&this.anchors.length>1){this.select(b+(b+1<this.anchors.length?1:-1))}d.disabled=a.map(a.grep(d.disabled,function(g,f){return g!=b}),function(g,f){return g>=b?--g:g});this._tabify();this._trigger("remove",null,this._ui(e.find("a")[0],c[0]))},enable:function(b){var c=this.options;if(a.inArray(b,c.disabled)==-1){return}this.lis.eq(b).removeClass("ui-state-disabled");c.disabled=a.grep(c.disabled,function(e,d){return e!=b});this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b]))},disable:function(c){var b=this,d=this.options;if(c!=d.selected){this.lis.eq(c).addClass("ui-state-disabled");d.disabled.push(c);d.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[c],this.panels[c]))}},select:function(b){if(typeof b=="string"){b=this.anchors.index(this.anchors.filter("[href$="+b+"]"))}else{if(b===null){b=-1}}if(b==-1&&this.options.collapsible){b=this.options.selected}this.anchors.eq(b).trigger(this.options.event+".tabs")},load:function(e){var c=this,g=this.options,b=this.anchors.eq(e)[0],d=a.data(b,"load.tabs");this.abort();if(!d||this.element.queue("tabs").length!==0&&a.data(b,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(e).addClass("ui-state-processing");if(g.spinner){var f=a("span",b);f.data("label.tabs",f.html()).html(g.spinner)}this.xhr=a.ajax(a.extend({},g.ajaxOptions,{url:d,success:function(i,h){a(c._sanitizeSelector(b.hash)).html(i);c._cleanup();if(g.cache){a.data(b,"cache.tabs",true)}c._trigger("load",null,c._ui(c.anchors[e],c.panels[e]));try{g.ajaxOptions.success(i,h)}catch(j){}c.element.dequeue("tabs")}}))},abort:function(){this.element.queue([]);this.panels.stop(false,true);if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup()},url:function(c,b){this.anchors.eq(c).removeData("cache.tabs").data("load.tabs",b)},length:function(){return this.anchors.length}});a.extend(a.ui.tabs,{version:"1.7.1",getter:"length",defaults:{ajaxOptions:null,cache:false,cookie:null,collapsible:false,disabled:[],event:"click",fx:null,idPrefix:"ui-tabs-",panelTemplate:"<div></div>",spinner:"<em>Loading&#8230;</em>",tabTemplate:'<li><a href="#{href}"><span>#{label}</span></a></li>'}});a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(d,f){var b=this,g=this.options;var c=b._rotate||(b._rotate=function(h){clearTimeout(b.rotation);b.rotation=setTimeout(function(){var i=g.selected;b.select(++i<b.anchors.length?i:0)},d);if(h){h.stopPropagation()}});var e=b._unrotate||(b._unrotate=!f?function(h){if(h.clientX){b.rotate(null)}}:function(h){t=g.selected;c()});if(d){this.element.bind("tabsshow",c);this.anchors.bind(g.event+".tabs",e);c()}else{clearTimeout(b.rotation);this.element.unbind("tabsshow",c);this.anchors.unbind(g.event+".tabs",e);delete this._rotate;delete this._unrotate}}})})(jQuery);;/*
- * jQuery UI Progressbar 1.7.1
- *
- * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Progressbar
- *
- * Depends:
- *   ui.core.js
- */
(function(a){a.widget("ui.progressbar",{_init:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this._valueMin(),"aria-valuemax":this._valueMax(),"aria-valuenow":this._value()});this.valueDiv=a('<div class="ui-progressbar-value ui-widget-header ui-corner-left"></div>').appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow").removeData("progressbar").unbind(".progressbar");this.valueDiv.remove();a.widget.prototype.destroy.apply(this,arguments)},value:function(b){arguments.length&&this._setData("value",b);return this._value()},_setData:function(b,c){switch(b){case"value":this.options.value=c;this._refreshValue();this._trigger("change",null,{});break}a.widget.prototype._setData.apply(this,arguments)},_value:function(){var b=this.options.value;if(b<this._valueMin()){b=this._valueMin()}if(b>this._valueMax()){b=this._valueMax()}return b},_valueMin:function(){var b=0;return b},_valueMax:function(){var b=100;return b},_refreshValue:function(){var b=this.value();this.valueDiv[b==this._valueMax()?"addClass":"removeClass"]("ui-corner-right");this.valueDiv.width(b+"%");this.element.attr("aria-valuenow",b)}});a.extend(a.ui.progressbar,{version:"1.7.1",defaults:{value:0}})})(jQuery);;
diff --git a/root/static/scripts/jquery/jquery.outerHTML.js b/root/static/scripts/jquery/jquery.outerHTML.js
deleted file mode 100644
index cf0a911..0000000
--- a/root/static/scripts/jquery/jquery.outerHTML.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/** 
- * Based on outerHTML functions from http://brandonaaron.net/blog/2007/06/17/jquery-snippets-outerhtml
- * Originally by Brandon Aaron, with multi-document support added by Brian Grinstead, 
- * and a <script> workaround for http://dev.jquery.com/ticket/4801 from Al.
- */
-
-// Note that element tags will be returned however the browser gives them; this means divs will be XHTML-standards
-// compliant on Firefox ("<div>"), but non-compliant on Opera or IE ("<DIV>").
-
-$.fn.outerHTML = function (s) {
-    if (this.find("script").length === 0) {
-        var doc = this[0] ? this[0].ownerDocument : document;
-        return $('<div>', doc).append(this.eq(0).clone()).html();
-    } else {
-        var p = document.createElement('p');
-        var c = this.eq(0).clone();
-        p.appendChild(c[0]);
-        return (s) ? this.before(s).remove() : p.innerHTML;
-    }
-};
diff --git a/root/static/scripts/jquery/jquery.selectboxes.js b/root/static/scripts/jquery/jquery.selectboxes.js
deleted file mode 100755
index 5d782bd..0000000
--- a/root/static/scripts/jquery/jquery.selectboxes.js
+++ /dev/null
@@ -1,517 +0,0 @@
-/*jslint undef: true, browser: true*/
-/*global jQuery, $*/
-
-/*
- *
- * Copyright (c) 2006-2009 Sam Collett (http://www.texotela.co.uk)
- * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
- * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
- *
- * Version 2.2.4
- * Demo: http://www.texotela.co.uk/code/jquery/select/
- * Modified to include beta version of addOption(): http://www.texotela.co.uk/code/jquery/select/indexdev.php
- *
- * $LastChangedDate$
- * $Rev$
- *
- */
-
-(function ($) {
-
-    /**
- * Adds (single/multiple) options to a select box (or series of select boxes)
- *
- * @name     addOption
- * @author   Sam Collett (http://www.texotela.co.uk)
- * @type     jQuery
- * @example  $("#myselect").addOption("Value", "Text"); // add single value (will be selected)
- * @example  $("#myselect").addOption("Value 2", "Text 2", false); // add single value (won't be selected)
- * @example  $("#myselect").addOption({"foo":"bar","bar":"baz"}, false); // add multiple values, but don't select
- *
- * @example (beta) Use $("#myselect").addOption("Value", "Text Edit", false) to edit an existing entry with the value Value
- *
- */
-    $.fn.addOption = function () {
-        var add = function (el, v, t, sO) {
-            var option, newOption = true;
-            // create cache
-            if (!el.cache) {
-                el.cache = {};
-            }
-            // get options
-            var o = el.options,
-            // get number of options
-            oL = o.length;
-            // check if option already exists
-            for (var i = 0; i < oL; i++) {
-                // add to cache if not already there
-                if (!el.cache[o[i].value]) {
-                    el.cache[o[i].value] = i;
-                }
-                // if option with value already exists, set it to option variable
-                if (o[i].value == v) {
-                    option = o[i];
-                    newOption = false;
-                }
-            }
-            // if option does not already exist, create it
-            if (typeof option == "undefined") {
-                option = document.createElement("option");
-                option.value = v;
-            }
-            option.text = t;
-            // add to cache if it isn't already
-            if (typeof el.cache[v] == "undefined") {
-                el.cache[v] = oL;
-            }
-            // if it is a new, rather than edited option, add it
-            if (newOption) {
-                el.options[el.cache[v]] = option;
-            }
-            if (sO) {
-                option.selected = true;
-            }
-        };
-
-        var a = arguments;
-        if (a.length === 0) {
-            return this;
-        }
-        // select option when added? default is true
-        var sO = true,
-        // multiple items
-        m = false,
-        // other variables
-        items, v, t;
-        if (typeof(a[0]) == "object") {
-            m = true;
-            items = a[0];
-        }
-        if (a.length >= 2) {
-            if (typeof(a[1]) == "boolean") {
-                sO = a[1];
-            }
-            else if (typeof(a[2]) == "boolean") {
-                sO = a[2];
-            }
-            if (!m) {
-                v = a[0];
-                t = a[1];
-            }
-        }
-        this.each(
-        function () {
-            if (this.nodeName.toLowerCase() != "select") {
-                return;
-            }
-            if (m) {
-                for (var item in items) {
-                    add(this, item, items[item], sO);
-                }
-            }
-            else {
-                add(this, v, t, sO);
-            }
-        });
-        return this;
-    };
-    /**
- * Add options via ajax
- *
- * @name     ajaxAddOption
- * @author   Sam Collett (http://www.texotela.co.uk)
- * @type     jQuery
- * @param    String url      Page to get options from (must be valid JSON)
- * @param    Object params   (optional) Any parameters to send with the request
- * @param    Boolean select  (optional) Select the added options, default true
- * @param    Function fn     (optional) Call this function with the select object as param after completion
- * @param    Array args      (optional) Array with params to pass to the function afterwards
- * @example  $("#myselect").ajaxAddOption("myoptions.php");
- * @example  $("#myselect").ajaxAddOption("myoptions.php", {"code" : "007"});
- * @example  $("#myselect").ajaxAddOption("myoptions.php", {"code" : "007"}, false, sortoptions, [{"dir": "desc"}]);
- *
- */
-    $.fn.ajaxAddOption = function (url, params, select, fn, args) {
-        if (typeof(url) != "string") {
-            return this;
-        }
-        if (typeof(params) != "object") {
-            params = {};
-        }
-        if (typeof(select) != "boolean") {
-            select = true;
-        }
-        this.each(
-        function () {
-            var el = this;
-            $.getJSON(url, params, function (r) {
-                $(el).addOption(r, select);
-                if (typeof fn == "function") {
-                    if (typeof args == "object") {
-                        fn.apply(el, args);
-                    }
-                    else {
-                        fn.call(el);
-                    }
-                }
-            });
-        });
-        return this;
-    };
-
-    /**
- * Removes an option (by value or index) from a select box (or series of select boxes)
- *
- * @name     removeOption
- * @author   Sam Collett (http://www.texotela.co.uk)
- * @type     jQuery
- * @param    String|RegExp|Number what  Option to remove
- * @param    Boolean selectedOnly       (optional) Remove only if it has been selected (default false)   
- * @example  $("#myselect").removeOption("Value"); // remove by value
- * @example  $("#myselect").removeOption(/^val/i); // remove options with a value starting with 'val'
- * @example  $("#myselect").removeOption(/./); // remove all options
- * @example  $("#myselect").removeOption(/./, true); // remove all options that have been selected
- * @example  $("#myselect").removeOption(0); // remove by index
- * @example  $("#myselect").removeOption(["myselect_1","myselect_2"]); // values contained in passed array
- *
- */
-    $.fn.removeOption = function () {
-        var a = arguments;
-        if (a.length === 0) {
-            return this;
-        }
-        var ta = typeof(a[0]),
-        v,
-        index;
-        // has to be a string or regular expression (object in IE, function in Firefox)
-        if (ta == "string" || ta == "object" || ta == "function") {
-            v = a[0];
-            // if an array, remove items
-            if (v.constructor == Array) {
-                var l = v.length;
-                for (var i = 0; i < l; i++) {
-                    this.removeOption(v[i], a[1]);
-                }
-                return this;
-            }
-        }
-        else if (ta == "number") {
-            index = a[0];
-        }
-        else {
-            return this;
-        }
-        this.each(
-        function () {
-            if (this.nodeName.toLowerCase() != "select") {
-                return;
-            }
-            // clear cache
-            if (this.cache) {
-                this.cache = null;
-            }
-            // does the option need to be removed?
-            var remove = false,
-            // get options
-            o = this.options;
-            if ( !! v) {
-                // get number of options
-                var oL = o.length;
-                for (var i = oL - 1; i >= 0; i--) {
-                    if (v.constructor == RegExp) {
-                        if (o[i].value.match(v)) {
-                            remove = true;
-                        }
-                    }
-                    else if (o[i].value == v) {
-                        remove = true;
-                    }
-                    // if the option is only to be removed if selected
-                    if (remove && a[1] === true) {
-                        remove = o[i].selected;
-                    }
-                    if (remove) {
-                        o[i] = null;
-                    }
-                    remove = false;
-                }
-            }
-            else {
-                // only remove if selected?
-                if (a[1] === true) {
-                    remove = o[index].selected;
-                }
-                else {
-                    remove = true;
-                }
-                if (remove) {
-                    this.remove(index);
-                }
-            }
-        });
-        return this;
-    };
-
-    /**
- * Sort options (ascending or descending) in a select box (or series of select boxes)
- *
- * @name     sortOptions
- * @author   Sam Collett (http://www.texotela.co.uk)
- * @type     jQuery
- * @param    Boolean ascending   (optional) Sort ascending (true/undefined), or descending (false)
- * @example  // ascending
- * $("#myselect").sortOptions(); // or $("#myselect").sortOptions(true);
- * @example  // descending
- * $("#myselect").sortOptions(false);
- *
- */
-    $.fn.sortOptions = function (ascending) {
-        // get selected values first
-        var sel = $(this).selectedValues();
-        var a = typeof(ascending) == "undefined" ? true : !!ascending;
-        this.each(
-        function () {
-            if (this.nodeName.toLowerCase() != "select") {
-                return;
-            }
-            // get options
-            var o = this.options,
-            // get number of options
-            oL = o.length,
-            // create an array for sorting
-            sA = [];
-            // loop through options, adding to sort array
-            for (var i = 0; i < oL; i++) {
-                sA[i] = {
-                    v: o[i].value,
-                    t: o[i].text
-