Merge "LocalisationCache: Process one fallback at a time"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 4 Sep 2014 17:15:42 +0000 (17:15 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 4 Sep 2014 17:15:42 +0000 (17:15 +0000)
68 files changed:
RELEASE-NOTES-1.24
docs/hooks.txt
docs/kss/styleguide-template/index.html
docs/kss/styleguide-template/public/kss.less
includes/DefaultSettings.php
includes/MimeMagic.php
includes/installer/i18n/be-tarask.json
includes/installer/i18n/it.json
includes/installer/i18n/nap.json
includes/installer/i18n/ne.json
includes/jobqueue/JobRunner.php
includes/libs/CSSMin.php
includes/objectcache/MemcachedPeclBagOStuff.php
includes/parser/CoreParserFunctions.php
includes/skins/Skin.php
languages/i18n/be-tarask.json
languages/i18n/es.json
languages/i18n/fa.json
languages/i18n/ia.json
languages/i18n/it.json
languages/i18n/la.json
languages/i18n/nap.json
languages/i18n/ru.json
languages/i18n/sc.json
languages/i18n/sv.json
languages/i18n/tr.json
languages/i18n/zh-hans.json
mw-config/config.js
mw-config/images/installer-logo.png
resources/Resources.php
resources/lib/oojs-ui/oojs-ui-apex.css
resources/lib/oojs-ui/oojs-ui-minerva.css
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/oojs-ui.svg.css
resources/src/jquery/jquery.autoEllipsis.js
resources/src/jquery/jquery.byteLimit.js
resources/src/jquery/jquery.farbtastic.js
resources/src/jquery/jquery.hidpi.js
resources/src/jquery/jquery.mwExtension.js
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.language/languages/fi.js
resources/src/mediawiki.language/languages/he.js
resources/src/mediawiki.language/languages/hy.js
resources/src/mediawiki.language/languages/os.js
resources/src/mediawiki.language/languages/ru.js
resources/src/mediawiki.language/languages/uk.js
resources/src/mediawiki.language/mediawiki.language.js
resources/src/mediawiki.language/mediawiki.language.numbers.js
resources/src/mediawiki.legacy/upload.js
resources/src/mediawiki.skinning/content.css [new file with mode: 0644]
resources/src/mediawiki.skinning/elements.css [new file with mode: 0644]
resources/src/mediawiki.skinning/images/magnify-clip-ltr.png [new file with mode: 0644]
resources/src/mediawiki.skinning/images/magnify-clip-rtl.png [new file with mode: 0644]
resources/src/mediawiki.skinning/interface.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.search.js
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.debug.js
resources/src/mediawiki/mediawiki.debug.profile.js
resources/src/mediawiki/mediawiki.inspect.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.user.js
skins/common/commonContent.css [deleted file]
skins/common/commonElements.css [deleted file]
skins/common/commonInterface.css [deleted file]
skins/common/images/magnify-clip-ltr.png [deleted file]
tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js

index aea6ec5..2ac3710 100644 (file)
@@ -181,6 +181,8 @@ production.
 * API token handling has been rewritten. Any API module using tokens will need
   to be updated. See the entry below under "Action API internal changes".
 * Added HTMLAutoCompleteSelectField.
+* Added a new hook, "SkinPreloadExistence", to allow extensions to add titles to
+  link existence cache before the page is rendered.
 
 === Bug fixes in 1.24 ===
 * (bug 50572) MediaWiki:Blockip should support gender
@@ -353,6 +355,13 @@ changes to languages because of Bugzilla reports.
   the "headelement" template key are no longer supported. Setting
   $useHeadElement = false; is no longer supported and will not cause old keys
   like "headlinks", "skinnameclass", etc. to be defined.
+* BREAKING CHANGE: The files commonElements.css, commonContent.css and
+  commonInterface.css (in skins/common/) have been removed. Skins may no longer
+  rely on their presence and include them in their style modules. ResourceLoader
+  modules introduced in MediaWiki 1.23 should be loaded instead:
+  - skins/common/commonElements.css  → 'mediawiki.skinning.elements' module
+  - skins/common/commonContent.css   → 'mediawiki.skinning.content' module
+  - skins/common/commonInterface.css → 'mediawiki.skinning.interface' module
 * The deprecated 'SpecialVersionExtensionTypes' hook was removed.
 * (bug 63891) Add 'X-Robots-Tag: noindex' header in action=render pages.
 * SpecialPage no longer supports the syntax for invoking wfSpecial*() functions.
index 369b777..4f0882e 100644 (file)
@@ -2299,6 +2299,11 @@ $type: 'normal' or 'history' for old/diff views
 the MediaWiki icon but plain text instead.
 $skin: Skin object
 
+'SkinPreloadExistence': Supply titles that should be added to link existence
+cache before the page is rendered.
+&$titles: Array of Title objects
+$skin: Skin object
+
 'SkinSubPageSubtitle': At the beginning of Skin::subPageSubtitle().
 &$subpages: Subpage links HTML
 $skin: Skin object
index b6036b2..38f0dd1 100644 (file)
@@ -19,7 +19,7 @@
        </header>
 
        <div class="container">
-               <nav class="content">
+               <nav>
                        <ul>
                                <li><a href="index.html"><span>0.0</span> Overview</a></li>
                                {{#eachRoot}}
                        </ul>
                </nav>
 
-               <article>
+               <div class="content">
                        {{#if overview}}
                                {{html overview}}
                        {{else}}
                                {{#eachSection rootNumber}}
-                               <section>
+                               <div>
                                        {{#whenDepth 1}}
                                                <h1>{{ reference }}.0 {{ header }}</h1>
                                        {{else}}
                                                                {{html description}}
                                                        {{/if}}
                                        {{/ifAny}}
-                               </section>
+                               </div>
                                {{/eachSection}}
                        {{/if}}
-               </article>
+               </div>
        </div>
 </div></body>
 </html>
index f5ddff1..a1d62a3 100644 (file)
@@ -1,4 +1,3 @@
-
 .container {
        width: 100%;
 }
@@ -7,7 +6,7 @@ nav {
        display: none;
 }
 
-article {
+.content {
        .example {
                blockquote {
                        margin-top: 20px;
@@ -25,7 +24,8 @@ body {
        font-family: "Nimbus Sans L", "Liberation Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
 }
 
-.content.kss-no-margin {
+.kss-no-margin {
+       // FIXME: Is this being used anywhere? Remove if not.
        margin: 0;
 }
 
@@ -89,7 +89,7 @@ nav {
        }
 }
 
-article {
+.content {
        -webkit-flex: 1;
        flex: 1;
 
@@ -154,7 +154,7 @@ article {
                width: auto;
        }
 
-       article {
+       .content {
                margin-left: 30px;
        }
 
index f2042f9..26ce83c 100644 (file)
@@ -1156,7 +1156,7 @@ $wgMimeInfoFile = 'includes/mime.info';
  * Sets an external MIME detector program. The command must print only
  * the MIME type to standard output.
  * The name of the file to process will be appended to the command given here.
- * If not set or NULL, mime_content_type will be used if available.
+ * If not set or NULL, PHP's fileinfo extension will be used if available.
  *
  * @par Example:
  * @code
index 8f0a2af..656c1e0 100644 (file)
@@ -898,9 +898,9 @@ class MimeMagic {
        /**
         * Internal MIME type detection. Detection is done using an external
         * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo
-        * extension and mime_content_type are tried (in this order), if they
-        * are available. If the detections fails and $ext is not false, the MIME
-        * type is guessed from the file extension, using guessTypesForExtension.
+        * extension is tried if it is available. If detection fails and $ext
+        * is not false, the MIME type is guessed from the file extension,
+        * using guessTypesForExtension.
         *
         * If the MIME type is still unknown, getimagesize is used to detect the
         * MIME type if the file is an image. If no MIME type can be determined,
@@ -927,18 +927,7 @@ class MimeMagic {
                        $args = wfEscapeShellArg( $file );
                        $m = wfShellExec( "$wgMimeDetectorCommand $args" );
                } elseif ( function_exists( "finfo_open" ) && function_exists( "finfo_file" ) ) {
-
-                       # This required the fileinfo extension by PECL,
-                       # see http://pecl.php.net/package/fileinfo
-                       # This must be compiled into PHP
-                       #
-                       # finfo is the official replacement for the deprecated
-                       # mime_content_type function, see below.
-                       #
-                       # If you may need to load the fileinfo extension at runtime, set
-                       # $wgLoadFileinfoExtension in LocalSettings.php
-
-                       $mime_magic_resource = finfo_open( FILEINFO_MIME ); /* return MIME type ala mimetype extension */
+                       $mime_magic_resource = finfo_open( FILEINFO_MIME );
 
                        if ( $mime_magic_resource ) {
                                $m = finfo_file( $mime_magic_resource, $file );
@@ -946,21 +935,6 @@ class MimeMagic {
                        } else {
                                wfDebug( __METHOD__ . ": finfo_open failed on " . FILEINFO_MIME . "!\n" );
                        }
-               } elseif ( function_exists( "mime_content_type" ) ) {
-
-                       # NOTE: this function is available since PHP 4.3.0, but only if
-                       # PHP was compiled with --with-mime-magic or, before 4.3.2, with
-                       # --enable-mime-magic.
-                       #
-                       # On Windows, you must set mime_magic.magicfile in php.ini to point
-                       # to the mime.magic file bundled with PHP; sometimes, this may even
-                       # be needed under *nix.
-                       #
-                       # Also note that this has been DEPRECATED in favor of the fileinfo
-                       # extension by PECL, see above.
-                       # See http://www.php.net/manual/en/ref.mime-magic.php for details.
-
-                       $m = mime_content_type( $file );
                } else {
                        wfDebug( __METHOD__ . ": no magic mime detector found!\n" );
                }
index d7dbd2c..d02246a 100644 (file)
@@ -51,6 +51,7 @@
        "config-env-good": "Асяродзьдзе было праверанае.\nВы можаце ўсталёўваць MediaWiki.",
        "config-env-bad": "Асяродзьдзе было праверанае.\nУсталяваньне MediaWiki немагчымае.",
        "config-env-php": "Усталяваны PHP $1.",
+       "config-env-hhvm": "HHVM $1 усталяваная.",
        "config-unicode-using-utf8": "Выкарыстоўваецца бібліятэка Unicode-нармалізацыі Браяна Вібэра",
        "config-unicode-using-intl": "Выкарыстоўваецца [http://pecl.php.net/intl intl пашырэньне з PECL] для Unicode-нармалізацыі",
        "config-unicode-pure-php-warning": "'''Папярэджаньне''': [http://pecl.php.net/intl Пашырэньне intl з PECL] — ня слушнае для Unicode-нармалізацыі, цяпер выкарыстоўваецца марудная PHP-рэалізацыя.\nКалі ў Вас сайт з высокай наведваемасьцю, раім пачытаць пра [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-нармалізацыю].",
index faaf335..d1a8b5e 100644 (file)
@@ -63,6 +63,8 @@
        "config-no-db": "Impossibile trovare un driver adatto per il database! È necessario installare un driver per PHP.\nI seguenti formati di database sono supportati: $1.\n\nSe compili PHP autonomamente, riconfiguralo attivando un client database, per esempio utilizzando <code>./configure --with-mysqli</code>.\nQualora avessi installato PHP per mezzo di un pacchetto Debian o Ubuntu, allora devi installare anche il pacchetto <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attenzione''': è presente SQLite $1 mentre è richiesta la versione $2, SQLite non sarà disponibile.",
        "config-no-fts3": "'''Attenzione''': SQLite è compilato senza il [//sqlite.org/fts3.html modulo FTS3], le funzionalità di ricerca non saranno disponibili su questo backend.",
+       "config-register-globals-error": "<strong>Errore: l'opzione PHP <code>[http://php.net/register_globals register_globals]</code> è abilitata.\nDeve essere disabilitata per continuare con l'installazione.</strong>\nVedi [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] per un aiuto su come farlo.",
+       "config-magic-quotes-gpc": "<strong>Fatale: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] è attivo!</strong>\nQuesta opzione danneggia i dati di input in modo imprevedibile.\nNon puoi installare o utilizzare MediaWiki, a meno che questa opzione sia disabilitata.",
        "config-magic-quotes-runtime": "'''Errore: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] è attivato!''' Questa opzione interferisce in modo imprevedibile con l'inserimento dei dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
        "config-magic-quotes-sybase": "'''Errore: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] è attivato!''' Questa opzione interferisce in modo imprevedibile con l'inserimento dei dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
        "config-mbstring": "'''Errore: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] è attivato!''' Questa opzione causa errori e può interferire in modo imprevedibile coi dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.",
@@ -73,6 +75,7 @@
        "config-memory-raised": "Il valore <code>memory_limit</code> di PHP è $1, aumentato a $2.",
        "config-memory-bad": "''Attenzione:''' Il valore di <code>memory_limit</code> di PHP è $1.\nProbabilmente è troppo basso.\nL'installazione potrebbe non riuscire!",
        "config-ctype": "'''Errore''': PHP deve essere compilato con il supporto per l'[http://www.php.net/manual/it/ctype.installation.php estensione Ctype].",
+       "config-iconv": "<strong>Fatale:</strong> PHP deve essere compilato con il supporto per l'[http://www.php.net/manual/en/iconv.installation.php estensione iconv].",
        "config-json": "'''Errore:''' PHP è stato compilato senza il supporto per JSON. E' necessario installare l'estensione PHP per JSON o l'estensione [http://pecl.php.net/package/jsonc PECL jsonc] prima di installare MediaWiki.\n* L'estensione PHP è inclusa in Red Hat Enterprise Linux (CentOS) 5 e 6, ma deve essere abilitata in <code>/etc/php.ini</code> o <code>/etc/php.d/json.ini</code>.\n* Alcune distribuzioni di Linux pubblicate dopo il maggio 2013 omettono l'estensione PHP, e al posto utilizzano l'estensione PECL come <code>php5-json</code> o <code>php-pecl-jsonc</code>",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] è installato",
        "config-apc": "[http://www.php.net/apc APC] è installato",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki supporta i seguenti sistemi di database:\n\n$1\n\nSe fra quelli elencati qui sotto non vedi il sistema di database che vorresti utilizzare, seguire le istruzioni linkate sopra per abilitare il supporto.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] è la configurazione preferibile per MediaWiki ed è quella meglio supportata. MediaWiki funziona anche con [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], che sono compatibili con MySQL.([http://www.php.net/manual/en/mysqli.installation.php Come compilare PHP con supporto MySQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] è un popolare sistema di database open source come alternativa a MySQL. Ci possono essere alcuni bug minori in sospeso, e non è raccomandato per l'uso in un ambiente di produzione. ([http://www.php.net/manual/en/pgsql.installation.php Come compilare PHP con supporto PostgreSQL])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]  è un sistema di database leggero, che è supportato molto bene. ([http://www.php.net/manual/en/pdo.installation.php Come compilare PHP con supporto SQLite], utilizza PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] è un database di un'impresa commerciale. ([http://www.php.net/manual/en/oci8.installation.php Come compilare PHP con supporto OCI8])",
+       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] è un database di un'impresa commerciale per Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Come compilare PHP con supporto SQLSRV])",
        "config-header-mysql": "Impostazioni MySQL",
        "config-header-postgres": "Impostazioni PostgreSQL",
        "config-header-sqlite": "Impostazioni SQLite",
        "config-postgres-old": "PostgreSQL $1 o una versione successiva è necessaria, rilevata la $2.",
        "config-mssql-old": "Si richiede Microsoft SQL Server $1 o successivo. Tu hai la versione $2.",
        "config-sqlite-name-help": "Scegli un nome che identifichi il tuo wiki.\nNon utilizzare spazi o trattini.\nQuesto servirà per il nome del file di dati SQLite.",
+       "config-sqlite-parent-unwritable-group": "Non è possibile creare la directory dati <code><nowiki>$1</nowiki></code>, perché la directory superiore <code><nowiki>$2</nowiki></code> non è scrivibile dal webserver.\n\nIl programma di installazione ha determinato l'utente con cui il server web è in esecuzione.\nForniscigli la possibilità di scrivere nella directory <code><nowiki>$3</nowiki></code> per continuare.\nSu un sistema Unix/Linux:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "Non è possibile creare la directory dati <code><nowiki>$1</nowiki></code>, perché la directory superiore <code><nowiki>$2</nowiki></code> non è scrivibile dal webserver.\n\nIl programma di installazione non ha potuto determinare l'utente con cui il server web è in esecuzione.\nFornisci ad esso (ed altri!) la possibilità di scrivere globalmente nella directory <code><nowiki>$3</nowiki></code> per continuare.\nSu un sistema Unix/Linux:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-sqlite-mkdir-error": "Errore durante la creazione della directory dati \"$1\".\nControlla la posizione e riprova.",
        "config-sqlite-dir-unwritable": "Impossibile scrivere nella directory \"$1\".\nModifica le autorizzazioni in modo che il webserver possa scrivere in essa e riprova.",
        "config-sqlite-connection-error": "$1.\n\nControlla la directory dati e il nome del database qui sotto, poi riprova.",
        "config-ns-site-name": "Stesso nome del wiki: $1",
        "config-ns-other": "Altro (specificare)",
        "config-ns-other-default": "MyWiki",
+       "config-project-namespace-help": "Seguendo l'esempio di Wikipedia, molti wiki tengono le loro pagine con le regole separate dalle pagine di contenuto, in un \"'''namespace di progetto'''\".\nTutti i titoli delle pagine in questo namespace iniziano con un certo prefisso, che puoi indicare qui.\nSolitamente, questo prefisso deriva dal nome del wiki, ma non può contenere caratteri di punteggiatura come \"#\" o \":\".",
+       "config-ns-invalid": "Il namespace indicato \"<nowiki>$1</nowiki>\" non è valido.\nSpecificare un diverso namespace di progetto.",
+       "config-ns-conflict": "Il namespace indicato \"<nowiki>$1</nowiki>\" è in conflitto con un namespace predefinito MediaWiki.\nSpecificare un diverso namespace di progetto.",
        "config-admin-box": "Account amministratore",
        "config-admin-name": "Il tuo nome utente:",
        "config-admin-password": "Password:",
        "config-memcache-badport": "I numeri di porta per memcached dovrebbero essere tra $1 e $2.",
        "config-extensions": "Estensioni",
        "config-extensions-help": "Le estensioni elencate sopra sono state rilevate nella tua directory <code>./extensions</code>.\n\nQueste potrebbero richiedere ulteriore configurazione, ma è possibile attivarle ora",
+       "config-skins": "Skin",
+       "config-skins-help": "Le skin elencate sopra sono state rilevate nella tua directory <code>./skins</code>. Devi attivarne almeno una e scegliere quella predefinita.",
+       "config-skins-use-as-default": "Usa questa skin come predefinita",
+       "config-skins-missing": "Non è stata trovata alcuna skin, MediaWiki userà una soluzione di ripiego finché non ne installerai una appropriata.",
+       "config-skins-must-enable-some": "Devi scegliere almeno una skin da attivare.",
+       "config-skins-must-enable-default": "La skin scelta come predefinita deve essere attivata.",
        "config-install-alreadydone": "'''Attenzione:''' sembra che hai già installato MediaWiki e stai tentando di installarlo nuovamente.\nProcedi alla pagina successiva.",
        "config-install-begin": "Premendo \"{{int:config-continue}}\", si avvierà l'installazione di MediaWiki.\nSe prima desideri apportare altre modifiche, premi \"{{int:config-back}}\".",
        "config-install-step-done": "fatto",
        "config-install-stats": "Inizializzazione delle statistiche",
        "config-install-keys": "Generazione delle chiavi segrete",
        "config-insecure-keys": "'''Attenzione:''' {{PLURAL:$2|Una chiave sicura|Delle chiavi sicure}} ($1) {{PLURAL:$2|generata|generate}} durante l'installazione non {{PLURAL:$2|è|sono}} completamente {{PLURAL:$2|sicura|sicure}}. Considera di {{PLURAL:$2|cambiarla|cambiarle}} manualmente.",
+       "config-install-updates-failed": "<strong>Errore:</strong> l'inserimento delle chiavi di aggiornamento nelle tabelle non è riuscito con il seguente errore: $1",
        "config-install-sysop": "Creazione dell'account utente per l'amministratore",
        "config-install-subscribe-fail": "Impossibile sottoscrivere mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL non è installato e <code>allow_url_fopen</code> non è disponibile.",
index 0bfcbe8..1cbe7d5 100644 (file)
@@ -4,6 +4,13 @@
                        "C.R."
                ]
        },
+       "config-desc": "'O prugramma d'istallazione 'e MediaWiki",
+       "config-title": "Installazione 'e MediaWiki $1",
+       "config-information": "Nfurmaziune",
+       "config-localsettings-upgrade": "È stato rilevato nu file <code>LocalSettings.php</code>.\nP'agghiurnà sta installazione, pe' piacere nzertàte 'o valore 'e <code>$wgUpgradeKey</code> dint' 'a cascia ccà abbascio.\n'O putite truvà dint'a <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "È stato scummigliato nu file <code>LocalSettings.php</code>.\nPe l'agghiurnà sta installazione, secutate <code>update.php</code>",
+       "config-localsettings-key": "Chiave d'agghiurnamiento:",
+       "config-localsettings-badkey": "'A chiave c'avete dato nun è curretta.",
        "config-mssql-install-auth": "Sceglie 'o tipo d'autenticazziona ca s'ausarrà pe cunnettà â database, durante ll'operazziona d'istallazziona. Si piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate.",
        "config-mssql-web-auth": "Sceglie 'o tipo d'autenticazziona ca 'o web server pigliarrà pe se cunnettà a 'o server 'e bbase 'e dati, durante ll'operazziona nurmale d&#39;'a wiki.\nSi piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate."
 }
index b2d4a04..836e0fc 100644 (file)
@@ -4,9 +4,15 @@
                        "Bhawani Gautam",
                        "RajeshPandey",
                        "सरोज कुमार ढकाल",
-                       "Ganesh Paudel"
+                       "Ganesh Paudel",
+                       "बिप्लब आनन्द"
                ]
        },
+       "config-information": "जानकारी",
+       "config-localsettings-badkey": "तपाइले दिनु भएको कुन्जी गलत छ ।",
+       "config-your-language": "तपाईंको भाषा:",
+       "config-your-language-help": "इन्स्टल गर्दा उपयोग गर्ने भाषा छान्नुहोस् ।",
+       "config-wiki-language": "विकि भाषाहरू",
        "config-page-name": "नाम",
        "config-page-options": "विकल्पहरु",
        "config-page-install": "स्थापना गर्ने",
index 8462924..8a708f1 100644 (file)
@@ -80,11 +80,9 @@ class JobRunner {
                wfGetLBFactory()->commitMasterChanges();
 
                // Some jobs types should not run until a certain timestamp
-               $backoffs = $this->loadBackoffs( array(), 'wait' ); // map of (type => UNIX expiry)
+               $backoffs = array(); // map of (type => UNIX expiry)
                $backoffDeltas = array(); // map of (type => seconds)
-               $backoffExpireFunc = function ( $t ) {
-                       return $t > time();
-               };
+               $wait = 'wait'; // block to read backoffs the first time
 
                $jobsRun = 0; // counter
                $timeMsTotal = 0;
@@ -92,8 +90,11 @@ class JobRunner {
                $sTime = microtime( true ); // time since jobs started running
                $lastTime = microtime( true ); // time since last slave check
                do {
-                       $backoffs = array_filter( $backoffs, $backoffExpireFunc );
+                       // Sync the persistent backoffs with concurrent runners
+                       $backoffs = $this->syncBackoffDeltas( $backoffs, $backoffDeltas, $wait );
                        $blacklist = $noThrottle ? array() : array_keys( $backoffs );
+                       $wait = 'nowait'; // less important now
+
                        if ( $type === false ) {
                                $job = $group->pop( JobQueueGroup::TYPE_DEFAULT, $flags, $blacklist );
                        } elseif ( in_array( $type, $blacklist ) ) {
@@ -101,9 +102,21 @@ class JobRunner {
                        } else {
                                $job = $group->pop( $type ); // job from a single queue
                        }
+
                        if ( $job ) { // found a job
                                $jType = $job->getType();
 
+                               // Back off of certain jobs for a while (for throttling and for errors)
+                               $ttw = $this->getBackoffTimeToWait( $job );
+                               if ( $ttw > 0 ) {
+                                       // Always add the delta for other runners in case the time running the
+                                       // job negated the backoff for each individually but not collectively.
+                                       $backoffDeltas[$jType] = isset( $backoffDeltas[$jType] )
+                                               ? $backoffDeltas[$jType] + $ttw
+                                               : $ttw;
+                                       $backoffs = $this->syncBackoffDeltas( $backoffs, $backoffDeltas, $wait );
+                               }
+
                                $this->runJobsLog( $job->toString() . " STARTING" );
 
                                // Run the job...
@@ -130,23 +143,13 @@ class JobRunner {
                                }
 
                                // Back off of certain jobs for a while (for throttling and for errors)
-                               $ttw = $this->getBackoffTimeToWait( $job );
                                if ( $status === false && mt_rand( 0, 49 ) == 0 ) {
                                        $ttw = max( $ttw, 30 ); // too many errors
-                               }
-                               if ( $ttw > 0 ) {
-                                       // Always add the delta for other runners in case the time running the
-                                       // job negated the backoff for each individually but not collectively.
                                        $backoffDeltas[$jType] = isset( $backoffDeltas[$jType] )
                                                ? $backoffDeltas[$jType] + $ttw
                                                : $ttw;
                                }
 
-                               // Sync the persistent backoffs with concurrent runners
-                               $backoffs = $backoffDeltas
-                                       ? $this->syncBackoffDeltas( $backoffs, $backoffDeltas, 'nowait' )
-                                       : $this->loadBackoffs( $backoffs, 'nowait' );
-
                                if ( $status === false ) {
                                        $this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
                                } else {
@@ -249,12 +252,18 @@ class JobRunner {
                        $content = stream_get_contents( $handle );
                        flock( $handle, LOCK_UN );
                        fclose( $handle );
-                       $backoffs = json_decode( $content, true ) ?: array();
+                       $ctime = microtime( true );
+                       $cBackoffs = json_decode( $content, true ) ?: array();
+                       foreach ( $cBackoffs as $type => $timestamp ) {
+                               if ( $timestamp < $ctime ) {
+                                       unset( $cBackoffs[$type] );
+                               }
+                       }
                } else {
-                       $backoffs = array();
+                       $cBackoffs = array();
                }
 
-               return $backoffs;
+               return $cBackoffs;
        }
 
        /**
@@ -271,7 +280,10 @@ class JobRunner {
        private function syncBackoffDeltas( array $backoffs, array &$deltas, $mode = 'wait' ) {
                $section = new ProfileSection( __METHOD__ );
 
-               $ctime = time();
+               if ( !$deltas ) {
+                       return $this->loadBackoffs( $backoffs, $mode );
+               }
+
                $noblock = ( $mode === 'nowait' ) ? LOCK_NB : 0;
                $file = wfTempDir() . '/mw-runJobs-backoffs.json';
                $handle = fopen( $file, 'wb+' );
@@ -279,6 +291,7 @@ class JobRunner {
                        fclose( $handle );
                        return $backoffs; // don't wait on lock
                }
+               $ctime = microtime( true );
                $content = stream_get_contents( $handle );
                $cBackoffs = json_decode( $content, true ) ?: array();
                foreach ( $deltas as $type => $seconds ) {
@@ -286,6 +299,11 @@ class JobRunner {
                                ? $cBackoffs[$type] + $seconds
                                : $ctime + $seconds;
                }
+               foreach ( $cBackoffs as $type => $timestamp ) {
+                       if ( $timestamp < $ctime ) {
+                               unset( $cBackoffs[$type] );
+                       }
+               }
                ftruncate( $handle, 0 );
                fwrite( $handle, json_encode( $cBackoffs ) );
                flock( $handle, LOCK_UN );
index 4e2ca83..dcaa685 100644 (file)
@@ -135,27 +135,21 @@ class CSSMin {
         */
        public static function getMimeType( $file ) {
                $realpath = realpath( $file );
-               // Try a couple of different ways to get the MIME-type of a file, in order of
-               // preference
                if (
                        $realpath
                        && function_exists( 'finfo_file' )
                        && function_exists( 'finfo_open' )
                        && defined( 'FILEINFO_MIME_TYPE' )
                ) {
-                       // As of PHP 5.3, this is how you get the MIME-type of a file; it uses the Fileinfo
-                       // PECL extension
                        return finfo_file( finfo_open( FILEINFO_MIME_TYPE ), $realpath );
-               } elseif ( function_exists( 'mime_content_type' ) ) {
-                       // Before this was deprecated in PHP 5.3, this was how you got the MIME-type of a file
-                       return mime_content_type( $file );
-               } else {
-                       // Worst-case scenario has happened, use the file extension to infer the MIME-type
-                       $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) );
-                       if ( isset( self::$mimeTypes[$ext] ) ) {
-                               return self::$mimeTypes[$ext];
-                       }
                }
+
+               // Infer the MIME-type from the file extension
+               $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) );
+               if ( isset( self::$mimeTypes[$ext] ) ) {
+                       return self::$mimeTypes[$ext];
+               }
+
                return false;
        }
 
index 8700c8c..c853bcf 100644 (file)
@@ -247,6 +247,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                $callback = array( $this, 'encodeKey' );
                $result = $this->client->getMulti( array_map( $callback, $keys ) );
                wfProfileOut( __METHOD__ );
+               $result = $result ?: array(); // must be an array
                return $this->checkResult( false, $result );
        }
 
index 983fc14..eacbecd 100644 (file)
@@ -1001,8 +1001,8 @@ class CoreParserFunctions {
         */
        private static function getCachedRevisionObject( $parser, $title = null ) {
                static $cache = null;
-               if ( !isset( $cache ) ) {
-                       $cache = new MapCacheLRU( 100 );
+               if ( $cache == null ) {
+                       $cache = new MapCacheLRU( 50 );
                }
 
                if ( is_null( $title ) ) {
index dc06eba..7d04b95 100644 (file)
@@ -253,6 +253,8 @@ abstract class Skin extends ContextSource {
                        $titles[] = $this->getTitle()->getTalkPage();
                }
 
+               wfRunHooks( 'SkinPreloadExistence', array( &$titles, $this ) );
+
                $lb = new LinkBatch( $titles );
                $lb->setCaller( __METHOD__ );
                $lb->execute();
index f977981..8806247 100644 (file)
        "showpreview": "Праглядзець",
        "showdiff": "Паказаць зьмены",
        "blankarticle": "<strong>Папярэджаньне:</strong> вы ствараеце пустую старонку.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, старонка будзе створаная без аніякага зьместу.",
-       "anoneditwarning": "'''Папярэджаньне:''' Вы не ўвайшлі ў сыстэму. Ваш IP-адрас будзе запісаны ў гісторыі гэтай старонкі.",
+       "anoneditwarning": "<strong>Папярэджаньне</strong>: вы не ўвайшлі ў сыстэму. Ваш IP-адрас будзе бачны ўсім, калі вы адрэдагуеце старонку. Калі вы <strong>[$1 ўвойдзеце]</strong> або <strong>[$2 створыце рахунак]</strong>, вашыя рэдагаваньні будуць зьвязаныя з вашым імем карыстальніка, а таксама вам будуць даступныя дадатковыя перавагі.",
        "anonpreviewwarning": "''Вы не ўвайшлі ў сыстэму. Падчас захаваньня Ваш IP-адрас будзе дададзены ў гісторыю рэдагаваньняў старонкі.''",
        "missingsummary": "'''Напамін:''' Вы не пазначылі кароткае апісаньне зьменаў.\nКалі Вы націсьніце кнопку «Запісаць» яшчэ раз, Вашае рэдагаваньне будзе запісанае без апісаньня.",
        "missingcommenttext": "Калі ласка, увядзіце камэнтар ніжэй.",
index 2c9cf74..665d9e3 100644 (file)
        "showpreview": "Mostrar previsualización",
        "showdiff": "Mostrar los cambios",
        "blankarticle": "<strong>Aviso:</strong> estás a punto de crear una página vacía.\nSi pulsas en «{{int:savearticle}}» de nuevo, se creará la página sin ningún contenido.",
-       "anoneditwarning": "<strong>Advertencia:</strong> No has iniciado sesión.\nTu dirección IP se almacenará en el historial de edición de esta página.",
+       "anoneditwarning": "<strong>Advertencia:</strong> No has iniciado sesión. Tu dirección IP será visible públicamente si haces cualquier edición. Si <strong>[$1 inicias sesión]</strong> o <strong>[$2 creas una cuenta]</strong>, tus ediciones se atribuirán a tu nombre de usuario, junto con otros beneficios.",
        "anonpreviewwarning": "<em>No has iniciado sesión. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de esta página.</em>",
        "missingsummary": "<strong>Recordatorio:</strong> No has escrito un resumen de edición.\nSi haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
        "missingcommenttext": "Escribe un comentario a continuación.",
index 3e1642b..b854888 100644 (file)
        "duration-millennia": "{{PLURAL:$1|هزار سال |$1 هزار سال}}",
        "rotate-comment": "تصویر به دست $1 {{PLURAL:$1|درجهٔ|درجهٔ}} ساعت‌گرد چرخانده شد",
        "limitreport-title": "داده‌های رخ‌نمانگاری تجزیه‌کننده:",
-       "limitreport-cputime": "زمان مصرف سی‌پی‌یو",
+       "limitreport-cputime": "زمان مصرفی سی‌پی‌یو",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|ثانیه}}",
-       "limitreport-walltime": "استÙ\81ادÙ\87 Ø²Ù\85اÙ\86 واقعی",
+       "limitreport-walltime": "زÙ\85اÙ\86 Ù\85صرÙ\81Û\8c واقعی",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه}}",
-       "limitreport-ppvisitednodes": "شمارش گرهٔ پیش‌پردازنده مشاهده‌شده",
-       "limitreport-ppgeneratednodes": "شمارش گره پیش‌پردازنده تولیدشده",
-       "limitreport-postexpandincludesize": "شاÙ\85Ù\84 Ø§Ù\86دازÙ\87 Ù¾Ø³ گسترش",
+       "limitreport-ppvisitednodes": "شمارندهٔ گره بازدیدشدهٔ پیش‌پردازنده",
+       "limitreport-ppgeneratednodes": "شمارندهٔ گره تولیدی پیش‌پردازنده",
+       "limitreport-postexpandincludesize": "اÙ\86دازÙ\87Ù\94 Ø¯Ø±Ø¨Ø±Ú¯Û\8cرÙ\86دÙ\87 Ù¾Ø³ Ø§Ø² گسترش",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|بایت|بایت}}",
-       "limitreport-templateargumentsize": "اÙ\86دازÙ\87 Ø¹Ù\85Ù\84گر الگو",
+       "limitreport-templateargumentsize": "اÙ\86دازÙ\87 Ø¢Ø±Ú¯Ù\88Ù\85اÙ\86 الگو",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بایت|بایت}}",
        "limitreport-expansiondepth": "بیشترین عمق گسترش",
        "limitreport-expensivefunctioncount": "تعداد تابع تجزیه‌گر پرمصرف",
index 0991e5e..2bf4f09 100644 (file)
        "userlogin-resetlink": "Datos de authentication oblidate?",
        "userlogin-resetpassword-link": "Contrasigno oblidate?",
        "userlogin-helplink2": "Adjuta al accesso",
-       "userlogin-loggedin": "Tu ha jam aperite session como {{GENDER:$1|$1}}.\nUsa le formulario sequente pro aperir session como altere usator.",
-       "userlogin-createanother": "Crear un altere conto",
        "createacct-emailrequired": "Adresse de e-mail",
        "createacct-emailoptional": "Adresse de e-mail (optional)",
        "createacct-email-ph": "Entra tu adresse de e-mail",
        "showpreview": "Monstrar previsualisation",
        "showdiff": "Detaliar modificationes",
        "blankarticle": "<strong>Advertimento:</strong> Le pagina que tu vole crear es vacue.\nSi tu clicca de novo sur \"{{int:savearticle}}\", le pagina essera create sin contento.",
-       "anoneditwarning": "'''Attention:''' Tu non ha aperite un session.\nTu adresse IP essera registrate in le historia de modificationes de iste pagina.",
+       "anoneditwarning": "<strong>Attention:</strong> Tu non ha aperite un session. Le adresse IP tue essera publicamente visibile si tu face modificationes. Si tu <strong>[$1 aperi un session]</strong> o <strong>[$2 crea un conto]</strong>, le modificationes essera attribuite al nomine de usator tue, inter altere avantages.",
        "anonpreviewwarning": "''Tu non ha aperite un session. Salveguardar registrara tu adresse IP in le historia de modificationes de iste pagina.''",
        "missingsummary": "'''Rememoration:''' Tu non ha specificate un summario del modification.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin summario.",
        "missingcommenttext": "Per favor entra un commento infra.",
        "node-count-exceeded-category-desc": "Le pagina excede le numero maxime de nodos.",
        "node-count-exceeded-warning": "Le numero de nodos in iste pagina excede le limite",
        "expansion-depth-exceeded-category": "Paginas in que le profunditate de expansion excede le limite",
-       "expansion-depth-exceeded-category-desc": "Isto es un categoria pro paginas in le quales le profunditate de expansion ha essite excedite.",
+       "expansion-depth-exceeded-category-desc": "Le pagina excede le profunditate de expansion maxime.",
        "expansion-depth-exceeded-warning": "Le profunditate de expansion in iste pagina excede le limite",
        "parser-unstrip-loop-warning": "Bucla de \"unstrip\" detegite",
        "parser-unstrip-recursion-limit": "Limite de recursion de \"unstrip\" excedite ($1)",
        "preferences": "Preferentias",
        "mypreferences": "Preferentias",
        "prefs-edits": "Numero de modificationes:",
-       "prefsnologintext2": "Es necessari $1 pro definir le preferentias de usator.",
+       "prefsnologintext2": "Es necessari aperir session pro cambiar le preferentias.",
        "prefs-skin": "Apparentia",
        "skin-preview": "Previsualisation",
        "datedefault": "Nulle preferentia",
        "randomincategory": "Pagina aleatori in categoria",
        "randomincategory-invalidcategory": "\"$1\" non es un nomine de categoria valide.",
        "randomincategory-nopages": "Il non ha paginas in [[:Category:$1]].",
+       "randomincategory-category": "Categoria:",
+       "randomincategory-legend": "Pagina aleatori in categoria",
        "randomredirect": "Redirection aleatori",
        "randomredirect-nopages": "Il non ha redirectiones in le spatio de nomines \"$1\".",
        "statistics": "Statisticas",
        "trackingcategories-desc": "Criterios pro inclusion in categoria",
        "noindex-category-desc": "Iste pagina es excludite del indice perque illo contine le marca <code><nowiki>__NOINDEX__</nowiki></code> e es in un spatio de nomines ubi le uso de iste marca es permittite.",
        "index-category-desc": "Iste pagina contine le marca <code><nowiki>__INDEX__</nowiki></code> (e es in un spatio de nomines ubi le uso de iste marca es permittite), e dunque es includite in le indice mesmo si illo normalmente non lo esserea.",
-       "post-expand-template-inclusion-category-desc": "Le expansion de tote le patronos facerea le dimension del pagina exceder le limite de <code>$wgMaxArticleSize</code>, dunque alcun patronos non ha essite expandite.",
-       "post-expand-template-argument-category-desc": "Post le expansion de un parametro de patrono (qualcosa inter accolladas triple, como <code>{{{Exemplo}}}</code>), le dimension del pagina excede le limite de <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Troppo de functiones costose de analysator syntactic (como <code>#ifexist</code>) ha essite includite in un pagina. Vide [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Iste categoria es addite si le pagina contine un ligamine de file rupte (un ligamine pro incorporar un file quando le file non existe).",
-       "hidden-category-category-desc": "Iste categoria contine le marca <code><nowiki>__HIDDENCAT__</nowiki></code>, impediente lo de apparer in le quadro de ligamines de categoria in paginas, si non configurate alteremente.",
+       "post-expand-template-inclusion-category-desc": "Le dimension del pagina es plus grande de <code>$wgMaxArticleSize</code> post le expansion de tote le patronos, dunque alcun patronos non ha essite expandite.",
+       "post-expand-template-argument-category-desc": "Le dimension del pagina es plus grande de <code>$wgMaxArticleSize</code> post le expansion de un parametro de patrono (qualcosa inter accolladas triple, como <code>{{{Exemplo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Le pagina usa troppo de functiones costose de analysator syntactic (como <code>#ifexist</code>). Vide [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Le pagina contine un ligamine de file rupte (un ligamine pro incorporar un file quando le file non existe).",
+       "hidden-category-category-desc": "Le categoria contine <code><nowiki>__HIDDENCAT__</nowiki></code> in su contento de pagina, impediente que illo appare in le quadro de ligamines de categoria in paginas, si non configurate alteremente.",
        "trackingcategories-nodesc": "Nulle description disponibile.",
        "trackingcategories-disabled": "Le categoria es disactivate",
        "mailnologin": "Necun adresse de invio",
        "mywatchlist": "Observatorio",
        "watchlistfor2": "De $1 $2",
        "nowatchlist": "Tu non ha paginas sub observation.",
-       "watchlistanontext": "Tu debe $1 pro poter vider o modificar entratas in tu observatorio.",
+       "watchlistanontext": "Per favor, aperi session pro poter vider o modificar entratas in tu observatorio.",
        "watchnologin": "Tu non ha aperite un session",
        "addwatch": "Adder al observatorio",
        "addedwatchtext": "Le pagina \"[[:$1]]\" ha essite addite a tu [[Special:Watchlist|observatorio]].\nLe modificationes futur in iste pagina e in le pagina de discussion associate essera listate in illo.",
        "delete-edit-reasonlist": "Modificar le motivos pro deletion",
        "delete-toobig": "Iste pagina ha un grande historia de modificationes con plus de $1 {{PLURAL:$1|version|versiones}}.\nLe deletion de tal paginas ha essite restringite pro impedir le disruption accidental de {{SITENAME}}.",
        "delete-warning-toobig": "Iste pagina ha un grande historia de modificationes con plus de $1 {{PLURAL:$1|version|versiones}}.\nLe deletion de illo pote disrumper le operationes del base de datos de {{SITENAME}};\nprocede con caution.",
+       "deleteprotected": "Tu non pote deler iste pagina perque illo ha essite protegite.",
        "deleting-backlinks-warning": "'''Attention:''' Il ha [[Special:WhatLinksHere/{{FULLPAGENAME}}|altere paginas]] que liga a o transclude le pagina que tu es sur le puncto de deler.",
        "rollback": "Revocar modificationes",
        "rollback_short": "Revocar",
        "autoblockid": "Auto-blocada №$1",
        "block": "Blocar usator",
        "unblock": "Disblocar usator",
-       "blockip": "Blocar usator",
+       "blockip": "Blocar {{GENDER:$1|usator}}",
        "blockip-legend": "Blocar usator",
        "blockiptext": "Usa le formulario infra pro blocar le accesso de scriptura\na partir de un adresse IP specific.\nIsto debe esser facite solmente pro impedir vandalismo, e de\naccordo con le [[{{MediaWiki:Policy-url}}|politica de {{SITENAME}}]].\nScribe un motivo specific infra (per exemplo, citante paginas\nspecific que ha essite vandalisate).",
        "ipaddressorusername": "Adresse IP o nomine de usator:",
        "ipb-unblock-addr": "Disblocar $1",
        "ipb-unblock": "Disblocar un nomine de usator o un adresse IP",
        "ipb-blocklist": "Vider blocadas existente",
-       "ipb-blocklist-contribs": "Contributiones de $1",
+       "ipb-blocklist-contribs": "Contributiones de {{GENDER:$1|$1}}",
        "unblockip": "Disblocar adresse IP",
        "unblockiptext": "Usa le formulario infra pro restaurar le accesso de scriptura\na un adresse IP blocate previemente.",
        "ipusubmit": "Cancellar iste blocada",
        "import": "Importar paginas",
        "importinterwiki": "Importation transwiki",
        "import-interwiki-text": "Selige le wiki e le titulo del pagina a importar.\nLe datas del versiones e nomines del contributores essera preservate.\nTote le actiones de importation transwiki se registra in le [[Special:Log/import|registro de importationes]].",
+       "import-interwiki-sourcewiki": "Wiki de origine:",
+       "import-interwiki-sourcepage": "Pagina de origine:",
        "import-interwiki-history": "Copiar tote le versiones del historia de iste pagina",
        "import-interwiki-templates": "Includer tote le patronos",
        "import-interwiki-submit": "Importar",
        "logentry-rights-rights": "$1 {{GENDER:$2|cambiava}} le appertinentia a gruppos pro $3 de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|cambiava}} le appertinentia a gruppos pro $3",
        "logentry-rights-autopromote": "$1 ha essite automaticamente {{GENDER:$2|promovite}} de $4 a $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ha incargate}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|ha incargate}} un nove version de $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|ha incargate}} $3",
        "rightsnone": "(nulle)",
        "feedback-bugornote": "Si tu es preste a describer un problema technic in detalio, per favor [$1 reporta un falta].\nSi non, tu pote usar le formulario facile hic infra. Tu commento essera addite al pagina \"[$3 $2]\", con tu nomine de usator e le navigator del web que tu usa.",
        "feedback-subject": "Subjecto:",
        "action-pagelang": "cambiar le lingua del pagina",
        "log-name-pagelang": "Registro de cambios de lingua",
        "log-description-pagelang": "Isto es un registro de cambios de lingua in paginas.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambiava}} le lingua del pagina $3 de $4 a $5."
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambiava}} le lingua del pagina $3 de $4 a $5.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activate)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disactivate''')"
 }
index f4c0050..a1cc559 100644 (file)
@@ -73,7 +73,8 @@
                        "PeppeAeco",
                        "아라",
                        "Lucas2",
-                       "Taxandru"
+                       "Taxandru",
+                       "C.R."
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "upload_directory_missing": "La directory di upload ($1) non esiste e non può essere creata dal server web.",
        "upload_directory_read_only": "Il server web non è in grado di scrivere nella directory di upload ($1).",
        "uploaderror": "Errore nel caricamento",
-       "upload-recreate-warning": "'Attenzione'': un file con questo nome è stato cancellato o spostato.'''\nIll log delle cancellazioni e degli spostamenti di questa pagina viene qui riportato per comodità:",
+       "upload-recreate-warning": "'Attenzione'': un file con questo nome è stato cancellato o spostato.'''\nIl log delle cancellazioni e degli spostamenti di questa pagina viene qui riportato per comodità:",
        "uploadtext": "Usare il modulo sottostante per caricare nuovi file. Per visualizzare o ricercare i file già caricati, consultare il [[Special:FileList|log dei file caricati]]. Caricamenti di file e di nuove versioni di file sono registrati nel [[Special:Log/upload|log degli upload]], le cancellazioni nell'[[Special:Log/delete|apposito]].\n\nPer inserire un file all'interno di una pagina, fare un collegamento di questo tipo:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' per usare la versione completa del file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></code>''' per usare una versione larga 200 pixel inserita in un box, allineata a sinistra e con 'testo alternativo' come didascalia\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' per generare un collegamento diretto al file senza visualizzarlo",
        "upload-permitted": "Tipi di file consentiti: $1.",
        "upload-preferred": "Tipi di file consigliati: $1.",
        "filesource": "Fonte:",
        "ignorewarning": "Ignora l'avviso e salva comunque il file",
        "ignorewarnings": "Ignora i messaggi di avvertimento del sistema",
-       "minlength1": "Il nome del file dev'essere composto da almeno un carattere.",
+       "minlength1": "Il nome del file dev'essere composto da almeno una lettera.",
        "illegalfilename": "Il nome \"$1\" contiene dei caratteri non ammessi nei titoli delle pagine. Dare al file un nome diverso e provare a caricarlo di nuovo.",
        "filename-toolong": "I nomi dei file non possono superare i 240 byte.",
        "badfilename": "Il nome del file è stato convertito in \"$1\".",
        "uploadscriptednamespace": "Questo file SVG contiene un namespace '$1' non consentito",
        "uploadinvalidxml": "Il codice XML nel file caricato non può essere elaborato.",
        "uploadvirus": "Questo file contiene un virus! Dettagli: $1",
-       "uploadjava": "Questo file è un file ZIP che contiene un file .class Java.\nCarica i file Java non è consentito, perché possono causare l'aggiramento delle restrizioni di sicurezza.",
+       "uploadjava": "Questo file è un file ZIP che contiene un file .class Java.\nCaricare i file Java non è consentito, perché possono causare l'aggiramento delle restrizioni di sicurezza.",
        "upload-source": "File di origine",
        "sourcefilename": "Nome del file di origine:",
        "sourceurl": "URL di origine:",
        "backend-fail-backup": "Impossibile eseguire il backup del file $1 .",
        "backend-fail-notexists": "Il file $1 non esiste.",
        "backend-fail-hashes": "Impossibile ottenere hash dei file per confronto.",
-       "backend-fail-notsame": "Esiste già un file non identico a  $1 .",
+       "backend-fail-notsame": "Esiste già un file non identico a \"$1\".",
        "backend-fail-invalidpath": "$1 non è un percorso di archiviazione valido.",
        "backend-fail-delete": "Impossibile cancellare il file $1.",
        "backend-fail-describe": "Impossibile modificare i metadati del file \"$1\".",
index 3024fe7..decfd86 100644 (file)
        "editinguser": "Modificare potestates usoris '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Greges usorum recensere",
        "saveusergroups": "Greges usorum servare",
-       "userrights-groupsmember": "In grege aut in gregibus:",
+       "userrights-groupsmember": "{{PLURAL:$1|In grege|In gregibus}}:",
        "userrights-reason": "Causa:",
        "userrights-changeable-col": "Greges quos tibi oportet mutare",
        "userrights-unchangeable-col": "Greges quos tibi non oportet mutare",
index e40a672..a0f79be 100644 (file)
@@ -21,7 +21,7 @@
        "tog-numberheadings": "Annúmmera automatecamente 'e títule",
        "tog-showtoolbar": "Aspone 'a barra d''e stromiente 'e cagno",
        "tog-editondblclick": "Cagna 'e pàggene cliccanno ddoje vote",
-       "tog-editsectiononrightclick": "Permette 'e cangne 'e sezzione cliccanno p''o tasto destro ncopp 'e titule 'e sezzione",
+       "tog-editsectiononrightclick": "Permette 'e cagnà 'e sezzione cliccanno p' 'o tasto dritto ncopp' 'e titule 'e sezzione",
        "tog-watchcreations": "Azzecca 'e ppaggene criate e li files carrecate ncopp'â l'elenco 'e cuntrollo",
        "tog-watchdefault": "Azzecca 'e paggene e li files cagnàte a l'elenco 'e cuntrollo",
        "tog-watchmoves": "Azzecca 'e paggene e li files spustate a l'elenco 'e cuntrollo",
        "jumpto": "Vaje a:",
        "jumptonavigation": "navigazione",
        "jumptosearch": "truova",
-       "view-pool-error": "Te cercammo scusa, 'e servers téneno troppo carico mo'.\nTroppe utente stanno cercanno 'e veré sta paggena.\nPe' piacere, aspetta nu poco primma 'e turnà a caricà sta paggena.\n\n$1",
-       "generic-pool-error": "Te cercammo scusa, 'e servers téneno troppo carico mo'.\nTroppe utente stanno cercanno 'e veré sta risorsa.\nPe' piacere, aspetta nu poco primma 'e turnà a caricà sta risorsa.",
+       "view-pool-error": "Ve cercammo scusa, 'e servers hanno troppo carico mo'.\nTroppe utente stanno cercanno 'e veré sta paggena.\nPe' piacere, aspettate nu poco primma 'e turnà a carrecà sta paggena.\n\n$1",
+       "generic-pool-error": "Ve cercammo scusa, 'e servers hanno troppo carico mo'.\nTroppe utente stanno cercanno 'e veré sta risorsa.\nPe' piacere, aspettate nu poco primma 'e turnà a carrecà sta risorsa.",
        "pool-timeout": "Tiempo pe' s'aspettà ô blocco",
        "pool-queuefull": "A córa 'e fatiche è chiena",
        "pool-errorunknown": "Errore scanusciuto",
        "aboutpage": "Project:'Nfrummazione",
        "copyright": "Cuntenute suggiette a licienza 'e auso $1 se nun fuje ritto atro.",
        "copyrightpage": "{{ns:project}}:Copyrights",
-       "currentevents": "Novità",
+       "currentevents": "Nuvità",
        "currentevents-url": "Project:Novità",
        "disclaimers": "Avvertimiènte",
        "disclaimerpage": "Project:Avvertimiènte generale",
        "readonly_lag": "'O database s'è bloccato automaticamente pe' tramente ca 'e servers 'e database schiave sincronizzano c' 'o server masto.",
        "internalerror": "Errore 'nterno",
        "internalerror_info": "Errore 'nterno: $1",
-       "filecopyerror": "Nun se può copiare 'o file \"$1\" into \"$2\".",
+       "filecopyerror": "Nun se può copiare 'o file \"$1\" int'a \"$2\".",
        "filerenameerror": "Nun se può rinnummenare 'o file \"$1\" into \"$2\".",
        "filedeleteerror": "Nun se pô scancellà 'o file \"$1\"",
        "directorycreateerror": "Nun se può crià 'a cartella \"$1\".",
        "viewsource": "Vere sorgente",
        "viewsource-title": "Vere surgente 'e $1",
        "actionthrottled": "Azione ritardata",
-       "actionthrottledtext": "Comme misura anti-spam, sì lemmetato 'a ffà st'azione troppe vote dint'a nu curto spazio 'e tiempo, e mò stu lèmmeto è stato superato.\nPe' piacere prova n'ata vota dint'a cocche minuto.",
+       "actionthrottledtext": "Comme misura anti-spam, site lemmetato 'a ffà st'azione troppe vote dint'a nu curto spazio 'e tiempo, e mò stu lèmmeto è stato superato.\nPe' piacere pruvate n'ata vota dint'a cocche minuto.",
        "protectedpagetext": "Sta paggena s'è prutetta pe' ne bloccà 'a mudifeca o n'ata azione.",
        "viewsourcetext": "Putisse vedé e copià 'o codece surgiva 'e sta paggena:",
        "viewyourtext": "Putisse vedé e copià 'o codice surgiva d' 'e <strong>cagnamiénte tuoje</strong> a sta paggena:",
-       "protectedinterface": "Sta paggena nce appruviggióna 'e n'interfaccia testo p' 'o software dint'a sta wiki, e s'è prutetta pe' nce scanzà 'e cocch'abbuso.\nSi se buò azzeccà o cagnà traduzzione ncopp'a tutte 'e wiki, pe piacere usa [//translatewiki.net/ translatewiki.net], 'o pruggetto Mediawiki p'a localizzaziona dint'a l'ate llengue",
-       "editinginterface": "'''Attenziò:''' 'O testo 'e sta paggena ffà parte 'e ll'interfaccia utente d' 'o sito.\nTutt' 'e cagnamiénte fatte a sta paggena cumpareno dint' 'e mmasciate 'e ll'interfaccia veduta 'a tutte ll'utente dint'a sta wiki.\nSi se buò azzeccà o cagnà traduzzione ncopp'a tutte 'e wiki, pe piacere usa [//translatewiki.net/ translatewiki.net], 'o pruggetto Mediawiki p'a localizzaziona dint'a l'ate llengue",
+       "protectedinterface": "Sta paggena nce appruviggióna 'e n'interfaccia testo p' 'o software dint'a sta wiki, e s'è prutetta pe' nce scanzà 'e cocch'abbuso.\nSi se buò azzeccà o cagnà traduzzione ncopp'a tutte 'e wiki, pe piacere ausate [//translatewiki.net/ translatewiki.net], 'o pruggetto Mediawiki p'a localizzaziona dint'a l'ate llengue",
+       "editinginterface": "'''Attenziò:''' 'O testo 'e sta paggena ffà parte 'e ll'interfaccia utente d' 'o sito.\nTutt' 'e cagnamiénte fatte a sta paggena cumpareno dint' 'e mmasciate 'e ll'interfaccia veduta 'a tutte ll'utente dint'a sta wiki.\nSi se buò azzeccà o cagnà traduzzione ncopp'a tutte 'e wiki, pe piacere ausate [//translatewiki.net/ translatewiki.net], 'o pruggetto Mediawiki p'a localizzaziona dint'a l'ate llengue",
        "cascadeprotected": "Sta paggena è stata prutetta 'a 'o cangamento pecché sta dint'a {{PLURAL:$1|sta paggena, che è prutetta|sti paggene, che songo prutette}} quann' 'a l'ozione \"ricurziva\" è attiva:\n$2",
        "namespaceprotected": "Nun hè permesso a cagnà 'e paggene dint'a stu namespace '''$1'''.",
        "customcssprotected": "Nun t'è permesso 'a cagnà sta paggena CSS, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
        "invalidtitle-knownnamespace": "Titolo nun buono c' 'o namespace \"$2\" e testo \"$3\"",
        "invalidtitle-unknownnamespace": "Titolo nun buono c' 'o namespace scanusciuto \"$1\" e testo \"$2\"",
        "exception-nologin": "Acciesso nun affettuato",
-       "exception-nologin-text": "Pe' piacere fa ll'accieso pe putè accedere a sta paggena o azione.",
+       "exception-nologin-text": "Pe' piacere facite ll'accieso pe putè accedere a sta paggena o azione.",
        "exception-nologin-text-manual": "Pe' piacere $1 pe putè trasì dint'a sta paggena o azione.",
        "virus-badscanner": "Sbaglio 'e configurazione: antivirus scanusciuto: ''$1''",
        "virus-scanfailed": "scanziona fallita (codece $1)",
        "createacct-benefit-body2": "{{PLURAL:$1|paggena|paggene}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribbutòre ricente|contribbutture ricente}}",
        "badretype": "'E passwords ch'è mis nun songe eguale.",
-       "userexists": "'O nomme utente ch'è mis è già ausàto.\nPe' piacere sciglite n'atu nomme.",
+       "userexists": "'O nomme utente ch'avete miso è già ausàto.\nPe' piacere sciglite n'atu nomme.",
        "loginerror": "Probblema 'e accièsso",
        "createacct-error": "Errore 'e criazione 'e cunto",
        "createaccounterror": "Nun se può crià nu cunto: $1",
        "nocookiesnew": "'A riggistrazione è stata completata, ma nun se può accedere a {{SITENAME}} pecché 'e cookie songo disattivate. Prova n'ata vota c' 'o nomme e 'a password quanno 'e cookie sarrann'attivate dint'o navigatore stesso.",
-       "nocookieslogin": "{{SITENAME}} usa cookies pe' putè dà accies'a ll'utente.\n'E cookies tuoje songo stutate.\nPe' piacere appiccia 'e cookies dint'o navigatóre e prova n'ata vota.",
+       "nocookieslogin": "{{SITENAME}} usa cookies pe' putè dà accies'a ll'utente.\n'E cookies vuoste songo stutate.\nPe' piacere appicciate 'e cookies dint'o navigatóre e pruvate n'ata vota.",
        "nocookiesfornew": "'O cunto utente nu s'è criato, pecché nun s'è potuto confirmà d' 'a fonte suja.\nVide si 'e cookies song'appicciate, ricarreca 'a paggena e prova n'ata vota.",
        "noname": "Nun hè specificato nu nomme valido d'utente.",
        "loginsuccesstitle": "Acciesso affettuato",
        "nosuchusershort": "Nun ce stanno utente cu o nòmme \"$1\". Cuntrolla si scrivìste buòno.",
        "nouserspecified": "Tiene 'a dìcere nu nomme pricìso.",
        "login-userblocked": "Chist'utente è bloccato. Nun se può effettuà 'o login.",
-       "wrongpassword": "'A password nzertàta nun è bbona.\nPe' piacere prova n'ata vota.",
-       "wrongpasswordempty": "'A passwort nzertàta è bbacante.\nPe' piacere prova n'ata vota.",
+       "wrongpassword": "'A password nzertàta nun è bbona.\nPe' piacere pruvate n'ata vota.",
+       "wrongpasswordempty": "'A password nzertàta è abbacante.\nPe' piacere pruvate n'ata vota.",
        "passwordtooshort": "'E password hann'avé minimo {{PLURAL:$1|nu carattere|$1 carattere}}.",
        "password-name-match": "'A password adda essere diverza 'a 'o nomme utente.",
        "password-login-forbidden": "L'uso 'e stu nomme utente e password è stato proibito.",
        "passwordremindertext": "Cocche perzona (pussibbilmente tu, cu n'innerizzo IP $1) ha dimmannato l'invio 'e na password d'accieso nova pe' {{SITENAME}} ($4).\nNa password temporanea e' l'utente \"$2\" s'è abbiata comme \"$3\".\nSi chest'è stata l'intenzione toja, allora hè a trasì dint'o sito e cagnà 'a password mò. 'A password temporanea scade aropp'a {{PLURAL:$5|nu juorno|$5 ghiuorne}}.\n\nSi nun sì stato tu a dimannà 'a password, o pure hè truvat'a password e nun 'a bbuò cagnà cchiù, allora nun fà niente e continua a usare 'a password viecchia.",
        "noemail": "Nun ce sta indirizzo e-mail pe' l'utente \"$1\".",
        "noemailcreate": "S'add'appruviggiunà n'indirizzo e-mail buono.",
-       "passwordsent": "Na password nova è stata inviata a l'innerizzo e-mail riggistrato 'a ll'utente \"$1\".\nPe' piacere, tràse appena hè ricevuta sta password.",
+       "passwordsent": "Na password nova è stata inviata a l'innerizzo e-mail riggistrato 'a ll'utente \"$1\".\nPe' piacere, trasite appena avite ricevuta sta password.",
        "blocked-mailpassword": "Ll'IP tuoja è bloccata pe' scrivere, picciò nun se ponno usà 'e ffunzione pe te mannà na password nova.",
        "eauthentsent": "Na mmasciata 'e conferma t'è stata mannata a l'indirizzo e-mail nzignàto.\nApprimm' 'e te mannà n'atu mail, hè 'a stà 'a ffà 'e struzione dint'a l'e-mail, pe' cunfermà ca 'o cunto fosse d' 'o tujo overo.",
        "throttled-mailpassword": "S'è mannata na mail pe te' riabbià 'a password 'a meno 'e {{PLURAL:$1|n'ora|$1 ore}}.\nPe' ce sparagnà abbuse, 'a funzione 'e riabbiamento d' 'a password se può usa sulamente na vota ogne {{PLURAL:$1|ora|$1 ore}}.",
        "resetpass-submit-loggedin": "Cagna password",
        "resetpass-submit-cancel": "Canciella",
        "resetpass-wrong-oldpass": "'A password temporanea o attuale nun è bbona.\n'A password putesse avé cagnato, o pure s'è addimannata na password temporanea nova.",
-       "resetpass-recycled": "Pe piacere riabbìa 'a password e miette na password differénte a chella 'e mmò.",
+       "resetpass-recycled": "Pe piacere riabbiate 'a password e mettete na password differénte a chella 'e mmò.",
        "resetpass-temp-emailed": "Sì trasuto cu nu codece temporaneo, mannato via e-mail. Pe' fà cumpleta 'a riggistraziona, avite 'e abbià na password nova ccà:",
        "resetpass-temp-password": "Password temporanea:",
        "resetpass-abort-generic": "'O cagnamiento d' 'a password s'è spezzato 'a na stensione.",
        "autoblockedtext": "Ll'IP vuosto è stato bloccato pecché 'o steva piglianno n'atu utente, ch'è stato bloccato pe' $1.\n\n'O mutivo d' 'o blocco è chesto:\n\n:''$2''\n\n* Abbiàta d' 'o blocco: $8\n* Ammaturità d' 'o blocco: $6\n* Tiempo 'e blocco: $7\n\nPutite cuntattà $1 o n'atu [[{{MediaWiki:Grouppage-sysop}}|ammenistratore]] pe' discutere 'o blocco.\n\nVedite c' 'a funzione 'Scrivete a ll'utente' nun è attiva si nun s'è riggistrato 'o ndirizzo e-mail buono dint' 'e [[Special:Preferences|preferenze]] o pùre si ll'uso 'e tale funzione è stato bloccato.\n\n'O ndirizzo IP attuale è $3, 'o nummero ID d' 'o blocco è #$5.\nPe' piacere avite 'e specificà tutte sti dettaglie ccà ncoppa quanno facite cocche dumanna.",
        "blockednoreason": "nisciuna ragione è stata indicata",
        "whitelistedittext": "Pe' cagnà 'e ppaggene è necessario $1.",
-       "confirmedittext": "Pe puté cagnà paggene hè 'a cunfermà l'indirizzo e-mail.\nPe' piacere abbìa e ffà 'a validazione d' 'o ndirizzo e-mail pe' bbìa d' 'e [[Special:Preferences|preferenze d'utente]].",
+       "confirmedittext": "Pe puté cagnà paggene avite 'a cunfermà l'indirizzo e-mail.\nPe' piacere abbiate e ffà 'a validazione d' 'o ndirizzo e-mail pe' bbìa d' 'e [[Special:Preferences|preferenze d'utente]].",
        "nosuchsectiontitle": "Nun se può truvà 'a sezziona",
        "nosuchsectiontext": "Hè pruvat' 'a cagnà na sezziona ca nun ce sta.\nPuò darse ch'è stata spustata o scancellata pe' tramente ca stive vedenno sta paggena.",
        "loginreqtitle": "Pe' cagnà chesta paggena abbesognate aseguì ll'acciesso ô sito.",
        "nonunicodebrowser": "'''Attenziò: staje ausanno nu navigatóre ca nun è compatibbele ch' 'e carattere Unicode. Pe' te permettere 'o cagnamiento d' 'e paggene senza crià ncunveniente, 'e carattere nun ASCII veneno viste dint' 'a cascia 'e cagnamiento sotto forma 'e codece esadecimale.'''",
        "editingold": "'''Attenziò: staje cagnanno na verziona nun agghiurnata d' 'a paggena. Si 'a sarve accussì, tutte 'e cagnamiente fatte aropp'a sta verziona sarranno sperdute.'''",
        "yourdiff": "Differenze",
-       "copyrightwarning": "Pe' piacere tiena a mmente ca tutte 'e contribbute a {{SITENAME}} songo cunziderate pubbrecate dint'e térmene d'uso d' 'a licienza $2 (vide $1 pe n'avé cchiù dettaglie).\nSi nun buò ca 'e testi tuoje fossero cagnate e distribuite 'a uno qualunque senza lémmeto, nun 'e mannà ccà.<br />\nMannanno stu testo dichiare pùre, sott'a responsabilità tua, ch'è stato scritto 'a te perzunalmente o pure ca è stato copiato 'a na fonte n pubblico dominio o similarmente libbera.\n'''Nun mannà materiale prutetto 'a copyright senz'avé autorizzaziona!'''",
-       "copyrightwarning2": "Pe' piacere tiena a mmente ca tutte 'e contribbute a {{SITENAME}} se ponno cagnà, alterà, o distribbuì pe l'ati cuntribbuttòre.\n\nSi nun buò ca 'e teste tuoje fossero cagnàte spenzieratamente, nun 'e mannà ccà.<br />\nMannanno stu testo dichiare pùre, sott'a responsabilità tua, ch'è stato scritto 'a te perzunalmente o pure ca è stato copiato 'a na fonte n pubblico dominio o similarmente libbera (vide $1 pe' n'avé dettaglie).\n'''Nun mannà materiale prutetto 'a copyright senz'avé autorizzaziona!'''",
+       "copyrightwarning": "Pe' piacere tenite a mmente ca tutte 'e contribbute a {{SITENAME}} songo cunziderate pubbrecate dint'e térmene d'uso d' 'a licienza $2 (vedite $1 pe n'avé cchiù dettaglie).\nSi nun vulite ca 'e testi vuoste fossero cagnate e distribuite 'a uno qualunque senza lémmeto, nun 'e mannate ccà.<br />\nMannanno stu testo dichiarate pùre, sott'a responsabilità vuosta, ch'è stato scritto 'a vuje perzunalmente o pure ca è stato copiato 'a na fonte n pubblico dominio o similarmente libbera.\n'''Nun mannate materiale prutetto 'a copyright senz'avé autorizzaziona!'''",
+       "copyrightwarning2": "Pe' piacere tenite a mmente ca tutte 'e contribbute a {{SITENAME}} se ponno cagnà, alterà, o distribbuì pe l'ati cuntribbuttòre.\n\nSi nun vulite ca 'e teste vuoste fossero cagnàte spenzieratamente, nun 'e mannate ccà.<br />\nMannanno stu testo dichiarate pùre, sott'a responsabilità vosta, ch'è stato scritto 'a vuje perzunalmente o pure ca è stato copiato 'a na fonte n pubblico dominio o similarmente libbera (vedete $1 pe' n'avé dettaglie).\n'''Nun mannate materiale prutetto 'a copyright senza n'avé autorizzaziona!'''",
        "longpageerror": "'''Errore: 'o testo mannato è luongo {{PLURAL:$1|1|$1}} kilobyte, ch'è cchiù grosso d' 'a diminziona massima cunzentita ({{PLURAL:$2|1|$2}} kilobyte).'''\n'O testo nun se pò sarvà.",
        "readonlywarning": "<strong>Attenziò</strong>: 'o database è bloccato pe se ffà 'a manutenzione. P' 'o mumento nun se ponno sarvà 'e cagnamiente fatte.\nPe' nun 'e sperdere, copia sti cuntenute dint'a nu file 'e testo e sarvatillo pe' tramente c'aspiette 'o sblocco d' 'o database.\n\nL'ammenistratore ca mpustaje 'o blocco ave scritto sta spiegazione: $1.",
        "protectedpagewarning": "'''Attenziò: sta paggena è stata bloccata 'n modo tale ca sulamente l'utente ch' 'e privilegge d'ammenistratore 'a ponno cagnà.'''\nL'urdemo elemento d' 'o riggistro è scritto ccà abbascio pe' n'avé riferimento:",
        "parser-unstrip-loop-warning": "Scummigliato aniello Unstrip",
        "parser-unstrip-recursion-limit": "Appassato 'o lémmeto 'e ricurzione d' Unstrip ($1)",
        "converter-manual-rule-error": "È stato scummigliato n'errore dint'a regola manuale 'e converziona 'e lengua",
-       "undo-success": "'O cagnamiento se può annullà.\nPe' piacere vide 'e differenze mmustate nfra 'e verziune pe' te ffà capace ca 'e cuntenute songo bbuone, e astipate 'e cagnamiente ccà abbascio pe' fernì e accussì turnà arreto.",
+       "undo-success": "'O cagnamiento se può annullà.\nPe' piacere vedete 'e differenze mmustate nfra 'e verziune pe' te ffà capace ca 'e cuntenute songo bbuone, e astipate 'e cagnamiente ccà abbascio pe' fernì e accussì turnà arreto.",
        "undo-failure": "Nun se può fà turnà arreto 'o cagnamiento pecché ce sta nu conflitto ch' 'e cagnamiente intermedie.",
        "undo-norev": "Nun se può fà turnà arreto 'o cagnamiento pecché nun esiste o s'è scancellato.",
        "undo-nochange": "Pare c' 'o cagnamiento s'è già fatto turnà arreto.",
        "revdelete-text-file": "'E verziune 'e file scancellate cumpareno ancora dint' 'a cronologgia d' 'o file, ma parte d' 'o cuntenuto lloro nun sarrà disponibbele a 'o pubbreco.",
        "logdelete-text": "'E fatte 'e riggistro scancellate cumpareno ancora dint' 'a cronologgia 'e riggistro, ma na parte d' 'o cuntenuto lloro nun sarrà disponibbele a 'o pubbreco.",
        "revdelete-text-others": "Ll'at'ammenistrature puterranno ancora trasì e arrepiglià 'e cuntenute annascunnute, si nun so' state mpustate cchiù restrizziune.",
-       "revdelete-confirm": "Pe' piacere cunferma ca overo bbuò ffà chesto, ca cunosce 'e cunseguenze, e ca staje facenno chesto rispettanno 'e [[{{MediaWiki:Policy-url}}|linee guida]].",
+       "revdelete-confirm": "Pe' piacere cunfermate ca overo vulite ffà chesto, ca cunuscete 'e cunseguenze, e ca state facenno chesto rispettanno 'e [[{{MediaWiki:Policy-url}}|linee guida]].",
        "revdelete-suppress-text": "Sti luvamiente hana essere fatte '''unicamente''' dint' 'e situaziune ccà abbascio:\n* nfurmaziune potenzialmente diffamatorie\n* date perzunale inopportune\n*: ''indirizze, nummeri 'e telefono, codece fiscale, ecc.''",
        "revdelete-legend": "Miette 'e limmete 'e visibilità",
        "revdelete-hide-text": "Testo d' 'a verziona",
        "revdelete-modify-no-access": "Nun se può cagnà l'oggetto cu data $2, $1: pecché st'oggetto è stato nzegnàto comme \"riservato\".\nVuje nun avete acciesso.",
        "revdelete-modify-missing": "Nun se può cagnà l'oggetto cu l'ID $1 pecché nun è prisente int' 'o database.",
        "revdelete-no-change": "'''Attenziò:''' l'oggetto cu data $2, $1 teneva già 'e mpustaziune 'e visibbilità addimannate.",
-       "revdelete-concurrent-change": "Nun se può cagnà l'oggetto cu data $2, $1: 'O status 'e chisto pare ch'è stato cagnato pe cocch'utente pe' tramente ca 'o stive a cagnà.\nPe' piacere cuntrolla 'o riggistro.",
+       "revdelete-concurrent-change": "Nun se può cagnà l'oggetto cu data $2, $1: 'O status 'e chisto pare ch'è stato cagnato pe cocch'utente pe' tramente ca 'o stavate a cagnà.\nPe' piacere cuntrullate 'o riggistro.",
        "revdelete-only-restricted": "Errore quanno s'annasconneva l'oggetto cu data $2, $1: Nun può luvà oggette d' 'a vista 'e ll'ammenistratore senza scegliere manco una 'e l'ati ozzione 'e visibbelità.",
        "revdelete-reason-dropdown": "* Mutive comune pe' ffà scancellamiento\n** Violazione d' 'o copyright\n** Cummente o nfurmaziune perzunale inappropriate\n** Nomme utente inappropriato\n** Nfurmazione potenzialmente diffamatoria",
        "revdelete-otherreason": "Ati/cchiù ragiune:",
        "mergehistory-submit": "Aunisce 'e verziune",
        "mergehistory-empty": "Nun ce stanno virziune pe' putè ffà l'aunione.",
        "mergehistory-success": "{{PLURAL:$3|Na virziona 'e [[:$1]] è stata aunita|$3 versiune 'e [[:$1]] so' state aunite}} â cronologgia 'e [[:$2]].",
-       "mergehistory-fail": "Nun se ponno aunì 'e cronologgie. Pe' piacere cuntrolla n'ata vota 'a paggena e li parametre tempurale.",
+       "mergehistory-fail": "Nun se ponno aunì 'e cronologgie. Pe' piacere cuntrullate n'ata vota 'a paggena e li parametre tempurale.",
        "mergehistory-fail-toobig": "Nun se può fà l'aunione d' 'a cronologgia cu nu lémmeto 'e n'ati $1 {{PLURAL:$1|revisione|rivisiune}} 'a cagnà posto.",
        "mergehistory-no-source": "'A paggena d'origgine $1 nun esiste.",
        "mergehistory-no-destination": "'A paggena 'e destinazione $1 nun esiste.",
        "preferences": "Preferenze d''e mmeje",
        "mypreferences": "Preferenze d''e mmeje",
        "prefs-edits": "Cagnamiente affettuate:",
-       "prefsnologintext2": "Pe' piacere, tràse pe' cagnà 'e preferenze tuje.",
+       "prefsnologintext2": "Pe' piacere, trasite pe' cagnà 'e preferenze voste.",
        "prefs-skin": "Aspetto grafeco (skin)",
        "skin-preview": "Anteprimma",
        "datedefault": "Nisciuna preferenza",
        "recentchangeslinked-feed": "Cagnamiénte cullegate",
        "recentchangeslinked-toolbox": "Cagnamiénte cullegate",
        "recentchangeslinked-title": "Cagnamiénte cullegate a \"$1\"",
+       "recentchangeslinked-summary": "Chest'è n'alenco d' 'e cagnamiente fatte mò a 'e paggene cullegate 'a chilla specificata (o pe' cuntenute dint'a na categurìa specificata). 'E paggene cuntenute dint' 'o proprio elenco 'e l'[[Special:Watchlist|Paggene cuntrullate]] songo mmustate 'n '''grassetto'''.",
        "recentchangeslinked-page": "Nomme dda paggena",
+       "recentchangeslinked-to": "Mmusta sulamente 'e cagnamiente a 'e paggene cullegate a chilla specificata",
        "upload": "Careca file",
+       "uploadbtn": "Carreca file",
+       "reuploaddesc": "Torna a 'o modulo pe ffà 'a carreca",
+       "upload-tryagain": "Manna 'a descrizione d' 'o file cagnato",
+       "uploadnologin": "Acciesso nun affettuato",
+       "uploadnologintext": "Pe' carrecà 'o file ce vulesse $1.",
+       "upload_directory_missing": "'A cartella 'e carreche ($1) nun esiste e nun se può crià 'a 'o server web.",
+       "upload_directory_read_only": "'O server web nun può scrivere dint' 'a cartella 'e carreca ($1).",
+       "uploaderror": "Errore a carrecà",
+       "upload-recreate-warning": "'Attenziò'': nu file cu stu nomme è stato scancellato o spustato.'''\n'O riggistro d' 'e scancellamiente e d' 'e spustamiente 'e sta paggena è stato scritto ccà abbascio pe' ffà comodo:",
+       "uploadtext": "Ausà 'o modulo ccà sotto pe' carrecà file nuove. Pe' vedé o ascià 'e file carrecate già, vide 'o [[Special:FileList|riggistro 'e file carrecate]]. Càrreche 'e file e virzione nove d' 'e file songo riggistrate dint' 'o [[Special:Log/upload|riggistro d'upload]], 'e scancellamiente dint' 'o [[Special:Log/delete|riggistro ccà]].\n\nPe' nzertà nu file dint'a na paggena, allora facite nu cullegamento 'e stu tipo:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' p'ausà a verziona cumpleta d' 'o file\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|testo alternativo]]</nowiki></code>''' p'ausà na verziona luonga 200 pixel nzertata dint'a na cascia, allineata a manca e cu nu 'testo alternativo' comme didascalia\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' pe' crià nu cullegamento diretto a 'o file senza 'o fà vedé",
+       "upload-permitted": "Tipe 'e file permesse: $1.",
+       "upload-preferred": "Tipe 'e file cunzigliate: $1.",
+       "upload-prohibited": "Tipe 'e file nun permesse: $1.",
+       "uploadlogpage": "Riggistro 'e carreche",
+       "uploadlogpagetext": "Ccà abbascio song'alencate l'urdeme file carrecate.\nCuntrullate 'a [[Special:NewFiles|gallaria d' 'e file nuove]] pe' ve ffà na guardata cchiù visuale 'e tutto.",
+       "filename": "Nomme d' 'o file",
        "filedesc": "Énnece",
+       "fileuploadsummary": "Dettaglie:",
+       "filereuploadsummary": "Cagnamiente a 'o file:",
+       "filestatus": "Stato d' 'o copyright:",
+       "filesource": "Fonte:",
+       "ignorewarning": "Lassa perde l'avviso e sarva 'o file pure",
+       "ignorewarnings": "Lasa perde ogne mmasciata d'attenzione",
+       "minlength1": "'E nomme d' 'e file hann'avé minimo na lettera.",
+       "illegalfilename": "'O nomme \"$1\" cuntene carattere nun permesse dint' 'e titule 'e paggena.\nPe' piacere date n'atu nomme a 'o file e pruvate a 'o carrecà n'ata vota.",
+       "filename-toolong": "'E nomme d' 'e file nun ponno superà 'e 240 byte.",
+       "badfilename": "'O nomme d' 'o file è stato cagnato a \"$1\".",
+       "filetype-mime-mismatch": "'A stensione d' 'o file \".$1\" nun currisponne a 'o tipo MIME scummigliato a 'o file ($2).",
+       "filetype-badmime": "Nun è permesso carrecà file 'e tipo MIME \"$1\".",
+       "filetype-bad-ie-mime": "Nun se ponno carrecà 'e file pecché Internet Explorer 'o scummigliasse comme \"$1\", che è nu tipo 'e file nun permesso e potenzialmente pericoloso.",
+       "filetype-unwanted-type": "Carrecà file 'e tipo '''\".$1\"''' è scunzigliato. {{PLURAL:$3|'O tipo 'e file cunzigliato è|'E tipe 'e file cunzigliate songo}} $2.",
+       "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|nun è nu tipo 'e file permesso|nun songo tipe 'e file permesse}}. {{PLURAL:$3|'O tipo 'e file permesso è|'E tipe 'e file permesse songo}} $2.",
+       "filetype-missing": "'O file nun ave stensione (p'esempio \".jpg\").",
+       "empty-file": "'O file ch'avite mannato è abbacante.",
+       "file-too-large": "'O file ch'avite mannato è troppo gruosso.",
+       "filename-tooshort": "'O nomme d' 'o file è troppo curto.",
+       "filetype-banned": "Stu tipo 'e file nun è permesso.",
+       "verification-error": "Stu file nun ha passat' 'o cuntrollo.",
+       "hookaborted": "'O cagnamiento c'avite pruvato 'e fà è stato spezzato 'a na stensione.",
+       "illegal-filename": "'O nomme d' 'o file nun è permesso.",
+       "overwrite": "Sovrascrivere nu file ch'esiste già nun è permesso.",
+       "unknown-error": "È capitato n'errore scanusciuto.",
+       "tmp-create-error": "Nun se può crià nu file temporaneo.",
+       "tmp-write-error": "Errore a scrivere nu file temporaneo.",
+       "large-file": "S'arraccumanna 'e nun appassà 'e diminsione 'e $1 p'ogne file; stu file è gruosso $2.",
+       "largefileserver": "Stu file appassa 'e dimensiune permesse 'a la configurazione d' 'o server",
+       "emptyfile": "'O file carrecato mò mò pare abbacante. Può darse ch'è stato n'errore int' 'o nomme d' 'o file. Cuntrullate ca vulite overamente carrecà stu file.",
+       "windows-nonascii-filename": "Chista wiki nun supporta nomme d' 'e file cu carattere spiciale",
+       "fileexists": "Nu file cu stu nomme esiste già.\nPe' piacere cuntrullate primma <strong>[[:$1]]</strong> si nun site sicure ca 'o vulite cagnà.\n[[$1|thumb]]",
+       "filepageexists": "'A paggena 'e descrizione 'e stu file è stata già criata a l'indirizzo <strong>[[:$1]]</strong>, pùre si nun esiste ancora nu file cu stu nomme. 'A descrizione 'e l'oggetto nzertàta 'n fase 'e carreca nun cumparerrà ncopp' 'a paggena 'e descrizione. Pe' ffà l'oggetto cumparì ncopp' 'a paggena 'e descrizione, l'avisseve 'a cagnà manualmente.\n[[$1|thumb]]",
+       "fileexists-extension": "Nu file esiste cu nu nomme suoccio a chesto: [[$2|thumb]]\n* Nomme d' 'o file carrecato: <strong>[[:$1]]</strong>\n* Nomme d' 'o file esistente: <strong>[[:$2]]</strong>\nPuò darse ca vulite scegliere nu nomme cchiù specifico?.",
+       "fileexists-thumbnail-yes": "Pare ch' 'o file carrecato fosse na miniatura ''(thumbnail)''. [[$1|thumb]]\nCuntrullate, pe' cunfronto, 'o file <strong>[[:$1]]</strong>.\nSi se trattasse d' 'a stessa immaggene, ch' 'e diminsiune origginale, nun è necessario carrecà ati miniature.",
+       "file-thumbnail-no": "Stu filename accummencia pe' <strong>$1</strong>.\nPare ca ce sta n'immaggene piccerilla <em>(thumbnail)</em>.\nSi tiene st'immaggene 'n risoluzione origginale, pe' piacere carrecatela. Si nò, vedite 'e cagnà 'o nomme d' 'o file.",
+       "fileexists-forbidden": "Nu file cu stu nomme esiste già, e nun se può sovrascrivere.<br/>\nPe' piacere turnat'arreto e cagnàte 'o nomme p' 'o turnà a carrecà.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Nu file cu stu nomme esiste già dint'a l'archivio 'e risorse multimediale spartute. Si vulite carrecà 'o file ancora, turnat'arreto e cagnate 'o nomme p' 'o turnà a carrecà.\n[[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "Stu file è nu duplicato {{PLURAL:$1|d' 'o|d' 'e}} file ccà abbascio:",
+       "file-deleted-duplicate": "Nu file identico a chesto ([[:$1]]) è stato scancellato prima. Cuntrullate 'a cronologgia d' 'e scancellamiente apprimma d' 'o carrecà n'ata vota.",
+       "file-deleted-duplicate-notitle": "Nu file eguale a stu file è stato previamente scancellato, e 'o titolo è stato sbaccantato. Chierete a coccheruno ca tenesse 'a posibbelità 'e vedé file luvate e sbaccantate pe' sapé nquale situazione ve truvate apprimma d' 'o ffà carrecà n'ata vota.",
+       "uploadwarning": "Avviso 'e carreca",
+       "uploadwarning-text": "Pe' piacere cagnate ccà abbascio 'a descrizione d' 'o file 'e pruvate n'ata vota.",
+       "savefile": "Sarva file",
+       "uploaddisabled": "'E càrreche so' state stutate.",
+       "copyuploaddisabled": "'E càrreche pe' bbia 'e l'URL so' state stutate.",
+       "uploaddisabledtext": "'E carreche 'e file so' state stutate.",
+       "php-uploaddisabledtext": "'E càrreche 'e file pe' bbia d' 'o PHP so' state stutate. Cuntrullate 'a configurazione d' 'o file_uploads.",
+       "uploadscripted": "Stu file cuntene codece HTML o script, ca se putesse nterpretà erroneamente 'a nu navigatóre web.",
+       "uploadscriptednamespace": "Stu file SVG cuntene nu namespace '$1' nun permesso.",
+       "uploadinvalidxml": "'O códece XML d' 'o file carrecato nun se può passà.",
+       "uploadvirus": "Stu file cuntene nu virus! Dettaglie: $1",
+       "uploadjava": "Stu file è nu file ZIP ca cuntene nu file .class Java.\nCarrecà 'e file Java nun è permesso, pecché ponno appassà 'e restriziune 'e sicurezza.",
+       "upload-source": "File d'origgine",
+       "sourcefilename": "Nomme d' 'o file d'origgine:",
+       "sourceurl": "URL d'origgine:",
+       "destfilename": "Nomme 'e file 'e destinazione:",
+       "upload-maxfilesize": "Diminsione massima d' 'o file: $1",
+       "upload-description": "Descrizione d' 'o file",
+       "upload-options": "Ozziune 'e carreca",
+       "watchthisupload": "Tiene d'uocchio chistu file",
+       "filewasdeleted": "Nu file ca se chiamave cumm'a chillo c'avete primma carrecato e pò è stato scancellato.\nVedite 'e cuntrullà 'o $1 apprimma ca cuntinuate c' 'a carreca.",
+       "filename-bad-prefix": "'O nomme d' 'o file ca state a carrecà accummencia pe' ''\"$1\"''', ca nurmalmente è 'o nomme c'assegnasse na machina fotografeca automatecamente ed è nu nomme nun descrittivo.\nPe' piacere scigliete n'atu nomme ca fosse cchiù descrittivo.",
+       "upload-success-subj": "Carreca ngarrata",
+       "upload-success-msg": "'A carreca tuja d' 'o [$2] è asciuta bona. Mò è disponibbele ccà: [[:{{ns:file}}:$1]]",
+       "upload-failure-subj": "Prubblema c' 'a carreca",
+       "upload-failure-msg": "Ce steva nu prubblema c' 'a carreca 'a [$2]:\n\n$1",
+       "upload-warning-subj": "Avviso 'e carreca",
+       "upload-warning-msg": "Ce steva nu prubblema c' 'a carreca 'a [$2]. Putite turnà arreto a 'o [[Special:Upload/stash/$1|module 'e carreche]] pe pruvà d'aggiustà stu prubblema.",
+       "upload-proto-error": "Prutucollo sbagliato",
+       "upload-proto-error-text": "'E carreche remote hann'abbesuogno 'e l'URL c'accummencieno c' 'a parola <code>http://</code> o <code>ftp://</code>.",
+       "upload-file-error": "Errore 'nterno",
+       "upload-file-error-text": "S'è verificato n'errore interno quanno avete pruvat'a crià nu file temporaneo ncopp' 'o server.\nPe' piacere cuntattate n'[[Special:ListUsers/sysop|ammenistratore]].",
+       "upload-misc-error": "Errore 'e carreche scanusciute",
+       "upload-misc-error-text": "N'errore scanusciuto s'è verificato quannto se steva facenno 'a carreca.\nPe' piacere cuntrullate ca l'URL è valida e accessibbele e pruvate n'ata vota.\nSi 'o prubblema è presente ancòra, cuntattate n'[[Special:ListUsers/sysop|ammenistratore]].",
+       "upload-too-many-redirects": "L'URL teneva troppe redirect",
+       "upload-http-error": "N'errore HTTP è succiesso: $1",
+       "upload-copy-upload-invalid-domain": "Nun è permessa 'a carreca 'e copie 'a chistu dumminio.",
+       "backend-fail-stream": "Nun se può mannà 'o file \"$1\".",
+       "backend-fail-backup": "Nun se può ffà 'o backup d' 'o file \"$1\".",
+       "backend-fail-notexists": "'O file $1 nun esiste.",
+       "backend-fail-hashes": "Nun se ponno attené 'e hash d' 'o file pe' ne ffà 'o cunfronto.",
+       "backend-fail-notsame": "Esiste già nu file nun eguale a $1 .",
+       "backend-fail-invalidpath": "$1 nun è un nu posto d'archiviazione bbuono.",
+       "backend-fail-delete": "Nun se può scancellà 'o file \"$1\"",
+       "backend-fail-describe": "Nun se ponno cagnà 'e metadate d' 'o file \"$1\".",
+       "backend-fail-alreadyexists": "'O file $1 esiste già.",
+       "backend-fail-store": "Nun se può astipà 'o file \"$1\" dint'a \"$2\".",
+       "backend-fail-copy": "Nun se può copiare 'o file \"$1\" dint'a \"$2\".",
+       "backend-fail-move": "Nun se può spustà 'o file \"$1\" into \"$2\".",
+       "backend-fail-opentemp": "Nun se può arapì nu file temporaneo.",
+       "backend-fail-writetemp": "Nun se può scrivere nu file temporaneo.",
+       "backend-fail-closetemp": "Nun se può nchiure nu file temporaneo.",
+       "backend-fail-read": "Nun se può lieggere 'o file \"$1\".",
+       "backend-fail-create": "Nun se può scrivere 'o file \"$1\"",
+       "backend-fail-maxsize": "Nun se può scrivere 'o file \"$1\" pecché chist'è cchiù gruosso 'e {{PLURAL:$2|nu byte|$2 byte}}",
+       "backend-fail-readonly": "L'archivio 'e rezza \"$1\" è mò mò 'n sola-lettura. 'O mutivo è: \"$2\"",
+       "backend-fail-synced": "'O file \"$1\" è int' 'a nu stato ncunzistente dint'a l'archivie nterne.",
+       "backend-fail-connect": "Nun se può cunnettà â memoria 'e rezza \"$1\".",
+       "backend-fail-internal": "N'errore scanusciuto s'è verificato int'a l'archivie 'e rezza \"$1\".",
+       "backend-fail-contenttype": "Nun se ponno determinà 'e tipe 'e cuntenute d' 'o file 'a riggistrà dint'a \"$1\".",
+       "backend-fail-batchsize": "L'archivio 'e rezza prugrammaje na rezza 'e $1 {{PLURAL:$1|prucesso|prucesse}} ncopp' 'o file; 'o lémmeto è $2 {{PLURAL:$2|prucesso|prucesse}}.",
+       "backend-fail-usable": "Nun se può lieggere o scrivere 'o file \"$1\" pecché mancano 'e permesse sufficiente o nun esiste 'a cartella/cuntenitore.",
+       "filejournal-fail-dbconnect": "Nun se può fà connessione a l'archivio d' 'o database pe' puté astipà archivie 'n rezza \"$1\".",
+       "filejournal-fail-dbquery": "Nun se può agghiurnà l'archivio d' 'o database pe' puté astipà l'archivie 'n rezza \"$1\".",
+       "lockmanager-notlocked": "Nun se può sbloccà \"$1\"; nun è bluccato.",
+       "lockmanager-fail-closelock": "Nun se può nchiure 'o file 'e blocco pe' \"$1\".",
+       "lockmanager-fail-deletelock": "Nun se può scancellà 'o file 'e blocco pe' \"$1\".",
+       "lockmanager-fail-acquirelock": "Nun se può piglià 'o blocco pe' \"$1\".",
+       "lockmanager-fail-openlock": "Nun se può arapì 'o file 'e blocco pe' \"$1\".",
+       "lockmanager-fail-releaselock": "Nun se può lanzà 'o blocco pe' \"$1\".",
+       "lockmanager-fail-db-bucket": "Nun se ponno cuntattà 'e database 'e blocco necessarie int'a $1.",
+       "lockmanager-fail-db-release": "Nun se ponno lanzà 'e blocche ncopp' 'o database $1.",
+       "lockmanager-fail-svr-acquire": "Nun se ponno piglià 'e blocche ncopp' 'o server $1.",
+       "lockmanager-fail-svr-release": "Nun se ponno lanzà blocche ncopp' 'o server $1.",
+       "zip-file-open-error": "S'è truvato n'errore quanno se steva arapenno nu file pe' ne fà cuntrolle ZIP.",
+       "zip-wrong-format": "'O file specificato nun era nu file ZIP.",
+       "zip-bad": "'O file è corrotto o pure nun è nu file ZIP ca se putesse lieggere.\nNun se può cuntrullà opportunamente pe' sicurezza.",
+       "zip-unsupported": "'O file è nu file ZIP c'ausa servizie ZIP ca nun songo suppurtate 'a MediaWiki.\nNun se può cuntrullà pe' sicurezza.",
+       "uploadstash": "Carreca stash",
+       "uploadstash-summary": "Sta paggena dà l'accesso a 'e file ca songo carrecate o ca stanno pe' se carrecà, ma nun songo pubbrecat'ancora ncopp'a sta wiki. Sti file nun songo visibbele a nisciuno, sulamente a chill'utente ca l'ha carrecato.",
+       "uploadstash-clear": "Pulezza 'e file annascunnute",
+       "uploadstash-nofiles": "Nun tenite file annascunnute.",
+       "img-auth-nofile": "File \"$1\" nun esiste.",
+       "img-auth-streaming": "\"$1\" 'n streaming.",
+       "http-read-error": "Errore 'e lettura HTTP.",
        "license": "Licenze:",
        "license-header": "Licenza",
+       "nolicense": "Nisciuna licienza scigliuta",
        "licenses-edit": "Càgna opzziune 'e licenza",
+       "license-nopreview": "(Anteprimma nun disponibbele)",
+       "listfiles-delete": "scancèlla",
+       "imgfile": "file",
+       "listfiles_date": "Data",
        "listfiles_name": "Nomme",
+       "listfiles_user": "Utente",
+       "listfiles_size": "Dimenzione",
+       "listfiles_description": "Descrizzione",
+       "listfiles_count": "Verziune",
+       "listfiles-latestversion": "Verzione 'e mo",
+       "listfiles-latestversion-yes": "Sì",
+       "listfiles-latestversion-no": "No",
        "file-anchor-link": "Fiùra",
        "filehist": "Cronologgia d\"o file",
+       "filehist-help": "Ffà click su nu gruppo data/ora pe' vedé 'o file comme s'apprisentava ind' 'a chillu mumento.",
+       "filehist-deleteall": "scancella tutto",
+       "filehist-deleteone": "scancèlla",
        "filehist-revert": "ripristina",
        "filehist-current": "attuale",
        "filehist-datetime": "Data/Ora",
        "filehist-thumb": "Miniature",
        "filehist-user": "Utente",
        "filehist-dimensions": "Dimenzione",
+       "filehist-comment": "Commento",
        "imagelinks": "Jonte ê ffiure",
+       "shared-repo-from": "'a $1",
+       "filedelete": "Scancella $1",
+       "filedelete-legend": "Scancella 'o file",
+       "filedelete-intro": "State pe' scancellà 'o file '''[[Media:$1|$1]]''' cu tutta 'a cronologgia 'e chisto.",
+       "filedelete-comment": "Mutivo:",
+       "filedelete-submit": "Scancèlla",
+       "filedelete-success": "'O file '''$1''' è stato scancellato.",
+       "filedelete-success-old": "'A verziona d' 'o file '''[[Media:$1|$1]]''' d' 'o  $3, $2  è stata scancellata.",
+       "filedelete-nofile": "Nun esiste nu file '''$1'''.",
+       "filedelete-reason-otherlist": "Ati ragiune",
+       "filedelete-reason-dropdown": "*Mutive cchiù commune p' 'o scancellà\n** Violazione d' 'o copyright\n** File duplicato",
+       "filedelete-edit-reasonlist": "Càgna 'e mutive pe' fà 'o scancellamiento",
        "randompage": "Na paggena qualsiase",
        "randompage-nopages": "Nun gè song paggene {{PLURAL:$2|dint'ô seguente namespace|dint'ê seguenti namespace}}: $1.",
        "statistics": "Statistiche",
        "linksearch-ok": "Truova",
        "linksearch-line": "$1 presente dint'â paggena $2",
        "emailuser": "Email chisto utente",
-       "mywatchlist": "osservate speciale",
+       "mywatchlist": "Paggene cuntrullate",
        "watchlistfor2": "Ppe $1 $2",
        "watch": "Secuta",
        "unwatch": "Nun segui",
index edbf068..043f7f6 100644 (file)
        "broken-file-category": "Страницы с неработающими файловыми ссылками",
        "about": "Описание",
        "article": "Статья",
-       "newwindow": "(в новом окне)",
+       "newwindow": "&nbsp;(в новом окне)",
        "cancel": "Отменить",
        "moredotdotdot": "Далее…",
        "morenotlisted": "Этот список не является полным.",
index 48d5297..586a934 100644 (file)
@@ -34,7 +34,7 @@
        "tog-enotifusertalkpages": "Imbia·mi una post.el. cando sa pàgina de sas cuntierras meas est cambiada",
        "tog-enotifminoredits": "Imbia·mi una post.el. fintzas pro sos càmbios minores de sas pàginas e documentos",
        "tog-enotifrevealaddr": "Faghe ischire s'indiritzu de sa post.el. mea in sas notìficas de sa post.els",
-       "tog-shownumberswatching": "Ammustra su nùmeru de sos utentes chi sunt castiende sa pàgina",
+       "tog-shownumberswatching": "Ammustra su nùmeru de is impitadores chi ant annotadu sa pàgina",
        "tog-oldsig": "Firma atuale:",
        "tog-fancysig": "Trata sa firma comente unu testu wiki (sena ligàmenes automàticos)",
        "tog-uselivepreview": "Imprea sa funtzione \"anteprima bia\" (isperimentale)",
        "tog-watchlisthideown": "Cua sas mudas meas dae sa watclist",
        "tog-watchlisthidebots": "Cua sas mudas de sos bots dae sa watchlist",
        "tog-watchlisthideminor": "Cua sos càmbios minores dae sa watchlist",
-       "tog-watchlisthideliu": "Cua sos càmbios de sos utentes intrados dae sa watchlist",
-       "tog-watchlisthideanons": "Cua sos càmbios de sos utentes anònimos dae sa watchlist",
+       "tog-watchlisthideliu": "Cua is càmbios de is impitadores identificados dae sa lista de pàginas annotadas",
+       "tog-watchlisthideanons": "Cua is càmbios de is impitadores anònimos dae sa lista de pàginas annotadas",
        "tog-watchlisthidepatrolled": "Cua mudas verificadas dae sa watchlist",
-       "tog-ccmeonemails": "Imbia·mi sas còpias de sas post.els chi imbio a sos àteros utentes",
+       "tog-ccmeonemails": "Imbia·mi sas còpias de is emails chi imbio a is àteros impitadores",
        "tog-diffonly": "No ammustras su cuntènnidu de sa pàgina a pustis de sa bisura de is diferèntzias",
        "tog-showhiddencats": "Ammustra sas categorias cuadas",
        "tog-norollbackdiff": "Cua sa bisura de is diferèntzias a pustis de su rollback",
        "talk": "Cuntierras",
        "views": "Vistas",
        "toolbox": "Ainas",
-       "userpage": "Càstia sa pàgina utente",
+       "userpage": "Càstia sa pàgina impitadore",
        "projectpage": "Càstia sa pàgina meta",
        "imagepage": "Càstia sa pàgina de su documentu",
        "mediawikipage": "Càstia su messàgiu",
        "privacypage": "Project:Polìtica pro sos datos privados",
        "badaccess": "Permissu non bastante",
        "badaccess-group0": "Non ses autorizadu a fàghere s'atzione chi boles",
-       "badaccess-groups": "S'atzione chi boles est limitada a utentes in {{PLURAL:$2|su grupu|unu de sos grupos}}: $1.",
+       "badaccess-groups": "S'atzione chi as rechestu est limitada a impitadores in {{PLURAL:$2|su grupu|unu de is grupos}}: $1.",
        "versionrequired": "Bi bolet sa version $1 de MediaWiki",
        "versionrequiredtext": "Bi bolet sa versione $1 de MediaWiki pro impreare custa pàgina.\nCàstia [[Special:Version|version page]].",
        "ok": "Andat bene",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "retrievedfrom": "Bogadu dae  \"$1\"",
        "youhavenewmessages": "Tenes $1 ($2).",
-       "youhavenewmessagesmanyusers": "Tenes $1 dae utentes ($2).",
+       "youhavenewmessagesmanyusers": "Tenes $1 dae unos cantos impitadores ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|unu messàggiu nou|999=messàggios noos}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|ùrtima muda|999=ùrtimas mudàntzias}}",
        "youhavenewmessagesmulti": "Tenes messàgios noos in $1",
        "sort-descending": "Òrdine in falada",
        "sort-ascending": "Òrdine in artziada",
        "nstab-main": "Pàgina",
-       "nstab-user": "Pàgina utente",
+       "nstab-user": "Pàgina impitadore",
        "nstab-media": "Documentu multimediale",
        "nstab-special": "Pàgina ispetziale",
        "nstab-project": "Pàgina de servìtziu",
        "mailerror": "Faddina imbiende su messàgiu: $1",
        "emailauthenticated": "S'indiritzu e-mail tuo est istadu autenticau su $2 a is $3.",
        "emailconfirmlink": "Cunfirma s'indiritzu e-mail tuo",
+       "emaildisabled": "Custu giassu non podet imbiare emails.",
        "accountcreated": "Contu creadu",
        "accountcreatedtext": "Su contu de s'impitadore [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) est stadu creadu.",
        "createaccount-title": "Creatzione de unu contu pro {{SITENAME}}",
        "rev-showdeleted": "ammustra",
        "revdelete-no-file": "Su documentu ispetzuficadu no esistit",
        "revdelete-show-file-submit": "Eja",
+       "revdelete-hide-text": "Testu de sa versione",
+       "revdelete-hide-image": "Cua su cuntènnidu de su documentu",
        "revdelete-radio-set": "Cua",
        "revdelete-radio-unset": "Ammustra",
        "revdelete-log": "Motivu:",
        "deletedhist": "Istòria fuliada",
        "revdelete-otherreason": "Motivu diversu o agiuntivu:",
        "revdelete-reasonotherlist": "Àteru motivu",
+       "revdelete-edit-reasonlist": "Càmbia su motivu de sa burradura",
+       "revdelete-offender": "Autore de sa versione:",
        "mergehistory-from": "Pàgina de orìgine:",
        "mergehistory-into": "Pàgina de destinatzione:",
        "mergehistory-no-source": "Sa pàgina de orìgine $1 no esistit.",
        "lineno": "Lìnia $1:",
        "compareselectedversions": "Cumpara versiones scioberadas",
        "editundo": "annulla",
+       "diff-empty": "(Diferèntzia peruna)",
        "searchresults": "Resurtados de sa chirca",
        "searchresults-title": "Resurtados pro sa chirca de \"$1\"",
        "titlematches": "Currispondèntzias in su tìtulu de s'artìculu",
        "prefs-edits": "Nùmeru de acontzos:",
        "prefs-skin": "Bisura",
        "skin-preview": "Antiprima",
+       "datedefault": "Peruna preferèntzia",
+       "prefs-user-pages": "Paginas impitadore",
        "prefs-personal": "Datos personales",
        "prefs-rc": "Ùrtimas mudàntzias",
        "prefs-watchlist": "Watchlist",
        "movethispage": "Move custa pàgina (càmbia su tìtulu)",
        "unusedimagestext": "Is files ki sighint sunt stados carrigados ma non sunt impreados.\nDia podent essere immàgines impreadas dae àteros giassos cun unu ligàmine diretu, e tando podent essere listados inoghe comente usu ativu.",
        "notargettitle": "Perunu obietivu",
-       "notargettext": "Non hai specificato una pagina o un Utente in relazione al quale eseguire l'operazione richiesta.",
+       "notargettext": "Non as ispetzificadu una pàgina o unu impitadore pro issucutare custa funtzione.",
        "pager-newer-n": "{{PLURAL:$1|1 prus nou|$1 prus nous}}",
        "pager-older-n": "{{PLURAL:$1|1 prus betzu|$1 prus betzos}}",
        "booksources": "Fontes libràrias",
index 346929e..33b1d5a 100644 (file)
        "showpreview": "Visa förhandsgranskning",
        "showdiff": "Visa ändringar",
        "blankarticle": "<strong>Varning:</strong> Sidan du skapar är tom.\nOm du klickar på \"{{int:savearticle}}\" igen kommer sidan skapas utan något innehåll.",
-       "anoneditwarning": "'''Varning:''' Du är inte inloggad.\nDin IP-adress kommer att sparas i historiken för den här sidan.",
+       "anoneditwarning": "<strong>Varning:</strong> Du är inte inloggad. Din IP-adress kommer att vara publikt synlig om du gör några redigeringar. Om du <strong>[$1 loggar in]</strong> eller <strong>[$2 skapar ett konto]</strong> kommer dina redigeringar att tillskrivas ditt användarnamn, tillsammans med andra fördelar.",
        "anonpreviewwarning": "''Du är inte inloggad. Om du sparar kommer din IP-adress registreras på denna sidas redigeringshistorik.''",
        "missingsummary": "'''Påminnelse:''' Du har inte skrivit någon redigeringskommentar.\nOm du klickar på \"{{int:savearticle}}\" igen, kommer din redigering att sparas utan en sådan.",
        "missingcommenttext": "Var god och skriv in en kommentar nedan.",
index fbe40c2..0adec18 100644 (file)
        "logentry-rights-rights-legacy": "$1, $3 için grup üyeliğini {{GENDER:$2|değiştirdi}}",
        "logentry-rights-autopromote": "$1, $4 iken $5 olarak otomatik {{GENDER:$2|terfi edildi}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|yükledi}} $3",
+       "logentry-upload-overwrite": "$1 $3 dosyasının yeni bir sürümünü {{GENDER:$2|yükledi}}",
        "rightsnone": "(hiçbiri)",
        "feedback-bugornote": "Eğer teknik bir problemi detaylarıyla açıklamaya hazırsanız lütfen [$1 bir hata raporlayın]. Diğer taraftan, aşağıdaki kolay formu kullanabilirsiniz. Yorumunuz, kullanıcı adınızla beraber \"[$3 $2]\" sayfasına eklenecektir.",
        "feedback-subject": "Konu:",
index 88b051e..d5fcdf5 100644 (file)
        "october-date": "10月$1日",
        "november-date": "11月$1日",
        "december-date": "12月$1日",
-       "pagecategories": "{{PLURAL:$1|个分类}}",
+       "pagecategories": "{{PLURAL:$1|分类|$1个分类}}",
        "category_header": "分类“$1”中的页面",
        "subcategories": "子分类",
        "category-media-header": "分类“$1”中的媒体文件",
index 2886e08..cf17aef 100644 (file)
@@ -9,7 +9,7 @@
                                .replace( /__+/g, '_' )
                                .replace( /^_+/, '' )
                                .replace( /_+$/, '' );
-                       value = value.substr( 0, 1 ).toUpperCase() + value.substr( 1 );
+                       value = value.charAt( 0 ).toUpperCase() + value.slice( 1 );
                        $label.text( labelText.replace( '$1', value ) );
                }
 
index 8c42118..c6bd868 100644 (file)
Binary files a/mw-config/images/installer-logo.png and b/mw-config/images/installer-logo.png differ
index eb36ee5..946f3c9 100644 (file)
@@ -83,33 +83,27 @@ return array(
         */
        'mediawiki.skinning.elements' => array(
                'styles' => array(
-                       'commonElements.css' => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki.skinning/elements.css' => array( 'media' => 'screen' ),
                ),
-               'remoteSkinPath' => 'common',
-               'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/common',
        ),
        'mediawiki.skinning.content' => array(
                'styles' => array(
-                       'commonElements.css' => array( 'media' => 'screen' ),
-                       'commonContent.css' => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki.skinning/elements.css' => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki.skinning/content.css' => array( 'media' => 'screen' ),
                ),
-               'remoteSkinPath' => 'common',
-               'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/common',
        ),
        'mediawiki.skinning.interface' => array(
                // Used in the web installer. Test it after modifying this definition!
                'styles' => array(
-                       'commonElements.css' => array( 'media' => 'screen' ),
-                       'commonContent.css' => array( 'media' => 'screen' ),
-                       'commonInterface.css' => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki.skinning/elements.css' => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki.skinning/content.css' => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki.skinning/interface.css' => array( 'media' => 'screen' ),
                ),
-               'remoteSkinPath' => 'common',
-               'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/common',
        ),
 
        'mediawiki.skinning.content.parsoid' => array(
                // Style Parsoid HTML+RDFa output consistent with wikitext from PHP parser
-               // with the commonInterface.css styles; skinStyles should be used if your
+               // with the interface.css styles; skinStyles should be used if your
                // skin over-rides common content styling.
                'skinStyles' => array(
                        'default' => 'resources/src/mediawiki.skinning/content.parsoid.less',
index 02d17b0..8142930 100644 (file)
 /*!
- * OOjs UI v0.1.0-pre (43f379c884)
+ * OOjs UI v0.1.0-pre (36d0c7dc3b)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-08-28T21:49:12Z
+ * Date: 2014-09-04T00:40:40Z
  */
-.oo-ui-rtl{direction:rtl}.oo-ui-ltr{direction:ltr}.oo-ui-buttonedElement>.oo-ui-buttonedElement-button{cursor:pointer;display:inline-block;vertical-align:middle;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.oo-ui-buttonedElement>.oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{display:none}.oo-ui-buttonedElement>.oo-ui-buttonedElement-button>.oo-ui-indicatedElement-indicator{display:none}.oo-ui-buttonedElement.oo-ui-widget-disabled>.oo-ui-buttonedElement-button{cursor:default}.oo-ui-buttonedElement.oo-ui-indicatedElement>.oo-ui-buttonedElement-button>.oo-ui-indicatedElement-indicator,.oo-ui-buttonedElement.oo-ui-iconedElement>.oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{display:inline-block;vertical-align:middle;background-position:center center;background-repeat:no-repeat}.oo-ui-buttonedElement-frameless{display:inline-block;position:relative}.oo-ui-buttonedElement-frameless>.oo-ui-buttonedElement-button>.oo-ui-labeledElement-label{display:inline-block;vertical-align:middle}.oo-ui-buttonedElement-framed>.oo-ui-buttonedElement-button{display:inline-block;vertical-align:top;text-align:center}.oo-ui-buttonedElement-framed>.oo-ui-buttonedElement-button>.oo-ui-labeledElement-label{display:inline-block;vertical-align:middle}.oo-ui-buttonedElement-framed.oo-ui-widget-disabled>.oo-ui-buttonedElement-button,.oo-ui-buttonedElement-framed.oo-ui-widget-disabled.oo-ui-buttonedElement-active>.oo-ui-buttonedElement-button,.oo-ui-buttonedElement-framed.oo-ui-widget-disabled.oo-ui-buttonedElement-pressed>.oo-ui-buttonedElement-button{cursor:default}.oo-ui-buttonedElement>.oo-ui-buttonedElement-button{color:#333}.oo-ui-buttonedElement>.oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{margin-left:0}.oo-ui-buttonedElement>.oo-ui-buttonedElement-button>.oo-ui-indicatedElement-indicator{margin-right:-.75em}.oo-ui-buttonedElement.oo-ui-indicatedElement>.oo-ui-buttonedElement-button>.oo-ui-indicatedElement-indicator,.oo-ui-buttonedElement.oo-ui-iconedElement>.oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{opacity:.8;width:1.9em;height:1.9em}.oo-ui-buttonedElement-frameless>.oo-ui-buttonedElement-button:hover>.oo-ui-iconedElement-icon,.oo-ui-buttonedElement-frameless>.oo-ui-buttonedElement-button:focus>.oo-ui-iconedElement-icon{opacity:1}.oo-ui-buttonedElement-frameless>.oo-ui-buttonedElement-button:hover>.oo-ui-labeledElement-label,.oo-ui-buttonedElement-frameless>.oo-ui-buttonedElement-button:focus>.oo-ui-labeledElement-label{color:#000}.oo-ui-buttonedElement-frameless>.oo-ui-buttonedElement-button>.oo-ui-labeledElement-label{color:#333;margin-left:.25em}.oo-ui-buttonedElement-frameless.oo-ui-flaggableElement-primary>.oo-ui-buttonedElement-button>.oo-ui-labeledElement-label{color:#087ecc}.oo-ui-buttonedElement-frameless.oo-ui-flaggableElement-constructive>.oo-ui-buttonedElement-button>.oo-ui-labeledElement-label{color:#76ab36}.oo-ui-buttonedElement-frameless.oo-ui-flaggableElement-destructive>.oo-ui-buttonedElement-button>.oo-ui-labeledElement-label{color:#d45353}.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled>.oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{opacity:.2}.oo-ui-buttonedElement-frameless.oo-ui-widget-disabled>.oo-ui-buttonedElement-button>.oo-ui-labeledElement-label{color:#ccc}.oo-ui-buttonedElement-framed>.oo-ui-buttonedElement-button{margin:.1em 0;padding:.2em .8em;border-radius:.3em;text-shadow:0 1px 1px rgba(255,255,255,.5);border:1px #c9c9c9 solid;-webkit-transition:border-color 100ms ease-in-out;-moz-transition:border-color 100ms ease-in-out;-ms-transition:border-color 100ms ease-in-out;-o-transition:border-color 100ms ease-in-out;transition:border-color 100ms ease-in-out;background:#eee;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#fff),color-stop(100%,#ddd));background-image:-webkit-linear-gradient(top,#fff 0,#ddd 100%);background-image:-moz-linear-gradient(top,#fff 0,#ddd 100%);background-image:-ms-linear-gradient(top,#fff 0,#ddd 100%);background-image:-o-linear-gradient(top,#fff 0,#ddd 100%);background-image:linear-gradient(top,#fff 0,#ddd 100%)}.oo-ui-buttonedElement-framed>.oo-ui-buttonedElement-button:hover,.oo-ui-buttonedElement-framed>.oo-ui-buttonedElement-button:focus{border-color:#aaa}.oo-ui-buttonedElement-framed>.oo-ui-buttonedElement-button>.oo-ui-labeledElement-label{line-height:1.9em}.oo-ui-buttonedElement-framed.oo-ui-buttonedElement-active>.oo-ui-buttonedElement-button,.oo-ui-buttonedElement-framed.oo-ui-buttonedElement-pressed>.oo-ui-buttonedElement-button{box-shadow:inset 0 1px 4px 0 rgba(0,0,0,.07);color:#000;border-color:#c9c9c9;background:#eee;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#ddd),color-stop(100%,#fff));background-image:-webkit-linear-gradient(top,#ddd 0,#fff 100%);background-image:-moz-linear-gradient(top,#ddd 0,#fff 100%);background-image:-ms-linear-gradient(top,#ddd 0,#fff 100%);background-image:-o-linear-gradient(top,#ddd 0,#fff 100%);background-image:linear-gradient(top,#ddd 0,#fff 100%)}.oo-ui-buttonedElement-framed.oo-ui-iconedElement>.oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{margin-left:-.5em;margin-right:-.5em}.oo-ui-buttonedElement-framed.oo-ui-iconedElement.oo-ui-labeledElement>.oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{margin-left:-.5em;margin-right:.3em}.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary>.oo-ui-buttonedElement-button{border:solid 1px #a6cee1;background:#cde7f4;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#eaf4fa),color-stop(100%,#b0d9ee));background-image:-webkit-linear-gradient(top,#eaf4fa 0,#b0d9ee 100%);background-image:-moz-linear-gradient(top,#eaf4fa 0,#b0d9ee 100%);background-image:-ms-linear-gradient(top,#eaf4fa 0,#b0d9ee 100%);background-image:-o-linear-gradient(top,#eaf4fa 0,#b0d9ee 100%);background-image:linear-gradient(top,#eaf4fa 0,#b0d9ee 100%)}.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary>.oo-ui-buttonedElement-button:hover,.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary>.oo-ui-buttonedElement-button:focus{border-color:#9dc2d4}.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary.oo-ui-buttonedElement-active>.oo-ui-buttonedElement-button,.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-primary.oo-ui-buttonedElement-pressed>.oo-ui-buttonedElement-button{border:solid 1px #a6cee1;background:#cde7f4;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#b0d9ee),color-stop(100%,#eaf4fa));background-image:-webkit-linear-gradient(top,#b0d9ee 0,#eaf4fa 100%);background-image:-moz-linear-gradient(top,#b0d9ee 0,#eaf4fa 100%);background-image:-ms-linear-gradient(top,#b0d9ee 0,#eaf4fa 100%);background-image:-o-linear-gradient(top,#b0d9ee 0,#eaf4fa 100%);background-image:linear-gradient(top,#b0d9ee 0,#eaf4fa 100%)}.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive>.oo-ui-buttonedElement-button{border:solid 1px #b8d892;background:#daf0be;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#f0fbe1),color-stop(100%,#c3e59a));background-image:-webkit-linear-gradient(top,#f0fbe1 0,#c3e59a 100%);background-image:-moz-linear-gradient(top,#f0fbe1 0,#c3e59a 100%);background-image:-ms-linear-gradient(top,#f0fbe1 0,#c3e59a 100%);background-image:-o-linear-gradient(top,#f0fbe1 0,#c3e59a 100%);background-image:linear-gradient(top,#f0fbe1 0,#c3e59a 100%)}.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive>.oo-ui-buttonedElement-button:hover,.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive>.oo-ui-buttonedElement-button:focus{border-color:#adcb89}.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive.oo-ui-buttonedElement-active>.oo-ui-buttonedElement-button,.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-constructive.oo-ui-buttonedElement-pressed>.oo-ui-buttonedElement-button{border:solid 1px #b8d892;background:#daf0be;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#c3e59a),color-stop(100%,#f0fbe1));background-image:-webkit-linear-gradient(top,#c3e59a 0,#f0fbe1 100%);background-image:-moz-linear-gradient(top,#c3e59a 0,#f0fbe1 100%);background-image:-ms-linear-gradient(top,#c3e59a 0,#f0fbe1 100%);background-image:-o-linear-gradient(top,#c3e59a 0,#f0fbe1 100%);background-image:linear-gradient(top,#c3e59a 0,#f0fbe1 100%)}.oo-ui-buttonedElement-framed.oo-ui-flaggableElement-destructive>.oo-ui-buttonedElement-button{color:#d45353}.oo-ui-buttonedElement-framed.oo-ui-widget-disabled>.oo-ui-buttonedElement-button,.oo-ui-buttonedElement-framed.oo-ui-widget-disabled.oo-ui-buttonedElement-active>.oo-ui-buttonedElement-button,.oo-ui-buttonedElement-framed.oo-ui-widget-disabled.oo-ui-buttonedElement-pressed>.oo-ui-buttonedElement-button{opacity:.5;box-shadow:none;color:#333;background:#eee;border-color:#ccc}.oo-ui-buttonedElement-framed.oo-ui-widget-disabled>.oo-ui-buttonedElement-button:hover,.oo-ui-buttonedElement-framed.oo-ui-widget-disabled.oo-ui-buttonedElement-active>.oo-ui-buttonedElement-button:hover,.oo-ui-buttonedElement-framed.oo-ui-widget-disabled.oo-ui-buttonedElement-pressed>.oo-ui-buttonedElement-button:hover,.oo-ui-buttonedElement-framed.oo-ui-widget-disabled>.oo-ui-buttonedElement-button:focus,.oo-ui-buttonedElement-framed.oo-ui-widget-disabled.oo-ui-buttonedElement-active>.oo-ui-buttonedElement-button:focus,.oo-ui-buttonedElement-framed.oo-ui-widget-disabled.oo-ui-buttonedElement-pressed>.oo-ui-buttonedElement-button:focus{border-color:#ccc;box-shadow:none}.oo-ui-clippableElement-clippable{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable{overflow-y:hidden}.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable{overflow-y:auto}.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded{padding:2em}.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget{position:absolute;top:0;left:0;right:0;bottom:3em;overflow-y:auto}.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget{position:absolute;bottom:0;left:0;right:0}.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout{padding:1.5em}.oo-ui-bookletLayout-outlinePanel{border-right:solid 1px #ddd}.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget{box-shadow:0 0 .25em rgba(0,0,0,.25)}.oo-ui-fieldLayout{margin-bottom:1em}.oo-ui-fieldLayout:before,.oo-ui-fieldLayout:after{content:" ";display:table}.oo-ui-fieldLayout:after{clear:both}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left>.oo-ui-labeledElement-label,.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right>.oo-ui-labeledElement-label{display:block;float:left}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left>.oo-ui-fieldLayout-field,.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right>.oo-ui-fieldLayout-field{display:block;float:left}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right>.oo-ui-labeledElement-label{text-align:right}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline>.oo-ui-labeledElement-label{display:inline-block;vertical-align:middle}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline>.oo-ui-fieldLayout-field{display:inline-block;vertical-align:middle}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top>.oo-ui-labeledElement-label{display:inline-block}.oo-ui-fieldLayout>.oo-ui-popupButtonWidget>.oo-ui-popupWidget>.oo-ui-popupWidget-popup{z-index:1}.oo-ui-fieldLayout:last-child{margin-bottom:0}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left>.oo-ui-labeledElement-label,.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right>.oo-ui-labeledElement-label{padding-top:.5em;margin-right:5%;width:35%}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left>.oo-ui-fieldLayout-field,.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right>.oo-ui-fieldLayout-field{width:60%}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline>.oo-ui-labeledElement-label{padding:.75em .5em .5em}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline>.oo-ui-fieldLayout-field{padding:.5em 0}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top>.oo-ui-labeledElement-label{padding:.5em 0}.oo-ui-fieldLayout>.oo-ui-popupButtonWidget>.oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{margin-top:.25em}.oo-ui-fieldLayout-disabled .oo-ui-labeledElement-label{color:#ccc}.oo-ui-fieldsetLayout{position:relative;margin:0;padding:0;border:none}.oo-ui-fieldsetLayout.oo-ui-iconedElement>.oo-ui-iconedElement-icon{display:block;position:absolute;background-position:center center;background-repeat:no-repeat}.oo-ui-fieldsetLayout+.oo-ui-fieldsetLayout{margin-top:2em}.oo-ui-fieldsetLayout>.oo-ui-labeledElement-label{font-size:1.5em;margin-bottom:.5em;padding:.25em 0}.oo-ui-fieldsetLayout.oo-ui-iconedElement>.oo-ui-labeledElement-label{padding-left:1.75em;line-height:1.33em}.oo-ui-fieldsetLayout.oo-ui-iconedElement>.oo-ui-iconedElement-icon{left:0;top:.25em;width:2em;height:2em}.oo-ui-gridLayout{position:absolute;top:0;left:0;right:0;bottom:0}.oo-ui-panelLayout{position:relative}.oo-ui-panelLayout-scrollable{overflow-y:auto}.oo-ui-panelLayout-expanded{position:absolute;top:0;left:0;right:0;bottom:0}.oo-ui-panelLayout-padded{padding:1.25em}.oo-ui-stackLayout>.oo-ui-panelLayout{display:none}.oo-ui-stackLayout-continuous>.oo-ui-panelLayout{display:block;position:relative}.oo-ui-popupTool .oo-ui-popupWidget-popup,.oo-ui-popupTool .oo-ui-popupWidget-anchor{z-index:4}.oo-ui-popupTool .oo-ui-popupWidget{margin-left:1.25em;font-size:.8em}.oo-ui-toolGroup{display:inline-block;vertical-align:middle;margin:.3em;border-radius:.25em;border:solid 1px transparent;-webkit-transition:border-color 300ms ease-in-out;-moz-transition:border-color 300ms ease-in-out;-ms-transition:border-color 300ms ease-in-out;-o-transition:border-color 300ms ease-in-out;transition:border-color 300ms ease-in-out}.oo-ui-toolGroup-empty{display:none}.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon{background-position:center center;background-repeat:no-repeat}.oo-ui-toolGroup.oo-ui-widget-enabled:hover{border-color:rgba(0,0,0,.1)}.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title{color:#000}.oo-ui-barToolGroup>.oo-ui-iconedElement-icon,.oo-ui-barToolGroup>.oo-ui-labeledElement-label{display:none}.oo-ui-barToolGroup .oo-ui-tool{display:inline-block;position:relative;vertical-align:top}.oo-ui-barToolGroup .oo-ui-tool-link{display:block}.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon{display:block}.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title{display:none}.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link{cursor:default}.oo-ui-barToolGroup .oo-ui-tool-title,.oo-ui-barToolGroup .oo-ui-tool-accel{display:none}.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link{cursor:pointer}.oo-ui-barToolGroup .oo-ui-tool{margin:-1px 0 -1px -1px;border:solid 1px transparent}.oo-ui-barToolGroup .oo-ui-tool:first-child{border-top-left-radius:.25em;border-bottom-left-radius:.25em}.oo-ui-barToolGroup .oo-ui-tool:last-child{margin-right:-1px;border-top-right-radius:.25em;border-bottom-right-radius:.25em}.oo-ui-barToolGroup .oo-ui-tool-link{height:1.5em;padding:.25em}.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon{height:1.5em;width:1.5em;opacity:.8}.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover{border-color:rgba(0,0,0,.2)}.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled{border-color:rgba(0,0,0,.2);box-shadow:inset 0 .07em .07em 0 rgba(0,0,0,.07);background:#f8fbfd;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#f1f7fb),color-stop(100%,#fff));background-image:-webkit-linear-gradient(top,#f1f7fb 0,#fff 100%);background-image:-moz-linear-gradient(top,#f1f7fb 0,#fff 100%);background-image:-ms-linear-gradient(top,#f1f7fb 0,#fff 100%);background-image:-o-linear-gradient(top,#f1f7fb 0,#fff 100%);background-image:linear-gradient(top,#f1f7fb 0,#fff 100%)}.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled+.oo-ui-tool-active.oo-ui-widget-enabled{border-left-color:rgba(0,0,0,.1)}.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon{opacity:.2}.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon{opacity:.8}.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon{opacity:1}.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon{opacity:.2}.oo-ui-popupToolGroup{position:relative;height:2em;min-width:2.5em}.oo-ui-popupToolGroup-handle{display:block;cursor:pointer}.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon{position:absolute;background-position:center center;background-repeat:no-repeat}.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle{cursor:default}.oo-ui-popupToolGroup .oo-ui-toolGroup-tools{display:none;position:absolute;z-index:4}.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon{background-repeat:no-repeat;background-position:center center}.oo-ui-popupToolGroup-active.oo-ui-widget-enabled>.oo-ui-toolGroup-tools{display:block}.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon{display:inline-block;vertical-align:middle}.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title{display:inline-block;vertical-align:middle}.oo-ui-popupToolGroup .oo-ui-tool-accel{display:none}.oo-ui-popupToolGroup.oo-ui-indicatedElement.oo-ui-iconedElement{min-width:3.5em}.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon{top:0;width:2em;height:2em;opacity:.8}.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator{right:0}.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon{left:.25em}.oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label{line-height:2.6em;font-size:.8em;margin:0 1em}.oo-ui-popupToolGroup-header{line-height:2.6em;font-size:.8em;margin:0 .6em;font-weight:700}.oo-ui-popupToolGroup-active.oo-ui-widget-enabled{border-bottom-left-radius:0;border-bottom-right-radius:0;box-shadow:inset 0 .07em .07em 0 rgba(0,0,0,.07);background:#f8fbfd;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#f1f7fb),color-stop(100%,#fff));background-image:-webkit-linear-gradient(top,#f1f7fb 0,#fff 100%);background-image:-moz-linear-gradient(top,#f1f7fb 0,#fff 100%);background-image:-ms-linear-gradient(top,#f1f7fb 0,#fff 100%);background-image:-o-linear-gradient(top,#f1f7fb 0,#fff 100%);background-image:linear-gradient(top,#f1f7fb 0,#fff 100%)}.oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label{margin-left:3em}.oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label{margin-right:2.25em}.oo-ui-popupToolGroup .oo-ui-toolGroup-tools{top:2em;left:-1px;border:solid 1px #ccc;background-color:#fff;box-shadow:0 .25em 1em rgba(0,0,0,.25)}.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon{height:2em;width:2em;margin-right:.25em}.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title{line-height:2em;font-size:.8em}.oo-ui-listToolGroup .oo-ui-tool{display:inline-block;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-listToolGroup .oo-ui-tool-link{display:block;cursor:pointer;white-space:nowrap}.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link{cursor:default}.oo-ui-listToolGroup .oo-ui-toolGroup-tools{padding:.25em}.oo-ui-listToolGroup.oo-ui-popupToolGroup-active{border-color:rgba(0,0,0,.2)}.oo-ui-listToolGroup .oo-ui-tool{border:solid 1px transparent;margin:-1px 0}.oo-ui-listToolGroup .oo-ui-tool-link{padding-right:.5em}.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled{border-color:rgba(0,0,0,.1);box-shadow:inset 0 .07em .07em 0 rgba(0,0,0,.07);background:#f8fbfd;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#f1f7fb),color-stop(100%,#fff));background-image:-webkit-linear-gradient(top,#f1f7fb 0,#fff 100%);background-image:-moz-linear-gradient(top,#f1f7fb 0,#fff 100%);background-image:-ms-linear-gradient(top,#f1f7fb 0,#fff 100%);background-image:-o-linear-gradient(top,#f1f7fb 0,#fff 100%);background-image:linear-gradient(top,#f1f7fb 0,#fff 100%)}.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled+.oo-ui-tool-active.oo-ui-widget-enabled{border-top-color:rgba(0,0,0,.1)}.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover{border-color:rgba(0,0,0,.2)}.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover{border-color:rgba(0,0,0,.2)}.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconedElement-icon{opacity:.8}.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconedElement-icon{opacity:1}.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title{color:#ccc}.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon{opacity:.2}.oo-ui-listToolGroup.oo-ui-widget-disabled{color:#ccc}.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator,.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconedElement-icon{opacity:.2}.oo-ui-menuToolGroup{border-color:rgba(0,0,0,.1)}.oo-ui-menuToolGroup .oo-ui-tool{display:block}.oo-ui-menuToolGroup .oo-ui-tool-link{display:block;cursor:pointer;white-space:nowrap}.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon{background-image:none}.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon{background-image:url(images/icons/check.svg)}.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link{cursor:default}.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle{min-width:8em}.oo-ui-menuToolGroup .oo-ui-toolGroup-tools{padding:.25em 0}.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover{border-color:rgba(0,0,0,.2)}.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active{border-color:rgba(0,0,0,.25)}.oo-ui-menuToolGroup .oo-ui-tool-link{padding:0 1em 0 .25em}.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover{background-color:#e1f3ff}.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title{color:#ccc}.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconedElement-icon{opacity:.2}.oo-ui-menuToolGroup.oo-ui-widget-disabled{color:#ccc;border-color:rgba(0,0,0,.05)}.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator,.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconedElement-icon{opacity:.2}.oo-ui-toolbar{clear:both}.oo-ui-toolbar-bar{line-height:1em}.oo-ui-toolbar-actions{float:right}.oo-ui-toolbar-tools{float:left}.oo-ui-toolbar-tools,.oo-ui-toolbar-actions,.oo-ui-toolbar-shadow{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.oo-ui-toolbar-actions .oo-ui-popupWidget{-webkit-touch-callout:default;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all}.oo-ui-toolbar-shadow{background-position:left top;background-repeat:repeat-x;position:absolute;width:100%;pointer-events:none}.oo-ui-toolbar-bar{border-bottom:solid 1px #ccc;background:#f8fbfd;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#fff),color-stop(100%,#f1f7fb));background-image:-webkit-linear-gradient(top,#fff 0,#f1f7fb 100%);background-image:-moz-linear-gradient(top,#fff 0,#f1f7fb 100%);background-image:-ms-linear-gradient(top,#fff 0,#f1f7fb 100%);background-image:-o-linear-gradient(top,#fff 0,#f1f7fb 100%);background-image:linear-gradient(top,#fff 0,#f1f7fb 100%)}.oo-ui-toolbar-bar .oo-ui-toolbar-bar{border:none;background:0 0}.oo-ui-toolbar-shadow{background-image:url(images/toolbar-shadow.png);bottom:-9px;height:9px;opacity:.125;-webkit-transition:opacity 500ms ease-in-out;-moz-transition:opacity 500ms ease-in-out;-ms-transition:opacity 500ms ease-in-out;-o-transition:opacity 500ms ease-in-out;transition:opacity 500ms ease-in-out}.oo-ui-optionWidget{position:relative;display:block;cursor:pointer;padding:.5em 2em .5em 3em;border:none}.oo-ui-optionWidget.oo-ui-widget-disabled{cursor:default}.oo-ui-optionWidget .oo-ui-labeledElement-label{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.oo-ui-optionWidget-highlighted{background-color:#e1f3ff}.oo-ui-optionWidget .oo-ui-labeledElement-label{line-height:1.5em}.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected{background-color:#a7dcff}.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed{background-color:#a7dcff}.oo-ui-optionWidget.oo-ui-widget-disabled{color:#ccc}.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon,.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator{position:absolute;background-repeat:no-repeat;background-position:center center}.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon,.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator{top:50%;width:2em;height:2em;margin-top:-1em}.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon{left:.5em}.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator{right:.5em}.oo-ui-buttonSelectWidget{display:inline-block;white-space:nowrap;border-radius:.3em}.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button{border-radius:0;margin-left:-1px}.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonedElement-button{border-bottom-left-radius:.3em;border-top-left-radius:.3em;margin-left:0}.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonedElement-button{border-bottom-right-radius:.3em;border-top-right-radius:.3em}.oo-ui-buttonOptionWidget{display:inline-block;padding:0;background-color:transparent}.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button{position:relative}.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator{position:static;display:inline-block;vertical-align:middle}.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button{height:1.9em}.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator{height:1.9em;margin-top:0}.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted{background-color:transparent}.oo-ui-labelWidget{display:inline-block;padding:.5em 0}.oo-ui-iconWidget{display:inline-block;vertical-align:middle;background-position:center center;background-repeat:no-repeat;line-height:2.5em;height:1.9em;width:1.9em;opacity:.8}.oo-ui-iconWidget.oo-ui-widget-disabled{opacity:.2}.oo-ui-indicatorWidget{display:inline-block;vertical-align:middle;background-position:center center;background-repeat:no-repeat;line-height:2.5em;height:1.9em;width:1.9em;opacity:.8}.oo-ui-indicatorWidget.oo-ui-widget-disabled{opacity:.2}.oo-ui-buttonWidget{display:inline-block;vertical-align:middle}.oo-ui-buttonGroupWidget{display:inline-block;white-space:nowrap;border-radius:.3em}.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button{border-radius:0;margin-bottom:-1px;margin-left:-1px}.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button{border-bottom-left-radius:.3em;border-top-left-radius:.3em;margin-left:0}.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button{border-bottom-right-radius:.3em;border-top-right-radius:.3em}.oo-ui-toggleSwitchWidget{position:relative;display:inline-block;vertical-align:middle;overflow:hidden;cursor:pointer;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);height:2em;width:4em;border-radius:1em;box-shadow:0 0 0 white,inset 0 .1em .2em #ddd;border:solid 1px #ccc;background:#eee;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#ddd),color-stop(100%,#fff));background-image:-webkit-linear-gradient(top,#ddd 0,#fff 100%);background-image:-moz-linear-gradient(top,#ddd 0,#fff 100%);background-image:-ms-linear-gradient(top,#ddd 0,#fff 100%);background-image:-o-linear-gradient(top,#ddd 0,#fff 100%);background-image:linear-gradient(top,#ddd 0,#fff 100%)}.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled{cursor:default}.oo-ui-toggleSwitchWidget-grip{position:absolute;display:block;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow{position:absolute;top:0;bottom:0;right:0;left:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow{display:none}.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled{opacity:.5}.oo-ui-toggleSwitchWidget-grip{top:.25em;left:.25em;width:1.5em;height:1.5em;margin-top:-1px;border-radius:1em;box-shadow:0 .1em .25em rgba(0,0,0,.1);border:1px #c9c9c9 solid;-webkit-transition:left 200ms ease-in-out,margin-left 200ms ease-in-out;-moz-transition:left 200ms ease-in-out,margin-left 200ms ease-in-out;-ms-transition:left 200ms ease-in-out,margin-left 200ms ease-in-out;-o-transition:left 200ms ease-in-out,margin-left 200ms ease-in-out;transition:left 200ms ease-in-out,margin-left 200ms ease-in-out;background:#eee;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#fff),color-stop(100%,#ddd));background-image:-webkit-linear-gradient(top,#fff 0,#ddd 100%);background-image:-moz-linear-gradient(top,#fff 0,#ddd 100%);background-image:-ms-linear-gradient(top,#fff 0,#ddd 100%);background-image:-o-linear-gradient(top,#fff 0,#ddd 100%);background-image:linear-gradient(top,#fff 0,#ddd 100%)}.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip{border-color:#aaa}.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow{border-radius:1em;box-shadow:inset 0 1px 4px 0 rgba(0,0,0,.07);-webkit-transition:opacity 200ms ease-in-out;-moz-transition:opacity 200ms ease-in-out;-ms-transition:opacity 200ms ease-in-out;-o-transition:opacity 200ms ease-in-out;transition:opacity 200ms ease-in-out;background:#cde7f4;filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');background-image:-webkit-gradient(linear,right top,right bottom,color-stop(0%,#b0d9ee),color-stop(100%,#eaf4fa));background-image:-webkit-linear-gradient(top,#b0d9ee 0,#eaf4fa 100%);background-image:-moz-linear-gradient(top,#b0d9ee 0,#eaf4fa 100%);background-image:-ms-linear-gradient(top,#b0d9ee 0,#eaf4fa 100%);background-image:-o-linear-gradient(top,#b0d9ee 0,#eaf4fa 100%);background-image:linear-gradient(top,#b0d9ee 0,#eaf4fa 100%)}.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow{opacity:1}.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip{left:2.25em;margin-left:-2px}.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow{display:block;opacity:0}.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip{left:.25em;margin-left:0}.oo-ui-popupWidget-popup{position:absolute;overflow:hidden;z-index:1}.oo-ui-popupWidget-anchor{display:none;z-index:1}.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor{display:block;position:absolute;background-repeat:no-repeat}.oo-ui-popupWidget-head{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.oo-ui-popupWidget-head .oo-ui-buttonWidget{float:right}.oo-ui-popupWidget-head .oo-ui-labeledElement-label{float:left;cursor:default}.oo-ui-popupWidget-body{clear:both;overflow:hidden}.oo-ui-popupWidget-popup{border:solid 1px #ccc;border-radius:.25em;background-color:#fff;box-shadow:0 .15em .5em 0 rgba(0,0,0,.2)}.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup{margin-top:7px}.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor{width:15px;height:8px;margin-left:-7px;background-image:url(images/anchor.svg)}.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup{-webkit-transition:width 100ms ease-in-out,height 100ms ease-in-out,left 100ms ease-in-out;-moz-transition:width 100ms ease-in-out,height 100ms ease-in-out,left 100ms ease-in-out;-ms-transition:width 100ms ease-in-out,height 100ms ease-in-out,left 100ms ease-in-out;-o-transition:width 100ms ease-in-out,height 100ms ease-in-out,left 100ms ease-in-out;transition:width 100ms ease-in-out,height 100ms ease-in-out,left 100ms ease-in-out}.oo-ui-popupWidget-head{height:2.5em}.oo-ui-popupWidget-head .oo-ui-buttonWidget{margin:.25em}.oo-ui-popupWidget-head .oo-ui-labeledElement-label{margin:.75em 1em}.oo-ui-popupWidget-body{box-shadow:0 0 .66em rgba(0,0,0,.25)}.oo-ui-popupWidget-body-padded{padding:0 1em}.oo-ui-popupButtonWidget{position:relative}.oo-ui-popupButtonWidget .oo-ui-popupWidget{position:absolute;left:1em;cursor:auto}.oo-ui-textInputWidget{position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:20em}.oo-ui-textInputWidget input,.oo-ui-textInputWidget textarea{display:inline-block;width:100%;resize:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-textInputWidget>.oo-ui-iconedElement-icon,.oo-ui-textInputWidget>.oo-ui-indicatedElement-indicator{position:absolute;top:0;height:100%;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.oo-ui-textInputWidget>.oo-ui-iconedElement-icon{left:0}.oo-ui-textInputWidget>.oo-ui-indicatedElement-indicator{right:0}.oo-ui-textInputWidget input,.oo-ui-textInputWidget textarea{padding:.5em;font-size:1em;font-family:sans-serif;background-color:#fff;border:solid 1px #ccc;box-shadow:0 0 0 white,inset 0 .1em .2em #ddd;border-radius:.25em;-webkit-transition:border-color 200ms,box-shadow 200ms;-moz-transition:border-color 200ms,box-shadow 200ms;-ms-transition:border-color 200ms,box-shadow 200ms;-o-transition:border-color 200ms,box-shadow 200ms;transition:border-color 200ms,box-shadow 200ms}.oo-ui-textInputWidget-decorated input,.oo-ui-textInputWidget-decorated textarea{padding-left:2em}.oo-ui-textInputWidget-icon{width:2em}.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus{outline:0;border-color:#a7dcff;box-shadow:0 0 .3em #a7dcff,0 0 0 #fff}.oo-ui-textInputWidget input[readonly],.oo-ui-textInputWidget textarea[readonly]{color:#777;text-shadow:0 1px 1px #fff}.oo-ui-textInputWidget-pending input,.oo-ui-textInputWidget-pending textarea{background-color:transparent}.oo-ui-textInputWidget.oo-ui-widget-disabled input,.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus{color:#ccc;text-shadow:0 1px 1px #fff;border-color:#ddd;background-color:#f3f3f3}.oo-ui-textInputWidget .oo-ui-iconedElement-icon,.oo-ui-textInputWidget .oo-ui-indicatedElement-indicator{opacity:.8}.oo-ui-textInputWidget.oo-ui-iconedElement input,.oo-ui-textInputWidget.oo-ui-iconedElement textarea{padding-left:2em}.oo-ui-textInputWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon{width:2em;background-position:right center}.oo-ui-textInputWidget.oo-ui-indicatedElement input,.oo-ui-textInputWidget.oo-ui-indicatedElement textarea{padding-right:1.5em}.oo-ui-textInputWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator{width:1.5em;background-position:left center}.oo-ui-menuWidget{position:absolute;background:#fff;margin-top:-1px;border:solid 1px #ccc;border-radius:0 0 .25em .25em;box-shadow:0 .15em 1em 0 rgba(0,0,0,.2)}.oo-ui-menuWidget input{position:absolute;width:0;height:0;overflow:hidden;opacity:0}.oo-ui-menuItemWidget{position:relative}.oo-ui-menuItemWidget .oo-ui-iconedElement-icon{display:none}.oo-ui-menuItemWidget.oo-ui-optionWidget-selected{background-color:transparent}.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon{display:block}.oo-ui-menuItemWidget.oo-ui-optionWidget-selected{background-color:transparent}.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected{background-color:#e1f3ff}.oo-ui-menuSectionItemWidget{cursor:default;padding:.33em .75em;color:#888}.oo-ui-inlineMenuWidget{position:relative;display:inline-block;margin:.25em 0;min-width:20em}.oo-ui-inlineMenuWidget-handle{width:100%;display:inline-block;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon{position:absolute;background-position:center center;background-repeat:no-repeat}.oo-ui-inlineMenuWidget .oo-ui-menuWidget{z-index:1;width:100%}.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle{cursor:default}.oo-ui-inlineMenuWidget-handle{height:2.5em;border:solid 1px rgba(0,0,0,.1);border-radius:.25em}.oo-ui-inlineMenuWidget-handle:hover{border-color:rgba(0,0,0,.2)}.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator{right:0}.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon{left:.25em}.oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label{line-height:2.5em;margin:0 .5em}.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon{top:0;width:2.5em;height:2.5em;opacity:.8}.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle{color:#ccc;text-shadow:0 1px 1px #fff;border-color:#ddd;background-color:#f3f3f3}.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatedElement-indicator{opacity:.2}.oo-ui-inlineMenuWidget.oo-ui-iconedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label{margin-left:3em}.oo-ui-inlineMenuWidget.oo-ui-indicatedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label{margin-right:2em}.oo-ui-outlineItemWidget{position:relative;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:1.1em;padding:.75em}.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label{padding-right:1.5em}.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator{opacity:.5}.oo-ui-outlineItemWidget-level-0{padding-left:3.5em}.oo-ui-outlineItemWidget-level-0 .oo-ui-iconedElement-icon{left:1em}.oo-ui-outlineItemWidget-level-1{padding-left:5em}.oo-ui-outlineItemWidget-level-1 .oo-ui-iconedElement-icon{left:2.5em}.oo-ui-outlineItemWidget-level-2{padding-left:6.5em}.oo-ui-outlineItemWidget-level-2 .oo-ui-iconedElement-icon{left:4em}.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected{background-color:#a7dcff;text-shadow:0 1px 1px rgba(255,255,255,.5)}.oo-ui-outlineItemWidget.oo-ui-flaggableElement-important{font-weight:700}.oo-ui-outlineItemWidget.oo-ui-flaggableElement-placeholder{font-style:italic}.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-iconedElement-icon{opacity:.5}.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-labeledElement-label{color:#777}.oo-ui-outlineControlsWidget{height:3em;background-color:#fff}.oo-ui-outlineControlsWidget-items,.oo-ui-outlineControlsWidget-movers{float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-outlineControlsWidget>.oo-ui-iconedElement-icon{float:left;background-position:right center;background-repeat:no-repeat}.oo-ui-outlineControlsWidget-items{float:left}.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget{float:left}.oo-ui-outlineControlsWidget-movers{float:right}.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget{float:right}.oo-ui-outlineControlsWidget-items,.oo-ui-outlineControlsWidget-movers{height:2em;margin:.5em;padding:0}.oo-ui-outlineControlsWidget>.oo-ui-iconedElement-icon{width:1.5em;height:2em;margin:.5em 0 .5em .5em;opacity:.2}.oo-ui-outlineControlsWidget-items{margin-left:0}.oo-ui-comboBoxWidget>.oo-ui-selectWidget{z-index:1;min-width:20em}.oo-ui-comboBoxWidget>.oo-ui-selectWidget-handle{border:solid 1px rgba(0,0,0,.1);border-radius:.25em}.oo-ui-comboBoxWidget>.oo-ui-selectWidget-handle:hover{border-color:rgba(0,0,0,.2)}.oo-ui-comboBoxWidget>.oo-ui-selectWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator,.oo-ui-comboBoxWidget>.oo-ui-selectWidget-empty .oo-ui-textInputWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator{cursor:default;opacity:.2}.oo-ui-searchWidget-query{position:absolute;top:0;left:0;right:0}.oo-ui-searchWidget-query .oo-ui-textInputWidget{width:100%}.oo-ui-searchWidget-results{position:absolute;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:auto}.oo-ui-searchWidget-query{height:4em;padding:0 1em;box-shadow:0 0 .5em rgba(0,0,0,.2)}.oo-ui-searchWidget-query .oo-ui-textInputWidget{margin:.75em 0}.oo-ui-searchWidget-results{top:4em;padding:1em;line-height:0}.oo-ui-window{line-height:1em}.oo-ui-window-frame{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-window-frame>iframe{width:100%;height:100%;margin:0;padding:0}.oo-ui-window-content:focus{outline:0}.oo-ui-window-head,.oo-ui-window-foot{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.oo-ui-window-body{margin:0;padding:0;background:0 0}.oo-ui-window-overlay{position:absolute;top:0;left:0}.oo-ui-window-isolated{background:0 0;font-family:sans-serif;font-size:.8em}.oo-ui-dialog-content>.oo-ui-window-head,.oo-ui-dialog-content>.oo-ui-window-body,.oo-ui-dialog-content>.oo-ui-window-foot{position:absolute;left:0;right:0;overflow:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-dialog-content>.oo-ui-window-head{z-index:1;top:0}.oo-ui-dialog-content>.oo-ui-window-body{z-index:2;top:0;bottom:0}.oo-ui-dialog-content>.oo-ui-window-foot{z-index:1;bottom:0}.oo-ui-dialog-content>.oo-ui-window-overlay{z-index:3}.oo-ui-dialog-content>.oo-ui-window-body{box-shadow:0 0 .66em rgba(0,0,0,.25)}.oo-ui-messageDialog-actions-horizontal{display:table;table-layout:fixed;width:100%}.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget{display:table-cell;width:1%}.oo-ui-messageDialog-actions-vertical{display:block}.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget{display:block;overflow:hidden;text-overflow:ellipsis}.oo-ui-messageDialog-actions .oo-ui-actionWidget{position:relative;text-align:center}.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonedElement-button{display:block}.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label{position:relative;top:auto;bottom:auto;display:inline;white-space:nowrap}.oo-ui-messageDialog-content .oo-ui-window-body{box-shadow:0 0 .33em rgba(0,0,0,.33)}.oo-ui-messageDialog-title,.oo-ui-messageDialog-message{display:block;text-align:center;padding-top:.5em}.oo-ui-messageDialog-title{font-size:1.5em;line-height:1em;color:#000}.oo-ui-messageDialog-message{font-size:.9em;line-height:1.25em;color:#666}.oo-ui-messageDialog-message-verbose{font-size:1.1em;line-height:1.5em;text-align:left}.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget{border-right:solid 1px #e5e5e5}.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child{border-right-width:0}.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget{border-bottom:solid 1px #e5e5e5}.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child{border-bottom-width:0}.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label{text-align:center;line-height:3.4em;padding:0 2em}.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover{background-color:rgba(0,0,0,.05)}.oo-ui-messageDialog-actions .oo-ui-actionWidget:active{background-color:rgba(0,0,0,.1)}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover{background-color:rgba(8,126,204,.05)}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active{background-color:rgba(8,126,204,.1)}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label{font-weight:700}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover{background-color:rgba(118,171,54,.05)}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active{background-color:rgba(118,171,54,.1)}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover{background-color:rgba(212,83,83,.05)}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active{background-color:rgba(212,83,83,.1)}.oo-ui-processDialog-location{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oo-ui-processDialog-title{display:inline}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,.oo-ui-processDialog-actions-other .oo-ui-actionWidget{white-space:nowrap}.oo-ui-processDialog-actions-safe,.oo-ui-processDialog-actions-primary{position:absolute;top:0;bottom:0}.oo-ui-processDialog-actions-safe{left:0}.oo-ui-processDialog-actions-primary{right:0}.oo-ui-processDialog-errors{display:none;position:absolute;top:0;left:0;right:0;bottom:0;z-index:2;overflow-x:hidden;overflow-y:auto}.oo-ui-processDialog-content .oo-ui-window-head{height:3.4em}.oo-ui-processDialog-content .oo-ui-window-body{top:3.4em;box-shadow:0 0 .33em rgba(0,0,0,.33)}.oo-ui-processDialog-navigation{position:relative;height:3.4em;padding:0 1em}.oo-ui-processDialog-location{padding:.25em 0;height:1.9em;cursor:default;text-align:center}.oo-ui-processDialog-title{font-weight:700;line-height:1.9em}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonedElement-button{padding-top:.75em;padding-bottom:.75em;min-width:1.9em;min-height:1.9em}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labeledElement-label,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labeledElement-label,.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labeledElement-label{line-height:1.9em;padding:0 1em}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconedElement-icon,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconedElement-icon,.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconedElement-icon{position:absolute;margin-top:-.125em}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed,.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed{margin:.75em 0 .75em .75em}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button{padding:0;vertical-align:middle}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover{background-color:rgba(0,0,0,.05)}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active{background-color:rgba(0,0,0,.1)}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed{margin:.75em}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button{margin:-1px}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover{background-color:rgba(8,126,204,.05)}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active{background-color:rgba(8,126,204,.1)}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label{font-weight:700}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover{background-color:rgba(118,171,54,.05)}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active{background-color:rgba(118,171,54,.1)}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover{background-color:rgba(212,83,83,.05)}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active{background-color:rgba(212,83,83,.1)}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon{left:.5em}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label{padding-left:2.25em}.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon{right:.5em}.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label{padding-right:2.25em}.oo-ui-processDialog>.oo-ui-window-frame{min-height:5em}.oo-ui-processDialog-errors{background-color:rgba(255,255,255,.9);padding:3em 3em 1.5em;text-align:center}.oo-ui-processDialog-errors .oo-ui-buttonWidget{margin:2em 1em}.oo-ui-processDialog-errors-title{font-size:1.5em;color:#000;margin-bottom:2em}.oo-ui-processDialog-error{text-align:left;margin:1em;padding:1em;border:solid 1px #ff9e9e;background-color:#fff7f7;border-radius:.25em}.oo-ui-windowManager-modal>.oo-ui-dialog{position:fixed;width:0;height:0;overflow:hidden}.oo-ui-windowManager-modal>.oo-ui-dialog.oo-ui-window-setup{width:auto;height:auto;top:0;right:0;bottom:0;left:0;padding:1em}.oo-ui-windowManager-modal>.oo-ui-dialog.oo-ui-window-setup>.oo-ui-window-frame{position:fixed;right:0;left:0;margin:auto;overflow:hidden;max-width:100%;max-height:100%}.oo-ui-windowManager-modal>.oo-ui-dialog.oo-ui-window-setup>.oo-ui-window-frame>iframe{width:100%;height:100%}.oo-ui-windowManager-fullscreen>.oo-ui-dialog>.oo-ui-window-frame{width:100%;height:100%;top:0;bottom:0}.oo-ui-windowManager-modal>.oo-ui-dialog{background-color:rgba(255,255,255,.5);opacity:0;-webkit-transition:opacity 250ms ease-in-out;-moz-transition:opacity 250ms ease-in-out;-ms-transition:opacity 250ms ease-in-out;-o-transition:opacity 250ms ease-in-out;transition:opacity 250ms ease-in-out}.oo-ui-windowManager-modal>.oo-ui-dialog>.oo-ui-window-frame{top:1em;bottom:1em;background-color:#fff;-webkit-transform:scale(0.5);-moz-transform:scale(0.5);-ms-transform:scale(0.5);-o-transform:scale(0.5);transform:scale(0.5);-webkit-transition:all 250ms ease-in-out;-moz-transition:all 250ms ease-in-out;-ms-transition:all 250ms ease-in-out;-o-transition:all 250ms ease-in-out;transition:all 250ms ease-in-out}.oo-ui-windowManager-modal>.oo-ui-dialog.oo-ui-window-ready{opacity:1}.oo-ui-windowManager-modal>.oo-ui-dialog.oo-ui-window-ready>.oo-ui-window-frame{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.oo-ui-windowManager-modal.oo-ui-windowManager-floating>.oo-ui-dialog>.oo-ui-window-frame{border:solid 1px #ccc;border-radius:.5em;box-shadow:0 .2em 1em rgba(0,0,0,.3)}
\ No newline at end of file
+/*
+ * Blank theme mixins.
+ *
+ * Base styles invoke these mixins at the end of their definitions. Override these mixins to add
+ * additional rules to the base styles.
+ */
+/*
+ * Base styles.
+ *
+ * Themes should include this file after defining their variables and mixins.
+ */
+/* @noflip */
+.oo-ui-rtl {
+  direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+  direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  cursor: pointer;
+  display: inline-block;
+  vertical-align: middle;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+  display: inline-block;
+  position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  display: inline-block;
+  vertical-align: top;
+  text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  color: #333;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-left: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  margin-right: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  opacity: 0.8;
+  width: 1.9em;
+  height: 1.9em;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
+  /*.oo-ui-transition(opacity 200ms);*/
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
+  opacity: 1;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+  color: #000;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #333;
+  margin-left: 0.25em;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #087ecc;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #76ab36;
+}
+.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #d45353;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  color: #ccc;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  margin: 0.1em 0;
+  padding: 0.2em 0.8em;
+  border-radius: 0.3em;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+  border: 1px #c9c9c9 solid;
+  -webkit-transition: border-color 100ms ease-in-out;
+  -moz-transition: border-color 100ms ease-in-out;
+  -ms-transition: border-color 100ms ease-in-out;
+  -o-transition: border-color 100ms ease-in-out;
+  transition: border-color 100ms ease-in-out;
+  background: #eeeeee;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
+  border-color: #aaa;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  line-height: 1.9em;
+}
+.oo-ui-buttonElement-framed.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+  color: black;
+  border-color: #c9c9c9;
+  background: #eeeeee;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-left: -0.5em;
+  margin-right: -0.5em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-left: -0.5em;
+  margin-right: 0.3em;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button {
+  border: solid 1px #a6cee1;
+  background: #cde7f4;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
+  background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+  background-image: linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button:focus {
+  border-color: #9dc2d4;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-primary.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  border: solid 1px #a6cee1;
+  background: #cde7f4;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+  border: solid 1px #b8d892;
+  background: #daf0be;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f0fbe1', endColorstr='#c3e59a');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f0fbe1), color-stop(100%, #c3e59a));
+  background-image: -webkit-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -moz-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -ms-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: -o-linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+  background-image: linear-gradient(top, #f0fbe1 0%, #c3e59a 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+  border-color: #adcb89;
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  border: solid 1px #b8d892;
+  background: #daf0be;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#c3e59a', endColorstr='#f0fbe1');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #c3e59a), color-stop(100%, #f0fbe1));
+  background-image: -webkit-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -moz-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -ms-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: -o-linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+  background-image: linear-gradient(top, #c3e59a 0%, #f0fbe1 100%);
+}
+.oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+  color: #d45353;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  opacity: 0.5;
+  box-shadow: none;
+  color: #333;
+  background: #eee;
+  border-color: #ccc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button:focus,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button:focus,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button:focus {
+  border-color: #ccc;
+  box-shadow: none;
+}
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 3em;
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  padding: 1.5em;
+}
+.oo-ui-bookletLayout-outlinePanel {
+  border-right: solid 1px #ddd;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-fieldLayout {
+  margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+  content: " ";
+  display: table;
+}
+.oo-ui-fieldLayout:after {
+  clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  display: block;
+  float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  display: block;
+  float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  text-align: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+  z-index: 1;
+}
+.oo-ui-fieldLayout:last-child {
+  margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  padding-top: 0.5em;
+  margin-right: 5%;
+  width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+  color: #ccc;
+}
+.oo-ui-fieldsetLayout {
+  position: relative;
+  margin: 0;
+  padding: 0;
+  border: none;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  display: block;
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+  font-size: 1.5em;
+  margin-bottom: 0.5em;
+  padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+  padding-left: 1.75em;
+  line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  left: 0;
+  top: 0.25em;
+  width: 2em;
+  height: 2em;
+}
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout {
+  position: relative;
+}
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout-padded {
+  padding: 1.25em;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  display: block;
+  position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+  z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-left: 1.25em;
+  font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+  display: inline-block;
+  vertical-align: middle;
+  margin: 0.3em;
+  border-radius: 0.25em;
+  border: solid 1px transparent;
+  -webkit-transition: border-color 300ms ease-in-out;
+  -moz-transition: border-color 300ms ease-in-out;
+  -ms-transition: border-color 300ms ease-in-out;
+  -o-transition: border-color 300ms ease-in-out;
+  transition: border-color 300ms ease-in-out;
+}
+.oo-ui-toolGroup-empty {
+  display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #000;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+  display: inline-block;
+  position: relative;
+  vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+  cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+  margin: -1px 0 -1px -1px;
+  border: solid 1px transparent;
+}
+.oo-ui-barToolGroup .oo-ui-tool:first-child {
+  border-top-left-radius: 0.25em;
+  border-bottom-left-radius: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool:last-child {
+  margin-right: -1px;
+  border-top-right-radius: 0.25em;
+  border-bottom-right-radius: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  height: 1.5em;
+  padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 1.5em;
+  width: 1.5em;
+  opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-color: rgba(0, 0, 0, 0.2);
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+  background: #f8fbfd;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-left-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 1;
+}
+.oo-ui-barToolGroup.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-popupToolGroup {
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+  display: block;
+  cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+  cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  display: none;
+  position: absolute;
+  z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+  left: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+  right: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+  min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2em;
+  height: 2em;
+  opacity: 0.8;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+  right: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  left: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 0.6em;
+  font-weight: bold;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled {
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0;
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+  background: #f8fbfd;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-left: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-right: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  top: 2em;
+  margin: 0 -1px;
+  border: solid 1px #ccc;
+  background-color: white;
+  box-shadow: 0 0.25em 1em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 2em;
+  width: 2em;
+  margin-right: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  line-height: 2em;
+  font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em;
+}
+.oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  border: solid 1px transparent;
+  margin: -1px 0;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  padding-right: 0.5em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-color: rgba(0, 0, 0, 0.1);
+  box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
+  background: #f8fbfd;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#f1f7fb', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #f1f7fb), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #f1f7fb 0%, #ffffff 100%);
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
+  border-top-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.8;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 1;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-menuToolGroup {
+  border-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: none;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: /* @embed */ url(images/icons/check.svg);
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em 0 0.25em 0;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  padding: 0 1em 0 0.25em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+  background-color: #e1f3ff;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+  color: #ccc;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled {
+  color: #ccc;
+  border-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+  opacity: 0.2;
+}
+.oo-ui-toolbar {
+  clear: both;
+}
+.oo-ui-toolbar-bar {
+  line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+  float: right;
+}
+.oo-ui-toolbar-tools {
+  float: left;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-touch-callout: default;
+  -webkit-user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: all;
+  user-select: all;
+}
+.oo-ui-toolbar-shadow {
+  background-position: left top;
+  background-repeat: repeat-x;
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+  border-bottom: solid 1px #ccc;
+  background: #f8fbfd;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#f1f7fb');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #f1f7fb));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #f1f7fb 100%);
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+  border: none;
+  background: none;
+}
+.oo-ui-toolbar-shadow {
+  background-image: /* @embed */ url(images/toolbar-shadow.png);
+  bottom: -9px;
+  height: 9px;
+  opacity: 0.125;
+  -webkit-transition: opacity 500ms ease-in-out;
+  -moz-transition: opacity 500ms ease-in-out;
+  -ms-transition: opacity 500ms ease-in-out;
+  -o-transition: opacity 500ms ease-in-out;
+  transition: opacity 500ms ease-in-out;
+}
+.oo-ui-optionWidget {
+  position: relative;
+  display: block;
+  cursor: pointer;
+  padding: 0.5em 2em 0.5em 3em;
+  border: none;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  display: block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.oo-ui-optionWidget-highlighted {
+  background-color: #e1f3ff;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  line-height: 1.5em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected {
+  background-color: #a7dcff;
+}
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed {
+  background-color: #a7dcff;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  color: #ccc;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+  left: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  right: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
+  border-radius: 0.3em;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-left: -1px;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+  margin-left: 0;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  padding: 0;
+  background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  position: static;
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  height: 1.9em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  height: 1.9em;
+  margin-top: 0;
+}
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+  background-color: transparent;
+}
+.oo-ui-labelWidget {
+  display: inline-block;
+  padding: 0.5em 0;
+}
+.oo-ui-iconWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 1.9em;
+  width: 1.9em;
+  opacity: 0.8;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 1.9em;
+  width: 1.9em;
+  opacity: 0.8;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonGroupWidget {
+  display: inline-block;
+  white-space: nowrap;
+  border-radius: 0.3em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-bottom: -1px;
+  margin-left: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+  margin-left: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  overflow: hidden;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transform: translateZ(0px);
+  -moz-transform: translateZ(0px);
+  -ms-transform: translateZ(0px);
+  -o-transform: translateZ(0px);
+  transform: translateZ(0px);
+  height: 2em;
+  width: 4em;
+  border-radius: 1em;
+  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+  border: solid 1px #ccc;
+  background: #eeeeee;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#dddddd', endColorstr='#ffffff');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #dddddd), color-stop(100%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -moz-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -ms-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: -o-linear-gradient(top, #dddddd 0%, #ffffff 100%);
+  background-image: linear-gradient(top, #dddddd 0%, #ffffff 100%);
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  right: 0;
+  left: 0;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  opacity: 0.5;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  top: 0.25em;
+  left: 0.25em;
+  width: 1.5em;
+  height: 1.5em;
+  margin-top: -1px;
+  border-radius: 1em;
+  box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
+  border: 1px #c9c9c9 solid;
+  -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+  -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+  -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+  -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+  transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+  background: #eeeeee;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
+  background-image: linear-gradient(top, #ffffff 0%, #dddddd 100%);
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
+  border-color: #aaa;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  border-radius: 1em;
+  box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
+  -webkit-transition: opacity 200ms ease-in-out;
+  -moz-transition: opacity 200ms ease-in-out;
+  -ms-transition: opacity 200ms ease-in-out;
+  -o-transition: opacity 200ms ease-in-out;
+  transition: opacity 200ms ease-in-out;
+  background: #cde7f4;
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -ms-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: -o-linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+  background-image: linear-gradient(top, #b0d9ee 0%, #eaf4fa 100%);
+}
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+  opacity: 1;
+}
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  left: 2.25em;
+  margin-left: -2px;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: block;
+  opacity: 0;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  left: 0.25em;
+  margin-left: 0;
+}
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  overflow: hidden;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+  display: none;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  display: block;
+  position: absolute;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: right;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  float: left;
+  cursor: default;
+}
+.oo-ui-popupWidget-body {
+  clear: both;
+  overflow: hidden;
+}
+.oo-ui-popupWidget-popup {
+  border: solid 1px #ccc;
+  border-radius: 0.25em;
+  background-color: #fff;
+  box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+  margin-top: 7px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  width: 15px;
+  height: 8px;
+  margin-left: -7px;
+  background-image: /* @embed */ url(images/anchor.svg);
+}
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+  -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+  -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+  -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+  -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+  transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+}
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-popupWidget-body-padded {
+  padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+  position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  left: 1em;
+  cursor: auto;
+}
+.oo-ui-textInputWidget {
+  position: relative;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 20em;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  resize: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+  background-repeat: no-repeat;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+  left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  right: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  padding: 0.5em;
+  font-size: 1em;
+  font-family: sans-serif;
+  background-color: #fff;
+  border: solid 1px #ccc;
+  box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #ddd;
+  border-radius: 0.25em;
+  -webkit-transition: border-color 200ms, box-shadow 200ms;
+  -moz-transition: border-color 200ms, box-shadow 200ms;
+  -ms-transition: border-color 200ms, box-shadow 200ms;
+  -o-transition: border-color 200ms, box-shadow 200ms;
+  transition: border-color 200ms, box-shadow 200ms;
+}
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+  padding-left: 2em;
+}
+.oo-ui-textInputWidget-icon {
+  width: 2em;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+  outline: none;
+  border-color: #a7dcff;
+  box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
+}
+.oo-ui-textInputWidget input[readonly],
+.oo-ui-textInputWidget textarea[readonly] {
+  color: #777;
+  text-shadow: 0 1px 1px #fff;
+}
+.oo-ui-textInputWidget-pending input,
+.oo-ui-textInputWidget-pending textarea {
+  background-color: transparent;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #ddd;
+  background-color: #f3f3f3;
+}
+.oo-ui-textInputWidget .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
+  opacity: 0.8;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement input,
+.oo-ui-textInputWidget.oo-ui-iconElement textarea {
+  padding-left: 2em;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  width: 2em;
+  background-position: right center;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement input,
+.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
+  padding-right: 1.5em;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  width: 1.5em;
+  background-position: left center;
+}
+.oo-ui-menuWidget {
+  position: absolute;
+  background: #fff;
+  margin-top: -1px;
+  border: solid 1px #ccc;
+  border-radius: 0 0 0.25em 0.25em;
+  box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
+}
+.oo-ui-menuItemWidget {
+  position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
+.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
+  background-color: #e1f3ff;
+}
+.oo-ui-menuSectionItemWidget {
+  cursor: default;
+  padding: 0.33em 0.75em;
+  color: #888;
+}
+.oo-ui-inlineMenuWidget {
+  position: relative;
+  display: inline-block;
+  margin: 0.25em 0;
+  min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+  width: 100%;
+  display: inline-block;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+  z-index: 1;
+  width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+  height: 2.5em;
+  border: solid 1px rgba(0, 0, 0, 0.1);
+  border-radius: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+  right: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  left: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  line-height: 2.5em;
+  margin: 0 0.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+  opacity: 0.8;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #ddd;
+  background-color: #f3f3f3;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+  opacity: 0.2;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-left: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-right: 2em;
+}
+.oo-ui-outlineItemWidget {
+  position: relative;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  font-size: 1.1em;
+  padding: 0.75em;
+}
+.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+  padding-right: 1.5em;
+}
+.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  opacity: 0.5;
+}
+.oo-ui-outlineItemWidget-level-0 {
+  padding-left: 3.5em;
+}
+.oo-ui-outlineItemWidget-level-0 .oo-ui-iconElement-icon {
+  left: 1em;
+}
+.oo-ui-outlineItemWidget-level-1 {
+  padding-left: 5em;
+}
+.oo-ui-outlineItemWidget-level-1 .oo-ui-iconElement-icon {
+  left: 2.5em;
+}
+.oo-ui-outlineItemWidget-level-2 {
+  padding-left: 6.5em;
+}
+.oo-ui-outlineItemWidget-level-2 .oo-ui-iconElement-icon {
+  left: 4em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
+  background-color: #a7dcff;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-important {
+  font-weight: bold;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-placeholder {
+  font-style: italic;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
+  opacity: 0.5;
+}
+.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
+  color: #777;
+}
+.oo-ui-outlineControlsWidget {
+  height: 3em;
+  background-color: #fff;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  float: left;
+  background-position: right center;
+  background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+  float: left;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+  float: left;
+}
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  height: 2em;
+  margin: 0.5em;
+  padding: 0;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  width: 1.5em;
+  height: 2em;
+  margin: 0.5em 0 0.5em 0.5em;
+  opacity: 0.2;
+}
+.oo-ui-outlineControlsWidget-items {
+  margin-left: 0;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+  z-index: 1;
+  min-width: 20em;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget-handle {
+  border: solid 1px rgba(0, 0, 0, 0.1);
+  border-radius: 0.25em;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget-handle:hover {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  cursor: default;
+  opacity: 0.2;
+}
+.oo-ui-searchWidget-query {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  width: 100%;
+}
+.oo-ui-searchWidget-results {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-searchWidget-query {
+  height: 4em;
+  padding: 0 1em;
+  box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.2);
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  margin: 0.75em 0;
+}
+.oo-ui-searchWidget-results {
+  top: 4em;
+  padding: 1em;
+  line-height: 0;
+}
+.oo-ui-window {
+  line-height: 1em;
+  /* Content div takes focus when opened, so hide outline */
+}
+.oo-ui-window-frame {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-window-content:focus {
+  outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-window-body {
+  margin: 0;
+  padding: 0;
+  background: none;
+}
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.oo-ui-window-isolated {
+  background: transparent;
+  font-family: sans-serif;
+  font-size: 0.8em;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  position: absolute;
+  left: 0;
+  right: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+  z-index: 1;
+  top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+  z-index: 2;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  z-index: 1;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+  z-index: 3;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+  box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-messageDialog-actions-horizontal {
+  display: table;
+  table-layout: fixed;
+  width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  display: table-cell;
+  width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+  display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+  position: relative;
+  text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  position: relative;
+  top: auto;
+  bottom: auto;
+  display: inline;
+  white-space: nowrap;
+}
+.oo-ui-messageDialog-content .oo-ui-window-body {
+  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+  display: block;
+  text-align: center;
+  padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+  font-size: 1.5em;
+  line-height: 1em;
+  color: #000;
+}
+.oo-ui-messageDialog-message {
+  font-size: 0.9em;
+  line-height: 1.25em;
+  color: #666;
+}
+.oo-ui-messageDialog-message-verbose {
+  font-size: 1.1em;
+  line-height: 1.5em;
+  text-align: left;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  border-right: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+  border-right-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+  border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  text-align: center;
+  line-height: 3.4em;
+  padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+  display: inline;
+  padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+  white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+  left: 0;
+}
+.oo-ui-processDialog-actions-primary {
+  right: 0;
+}
+.oo-ui-processDialog-errors {
+  display: none;
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 2;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+  height: 3.4em;
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+  top: 3.4em;
+  box-shadow: 0 0 0.33em rgba(0, 0, 0, 0.33);
+}
+.oo-ui-processDialog-navigation {
+  position: relative;
+  height: 3.4em;
+  padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+  padding: 0.75em 0;
+  height: 1.9em;
+  cursor: default;
+  text-align: center;
+}
+.oo-ui-processDialog-title {
+  font-weight: bold;
+  line-height: 1.9em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  padding-top: 0.75em;
+  padding-bottom: 0.75em;
+  min-width: 1.9em;
+  min-height: 1.9em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
+  line-height: 1.9em;
+  padding: 0 1em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+  position: absolute;
+  margin-top: -0.125em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
+  margin: 0.75em 0 0.75em 0.75em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+  padding: 0;
+  vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
+  margin: 0.75em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+  /* Adjust for border so text aligns with title */
+  margin: -1px;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  font-weight: bold;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-left: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-right: 2.25em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+  min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+  background-color: rgba(255, 255, 255, 0.9);
+  padding: 3em 3em 1.5em 3em;
+  text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+  margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+  font-size: 1.5em;
+  color: #000;
+  margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+  text-align: left;
+  margin: 1em;
+  padding: 1em;
+  border: solid 1px #ff9e9e;
+  background-color: #fff7f7;
+  border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  position: fixed;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+  width: auto;
+  height: auto;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+  position: fixed;
+  right: 0;
+  left: 0;
+  margin: auto;
+  overflow: hidden;
+  max-width: 100%;
+  max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+  width: 100%;
+  height: 100%;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  background-color: rgba(255, 255, 255, 0.5);
+  opacity: 0;
+  -webkit-transition: opacity 250ms ease-in-out;
+  -moz-transition: opacity 250ms ease-in-out;
+  -ms-transition: opacity 250ms ease-in-out;
+  -o-transition: opacity 250ms ease-in-out;
+  transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+  top: 1em;
+  bottom: 1em;
+  background-color: #fff;
+  -webkit-transform: scale(0.5);
+  -moz-transform: scale(0.5);
+  -ms-transform: scale(0.5);
+  -o-transform: scale(0.5);
+  transform: scale(0.5);
+  -webkit-transition: all 250ms ease-in-out;
+  -moz-transition: all 250ms ease-in-out;
+  -ms-transition: all 250ms ease-in-out;
+  -o-transition: all 250ms ease-in-out;
+  transition: all 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+  opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+  -webkit-transform: scale(1);
+  -moz-transform: scale(1);
+  -ms-transform: scale(1);
+  -o-transform: scale(1);
+  transform: scale(1);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+  border: solid 1px #ccc;
+  border-radius: 0.5em;
+  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+}
index bc7c8ef..8bfa915 100644 (file)
 /*!
- * OOjs UI v0.1.0-pre (43f379c884)
+ * OOjs UI v0.1.0-pre (36d0c7dc3b)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-08-28T21:49:12Z
+ * Date: 2014-09-04T00:40:40Z
  */
-.oo-ui-rtl{direction:rtl}.oo-ui-ltr{direction:ltr}.oo-ui-buttonedElement>.oo-ui-buttonedElement-button{cursor:pointer;display:inline-block;vertical-align:middle;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.oo-ui-buttonedElement>.oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{display:none}.oo-ui-buttonedElement>.oo-ui-buttonedElement-button>.oo-ui-indicatedElement-indicator{display:none}.oo-ui-buttonedElement.oo-ui-widget-disabled>.oo-ui-buttonedElement-button{cursor:default}.oo-ui-buttonedElement.oo-ui-indicatedElement>.oo-ui-buttonedElement-button>.oo-ui-indicatedElement-indicator,.oo-ui-buttonedElement.oo-ui-iconedElement>.oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{display:inline-block;vertical-align:middle;background-position:center center;background-repeat:no-repeat}.oo-ui-buttonedElement-frameless{display:inline-block;position:relative}.oo-ui-buttonedElement-frameless>.oo-ui-buttonedElement-button>.oo-ui-labeledElement-label{display:inline-block;vertical-align:middle}.oo-ui-buttonedElement-framed>.oo-ui-buttonedElement-button{display:inline-block;vertical-align:top;text-align:center}.oo-ui-buttonedElement-framed>.oo-ui-buttonedElement-button>.oo-ui-labeledElement-label{display:inline-block;vertical-align:middle}.oo-ui-buttonedElement-framed.oo-ui-widget-disabled>.oo-ui-buttonedElement-button,.oo-ui-buttonedElement-framed.oo-ui-widget-disabled.oo-ui-buttonedElement-active>.oo-ui-buttonedElement-button,.oo-ui-buttonedElement-framed.oo-ui-widget-disabled.oo-ui-buttonedElement-pressed>.oo-ui-buttonedElement-button{cursor:default}.oo-ui-buttonedElement>.oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{margin-left:0}.oo-ui-buttonedElement>.oo-ui-buttonedElement-button>.oo-ui-indicatedElement-indicator{margin-right:-.75em}.oo-ui-buttonedElement.oo-ui-indicatedElement .oo-ui-buttonedElement-button>.oo-ui-indicatedElement-indicator,.oo-ui-buttonedElement.oo-ui-iconedElement .oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{width:3.35em;height:3.35em;background-size:2em auto}.oo-ui-buttonedElement-frameless>.oo-ui-buttonedElement-button>.oo-ui-labeledElement-label{margin-left:.25em}.oo-ui-buttonedElement-framed>.oo-ui-buttonedElement-button>.oo-ui-labeledElement-label{line-height:1.9em}.oo-ui-clippableElement-clippable{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable{overflow-y:hidden}.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable{overflow-y:auto}.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded{padding:2em}.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget{position:absolute;top:0;left:0;right:0;bottom:3em;overflow-y:auto}.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget{position:absolute;bottom:0;left:0;right:0}.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout{padding:0 0 1em}.oo-ui-fieldLayout{margin-bottom:1em}.oo-ui-fieldLayout:before,.oo-ui-fieldLayout:after{content:" ";display:table}.oo-ui-fieldLayout:after{clear:both}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left>.oo-ui-labeledElement-label,.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right>.oo-ui-labeledElement-label{display:block;float:left}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left>.oo-ui-fieldLayout-field,.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right>.oo-ui-fieldLayout-field{display:block;float:left}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right>.oo-ui-labeledElement-label{text-align:right}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline>.oo-ui-labeledElement-label{display:inline-block;vertical-align:middle}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline>.oo-ui-fieldLayout-field{display:inline-block;vertical-align:middle}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top>.oo-ui-labeledElement-label{display:inline-block}.oo-ui-fieldLayout>.oo-ui-popupButtonWidget>.oo-ui-popupWidget>.oo-ui-popupWidget-popup{z-index:1}.oo-ui-fieldLayout:last-child{margin-bottom:0}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left>.oo-ui-labeledElement-label,.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right>.oo-ui-labeledElement-label{padding-top:.5em;margin-right:5%;width:35%}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left>.oo-ui-fieldLayout-field,.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right>.oo-ui-fieldLayout-field{width:60%}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline>.oo-ui-labeledElement-label{padding:.75em .5em .5em}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline>.oo-ui-fieldLayout-field{padding:.5em 0}.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top>.oo-ui-labeledElement-label{padding:.5em 0}.oo-ui-fieldLayout>.oo-ui-popupButtonWidget>.oo-ui-buttonedElement-button>.oo-ui-iconedElement-icon{margin-top:.25em}.oo-ui-fieldLayout-disabled .oo-ui-labeledElement-label{color:#ccc}.oo-ui-fieldsetLayout{position:relative;margin:0;padding:0}.oo-ui-fieldsetLayout.oo-ui-iconedElement>.oo-ui-iconedElement-icon{display:block;position:absolute;background-position:center center;background-repeat:no-repeat}.oo-ui-fieldsetLayout+.oo-ui-fieldsetLayout{margin-top:2em}.oo-ui-fieldsetLayout>.oo-ui-labeledElement-label{margin-bottom:.5em;padding:.25em 0}.oo-ui-fieldsetLayout.oo-ui-iconedElement>.oo-ui-labeledElement-label{padding-left:1.75em;line-height:1.33em}.oo-ui-fieldsetLayout.oo-ui-iconedElement>.oo-ui-iconedElement-icon{left:0;top:.25em;width:2em;height:2em}.oo-ui-gridLayout{position:absolute;top:0;left:0;right:0;bottom:0}.oo-ui-panelLayout{position:relative;padding:1em 3.35em}.oo-ui-panelLayout-scrollable{overflow-y:auto}.oo-ui-panelLayout-expanded{position:absolute;top:0;left:0;right:0;bottom:0}.oo-ui-stackLayout>.oo-ui-panelLayout{display:none}.oo-ui-stackLayout-continuous>.oo-ui-panelLayout{display:block;position:relative}.oo-ui-popupTool .oo-ui-popupWidget-popup,.oo-ui-popupTool .oo-ui-popupWidget-anchor{z-index:4}.oo-ui-popupTool .oo-ui-popupWidget{margin-left:1.25em;font-size:.8em}.oo-ui-toolGroup{display:inline-block;vertical-align:middle;margin:.3em}.oo-ui-toolGroup-empty{display:none}.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon{background-position:center center;background-repeat:no-repeat}.oo-ui-barToolGroup>.oo-ui-iconedElement-icon,.oo-ui-barToolGroup>.oo-ui-labeledElement-label{display:none}.oo-ui-barToolGroup .oo-ui-tool{display:inline-block;position:relative;vertical-align:top}.oo-ui-barToolGroup .oo-ui-tool-link{display:block}.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon{display:block}.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title{display:none}.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link{cursor:default}.oo-ui-barToolGroup .oo-ui-tool-title,.oo-ui-barToolGroup .oo-ui-tool-accel{display:none}.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link{cursor:pointer}.oo-ui-barToolGroup .oo-ui-tool-link{height:1.5em;padding:.25em}.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon{height:1.5em;width:1.5em}.oo-ui-popupToolGroup{position:relative;height:2em;min-width:2.5em}.oo-ui-popupToolGroup-handle{display:block;cursor:pointer}.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon{position:absolute;background-position:center center;background-repeat:no-repeat}.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle{cursor:default}.oo-ui-popupToolGroup .oo-ui-toolGroup-tools{display:none;position:absolute;z-index:4}.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconedElement-icon{background-repeat:no-repeat;background-position:center center}.oo-ui-popupToolGroup-active.oo-ui-widget-enabled>.oo-ui-toolGroup-tools{display:block}.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon{display:inline-block;vertical-align:middle}.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title{display:inline-block;vertical-align:middle}.oo-ui-popupToolGroup .oo-ui-tool-accel{display:none}.oo-ui-popupToolGroup.oo-ui-indicatedElement.oo-ui-iconedElement{min-width:3.5em}.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator,.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon{top:0;width:2em;height:2em}.oo-ui-popupToolGroup-handle .oo-ui-indicatedElement-indicator{right:0}.oo-ui-popupToolGroup-handle .oo-ui-iconedElement-icon{left:.25em}.oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label{line-height:2.6em;font-size:.8em;margin:0 1em}.oo-ui-popupToolGroup-header{line-height:2.6em;font-size:.8em;margin:0 .6em;font-weight:700}.oo-ui-popupToolGroup.oo-ui-iconedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label{margin-left:3em}.oo-ui-popupToolGroup.oo-ui-indicatedElement .oo-ui-popupToolGroup-handle .oo-ui-labeledElement-label{margin-right:2.25em}.oo-ui-popupToolGroup .oo-ui-toolGroup-tools{top:2em;left:-1px}.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon{height:2em;width:2em;margin-right:.25em}.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title{line-height:2em;font-size:.8em}.oo-ui-listToolGroup .oo-ui-tool{display:inline-block;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-listToolGroup .oo-ui-tool-link{display:block;cursor:pointer;white-space:nowrap}.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link{cursor:default}.oo-ui-listToolGroup .oo-ui-toolGroup-tools{padding:.25em}.oo-ui-listToolGroup .oo-ui-tool-link{padding-right:.5em}.oo-ui-menuToolGroup .oo-ui-tool{display:block}.oo-ui-menuToolGroup .oo-ui-tool-link{display:block;cursor:pointer;white-space:nowrap}.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconedElement-icon{background-image:none}.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconedElement-icon{background-image:url(images/icons/check.svg)}.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link{cursor:default}.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle{min-width:8em}.oo-ui-menuToolGroup .oo-ui-toolGroup-tools{padding:.25em 0}.oo-ui-menuToolGroup .oo-ui-tool-link{padding:0 1em 0 .25em}.oo-ui-toolbar{clear:both}.oo-ui-toolbar-bar{line-height:1em}.oo-ui-toolbar-actions{float:right}.oo-ui-toolbar-tools{float:left}.oo-ui-toolbar-tools,.oo-ui-toolbar-actions,.oo-ui-toolbar-shadow{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.oo-ui-toolbar-actions .oo-ui-popupWidget{-webkit-touch-callout:default;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all}.oo-ui-toolbar-shadow{background-position:left top;background-repeat:repeat-x;position:absolute;width:100%;pointer-events:none}.oo-ui-selectWidget{margin:0;padding:0}.oo-ui-optionWidget{position:relative;display:block;cursor:pointer;padding:.8em 1em .8em 3.35em;border:none;border-bottom:1px solid #ddd;font-weight:700}.oo-ui-optionWidget.oo-ui-widget-disabled{cursor:default}.oo-ui-optionWidget .oo-ui-labeledElement-label{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.oo-ui-optionWidget .oo-ui-labeledElement-label{line-height:1.5em}.oo-ui-optionWidget.oo-ui-indicatedElement .oo-ui-labeledElement-label{padding-right:1.5em}.oo-ui-optionWidget-level-0{padding-left:3.5em}.oo-ui-optionWidget-level-0 .oo-ui-iconedElement-icon{left:1em}.oo-ui-optionWidget-level-1{padding-left:5em}.oo-ui-optionWidget-level-1 .oo-ui-iconedElement-icon{left:2.5em}.oo-ui-optionWidget-level-2{padding-left:6.5em}.oo-ui-optionWidget-level-2 .oo-ui-iconedElement-icon{left:4em}.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon,.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator{position:absolute;background-repeat:no-repeat;background-position:center center}.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon,.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator{top:50%;width:2em;height:2em;margin-top:-1em}.oo-ui-decoratedOptionWidget .oo-ui-iconedElement-icon{left:.5em}.oo-ui-decoratedOptionWidget .oo-ui-indicatedElement-indicator{right:.5em}.oo-ui-buttonSelectWidget{display:inline-block;white-space:nowrap}.oo-ui-buttonOptionWidget{display:inline-block;padding:0;background-color:transparent}.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button{position:relative}.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator{position:static;display:inline-block;vertical-align:middle}.oo-ui-buttonOptionWidget .oo-ui-buttonedElement-button{height:1.9em}.oo-ui-buttonOptionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon,.oo-ui-buttonOptionWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator{height:1.9em;margin-top:0}.oo-ui-labelWidget{display:inline-block;padding:.5em 0}.oo-ui-iconWidget{display:inline-block;vertical-align:middle;background-position:center center;background-repeat:no-repeat;line-height:2.5em;height:1.9em;width:1.9em;opacity:.8}.oo-ui-iconWidget.oo-ui-widget-disabled{opacity:.2}.oo-ui-indicatorWidget{display:inline-block;vertical-align:middle;background-position:center center;background-repeat:no-repeat;line-height:2.5em;height:1.9em;width:1.9em;opacity:.8}.oo-ui-indicatorWidget.oo-ui-widget-disabled{opacity:.2}.oo-ui-buttonWidget{display:inline-block;vertical-align:middle}.oo-ui-buttonGroupWidget{border-radius:.3em}.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button{border-radius:0;margin-bottom:-1px;margin-left:-1px}.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:first-child .oo-ui-buttonedElement-button{border-bottom-left-radius:.3em;border-top-left-radius:.3em;margin-left:0}.oo-ui-buttonGroupWidget .oo-ui-buttonedElement-framed:last-child .oo-ui-buttonedElement-button{border-bottom-right-radius:.3em;border-top-right-radius:.3em}.oo-ui-toggleSwitchWidget{position:relative;display:inline-block;vertical-align:middle;overflow:hidden;cursor:pointer;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);height:2em;width:4em}.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled{cursor:default}.oo-ui-toggleSwitchWidget-grip{position:absolute;display:block;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow{position:absolute;top:0;bottom:0;right:0;left:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow{display:none}.oo-ui-toggleSwitchWidget-grip{top:.25em;left:.25em;width:1.5em;height:1.5em;margin-top:-1px;-webkit-transition:left 200ms ease-in-out,margin-left 200ms ease-in-out;-moz-transition:left 200ms ease-in-out,margin-left 200ms ease-in-out;-ms-transition:left 200ms ease-in-out,margin-left 200ms ease-in-out;-o-transition:left 200ms ease-in-out,margin-left 200ms ease-in-out;transition:left 200ms ease-in-out,margin-left 200ms ease-in-out}.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow{-webkit-transition:opacity 200ms ease-in-out;-moz-transition:opacity 200ms ease-in-out;-ms-transition:opacity 200ms ease-in-out;-o-transition:opacity 200ms ease-in-out;transition:opacity 200ms ease-in-out}.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip{left:2.25em;margin-left:-2px}.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip{left:.25em;margin-left:0}.oo-ui-popupWidget-popup{position:absolute;overflow:hidden;z-index:1}.oo-ui-popupWidget-anchor{display:none;z-index:1}.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor{display:block;position:absolute;background-repeat:no-repeat}.oo-ui-popupWidget-head{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.oo-ui-popupWidget-head .oo-ui-buttonWidget{float:right}.oo-ui-popupWidget-head .oo-ui-labeledElement-label{float:left;cursor:default}.oo-ui-popupWidget-body{clear:both;overflow:hidden}.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup{margin-top:7px}.oo-ui-popupWidget-head{height:2.5em}.oo-ui-popupWidget-head .oo-ui-buttonWidget{margin:.25em}.oo-ui-popupWidget-head .oo-ui-labeledElement-label{margin:.75em 1em}.oo-ui-popupWidget-body-padded{padding:0 1em}.oo-ui-popupButtonWidget{position:relative}.oo-ui-popupButtonWidget .oo-ui-popupWidget{position:absolute;left:1em;cursor:auto}.oo-ui-lookupInputWidget-menu{background-color:#fff}.oo-ui-textInputWidget{position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-textInputWidget input,.oo-ui-textInputWidget textarea{display:inline-block;width:100%;resize:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-textInputWidget>.oo-ui-iconedElement-icon,.oo-ui-textInputWidget>.oo-ui-indicatedElement-indicator{position:absolute;top:0;height:100%;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.oo-ui-textInputWidget>.oo-ui-iconedElement-icon{left:0}.oo-ui-textInputWidget>.oo-ui-indicatedElement-indicator{right:0}.oo-ui-textInputWidget input,.oo-ui-textInputWidget textarea{padding:.8em 1em}.oo-ui-menuWidget{position:absolute}.oo-ui-menuWidget input{position:absolute;width:0;height:0;overflow:hidden;opacity:0}.oo-ui-menuItemWidget{position:relative}.oo-ui-menuItemWidget .oo-ui-iconedElement-icon{display:none}.oo-ui-menuItemWidget.oo-ui-optionWidget-selected{background-color:transparent}.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconedElement-icon{display:block}.oo-ui-menuItemWidget.oo-ui-optionWidget-selected{background:#347bff;color:#fff}.oo-ui-menuItemWidget .oo-ui-iconedElement-icon{background-size:24px auto}.oo-ui-menuSectionItemWidget{cursor:default;font-weight:400;color:#777;border:none}.oo-ui-inlineMenuWidget{position:relative;display:inline-block;margin:.25em 0;min-width:20em}.oo-ui-inlineMenuWidget-handle{width:100%;display:inline-block;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon{position:absolute;background-position:center center;background-repeat:no-repeat}.oo-ui-inlineMenuWidget .oo-ui-menuWidget{z-index:1;width:100%}.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle{cursor:default}.oo-ui-inlineMenuWidget-handle{height:2.5em}.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator,.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon{top:0;width:2.5em;height:2.5em}.oo-ui-inlineMenuWidget-handle .oo-ui-indicatedElement-indicator{right:0}.oo-ui-inlineMenuWidget-handle .oo-ui-iconedElement-icon{left:.25em}.oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label{line-height:2.5em;margin:0 .5em}.oo-ui-inlineMenuWidget.oo-ui-iconedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label{margin-left:3em}.oo-ui-inlineMenuWidget.oo-ui-indicatedElement .oo-ui-inlineMenuWidget-handle .oo-ui-labeledElement-label{margin-right:2em}.oo-ui-outlineItemWidget{position:relative;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:.75em}.oo-ui-outlineControlsWidget{height:3em}.oo-ui-outlineControlsWidget-items,.oo-ui-outlineControlsWidget-movers{float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-outlineControlsWidget>.oo-ui-iconedElement-icon{float:left;background-position:right center;background-repeat:no-repeat}.oo-ui-outlineControlsWidget-items{float:left}.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget{float:left}.oo-ui-outlineControlsWidget-movers{float:right}.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget{float:right}.oo-ui-outlineControlsWidget-items,.oo-ui-outlineControlsWidget-movers{height:2em;margin:.5em;padding:0}.oo-ui-outlineControlsWidget>.oo-ui-iconedElement-icon{width:1.5em;height:2em;margin:.5em 0 .5em .5em}.oo-ui-outlineControlsWidget-items{margin-left:0}.oo-ui-comboBoxWidget>.oo-ui-selectWidget{z-index:1}.oo-ui-comboBoxWidget>.oo-ui-selectWidget>.oo-ui-selectWidget{min-width:20em}.oo-ui-searchWidget-query{position:absolute;top:0;left:0;right:0}.oo-ui-searchWidget-query .oo-ui-textInputWidget{width:100%}.oo-ui-searchWidget-results{position:absolute;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:auto}.oo-ui-searchWidget-query{height:4em;padding:0 1em}.oo-ui-searchWidget-query .oo-ui-textInputWidget{margin:.75em 0}.oo-ui-searchWidget-results{top:4em;padding:1em;line-height:0}.oo-ui-window{line-height:1em}.oo-ui-window-frame{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-window-frame>iframe{width:100%;height:100%;margin:0;padding:0}.oo-ui-window-content:focus{outline:0}.oo-ui-window-head,.oo-ui-window-foot{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.oo-ui-window-body{margin:0;padding:0;background:0 0}.oo-ui-window-overlay{position:absolute;top:0;left:0}.oo-ui-dialog-content>.oo-ui-window-head,.oo-ui-dialog-content>.oo-ui-window-body,.oo-ui-dialog-content>.oo-ui-window-foot{position:absolute;left:0;right:0;overflow:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-dialog-content>.oo-ui-window-head{z-index:1;top:0}.oo-ui-dialog-content>.oo-ui-window-body{z-index:2;top:0;bottom:0}.oo-ui-dialog-content>.oo-ui-window-foot{z-index:1;bottom:0}.oo-ui-dialog-content>.oo-ui-window-overlay{z-index:3}.oo-ui-messageDialog-actions-horizontal{display:table;table-layout:fixed;width:100%}.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget{display:table-cell;width:1%}.oo-ui-messageDialog-actions-vertical{display:block}.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget{display:block;overflow:hidden;text-overflow:ellipsis}.oo-ui-messageDialog-actions .oo-ui-actionWidget{position:relative;text-align:center}.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonedElement-button{display:block}.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label{position:relative;top:auto;bottom:auto;display:inline;white-space:nowrap}.oo-ui-messageDialog-title,.oo-ui-messageDialog-message{display:block;text-align:center;padding-top:.5em}.oo-ui-messageDialog-title{font-size:1.5em;line-height:1em;color:#000}.oo-ui-messageDialog-message{font-size:.9em;line-height:1.25em;color:#666}.oo-ui-messageDialog-message-verbose{font-size:1.1em;line-height:1.5em;text-align:left}.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget{border-right:solid 1px #e5e5e5}.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child{border-right-width:0}.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget{border-bottom:solid 1px #e5e5e5}.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child{border-bottom-width:0}.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labeledElement-label{text-align:center;line-height:3.4em;padding:0 2em}.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover{background-color:rgba(0,0,0,.05)}.oo-ui-messageDialog-actions .oo-ui-actionWidget:active{background-color:rgba(0,0,0,.1)}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:hover{background-color:rgba(8,126,204,.05)}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary:active{background-color:rgba(8,126,204,.1)}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label{font-weight:700}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:hover{background-color:rgba(118,171,54,.05)}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-constructive:active{background-color:rgba(118,171,54,.1)}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:hover{background-color:rgba(212,83,83,.05)}.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggableElement-destructive:active{background-color:rgba(212,83,83,.1)}.oo-ui-processDialog-location{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.oo-ui-processDialog-title{display:inline}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,.oo-ui-processDialog-actions-other .oo-ui-actionWidget{white-space:nowrap}.oo-ui-processDialog-actions-safe,.oo-ui-processDialog-actions-primary{position:absolute;top:0;bottom:0}.oo-ui-processDialog-actions-safe{left:0}.oo-ui-processDialog-actions-primary{right:0}.oo-ui-processDialog-errors{display:none;position:absolute;top:0;left:0;right:0;bottom:0;z-index:2;overflow-x:hidden;overflow-y:auto}.oo-ui-processDialog-content .oo-ui-window-head{height:3.35em;border-bottom:1px solid #ddd;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.oo-ui-processDialog-content .oo-ui-window-body{top:3.35em;padding:2em 0}.oo-ui-processDialog-navigation{position:relative;height:3.35em;padding:0 1em}.oo-ui-processDialog-location{padding:.25em 0;height:3.35em;cursor:default;text-align:center}.oo-ui-processDialog-title{font-weight:700;line-height:1.85em}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonedElement-button{padding:.35em .75em;min-width:1.85em;min-height:1.85em;border:1px solid #ddd;border-radius:4px}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labeledElement-label,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labeledElement-label,.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labeledElement-label{line-height:1.85em;padding:0 1em;font-weight:700;color:#777}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconedElement-icon,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconedElement-icon,.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconedElement-icon{position:absolute;margin-top:-.125em}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button{vertical-align:middle}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-buttonedElement-button{border:1px solid transparent}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-labeledElement-label,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-labeledElement-label,.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggableElement-destructive .oo-ui-labeledElement-label{color:#d11d13}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonedElement-button{padding:.75em .35em;border:none;border-radius:0}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-buttonedElement-button{background-color:#347bff}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label,.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggableElement-primary .oo-ui-labeledElement-label{color:#fff}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon{left:.5em}.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label{padding-left:2.25em}.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-iconedElement-icon{right:.5em}.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconedElement .oo-ui-labeledElement-label{padding-right:2.25em}.oo-ui-processDialog-actions-other{position:absolute;bottom:1em}.oo-ui-processDialog>.oo-ui-window-frame{min-height:5em}.oo-ui-processDialog-errors{background-color:rgba(255,255,255,.9);padding:3em 3em 1.5em;text-align:center}.oo-ui-processDialog-errors .oo-ui-buttonWidget{margin:2em 1em}.oo-ui-processDialog-errors-title{font-size:1.5em;color:#000;margin-bottom:2em}.oo-ui-processDialog-error{text-align:left;margin:1em;padding:1em;border:solid 1px #ff9e9e;background-color:#fff7f7;border-radius:.25em}.oo-ui-windowManager-modal>.oo-ui-dialog{position:fixed;width:0;height:0;overflow:hidden}.oo-ui-windowManager-modal>.oo-ui-dialog.oo-ui-window-setup{width:auto;height:auto;top:0;right:0;bottom:0;left:0;padding:1em}.oo-ui-windowManager-modal>.oo-ui-dialog.oo-ui-window-setup>.oo-ui-window-frame{position:fixed;right:0;left:0;margin:auto;overflow:hidden;max-width:100%;max-height:100%}.oo-ui-windowManager-modal>.oo-ui-dialog.oo-ui-window-setup>.oo-ui-window-frame>iframe{width:100%;height:100%}.oo-ui-windowManager-fullscreen>.oo-ui-dialog>.oo-ui-window-frame{width:100%;height:100%;top:0;bottom:0}.oo-ui-windowManager-modal>.oo-ui-dialog{background-color:rgba(255,255,255,.5);opacity:0;-webkit-transition:opacity 250ms ease-in-out;-moz-transition:opacity 250ms ease-in-out;-ms-transition:opacity 250ms ease-in-out;-o-transition:opacity 250ms ease-in-out;transition:opacity 250ms ease-in-out}.oo-ui-windowManager-modal>.oo-ui-dialog>.oo-ui-window-frame{top:0;bottom:0;background-color:#fff;-webkit-transform:translate3d(0,-200%,0);-moz-transform:translate3d(0,-200%,0);-ms-transform:translate3d(0,-200%,0);-o-transform:translate3d(0,-200%,0);transform:translate3d(0,-200%,0);-webkit-transition:transform 250ms ease-in-out;-moz-transition:transform 250ms ease-in-out;-ms-transition:transform 250ms ease-in-out;-o-transition:transform 250ms ease-in-out;transition:transform 250ms ease-in-out}.oo-ui-windowManager-modal>.oo-ui-dialog.oo-ui-window-ready{opacity:1}.oo-ui-windowManager-modal>.oo-ui-dialog.oo-ui-window-ready>.oo-ui-window-frame{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.oo-ui-windowManager-modal.oo-ui-windowManager-floating>.oo-ui-dialog>.oo-ui-window-frame{border:solid 1px #ccc;border-radius:.5em;box-shadow:0 .2em 1em rgba(0,0,0,.3)}.oo-ui-icon-check{background-image:url(themes/minerva/images/icons/check.png);background:#347bff}
\ No newline at end of file
+/*
+ * Blank theme mixins.
+ *
+ * Base styles invoke these mixins at the end of their definitions. Override these mixins to add
+ * additional rules to the base styles.
+ */
+/*
+ * Base styles.
+ *
+ * Themes should include this file after defining their variables and mixins.
+ */
+/* @noflip */
+.oo-ui-rtl {
+  direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+  direction: ltr;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  cursor: pointer;
+  display: inline-block;
+  vertical-align: middle;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+  display: inline-block;
+  position: relative;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+  display: inline-block;
+  vertical-align: top;
+  text-align: center;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+  cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-left: 0;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  margin-right: -0.75em;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  width: 3.35em;
+  height: 3.35em;
+  background-size: 2em auto;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  margin-left: 0.25em;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  line-height: 1.9em;
+}
+.oo-ui-clippableElement-clippable {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous .oo-ui-panelLayout-scrollable {
+  overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 3em;
+  overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel .oo-ui-outlineControlsWidget {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  padding: 0 0 1em;
+}
+.oo-ui-fieldLayout {
+  margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+  content: " ";
+  display: table;
+}
+.oo-ui-fieldLayout:after {
+  clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  display: block;
+  float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  display: block;
+  float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  text-align: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+  z-index: 1;
+}
+.oo-ui-fieldLayout:last-child {
+  margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-labelElement-label {
+  padding-top: 0.5em;
+  margin-right: 5%;
+  width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-field {
+  width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-labelElement-label {
+  padding: 0.75em 0.5em 0.5em 0.5em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-field {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-labelElement-label {
+  padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  margin-top: 0.25em;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+  color: #ccc;
+}
+.oo-ui-fieldsetLayout {
+  position: relative;
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  display: block;
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+  display: inline-block;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout {
+  margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+  margin-bottom: 0.5em;
+  padding: 0.25em 0;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+  padding-left: 1.75em;
+  line-height: 1.33em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+  left: 0;
+  top: 0.25em;
+  width: 2em;
+  height: 2em;
+}
+.oo-ui-gridLayout {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+}
+.oo-ui-panelLayout {
+  position: relative;
+  padding: 1em 3.35em;
+}
+.oo-ui-panelLayout-scrollable {
+  overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+}
+.oo-ui-stackLayout > .oo-ui-panelLayout {
+  display: none;
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+  display: block;
+  position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+  z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+  margin-left: 1.25em;
+  font-size: 0.8em;
+}
+.oo-ui-toolGroup {
+  display: inline-block;
+  vertical-align: middle;
+  margin: 0.3em;
+}
+.oo-ui-toolGroup-empty {
+  display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool {
+  display: inline-block;
+  position: relative;
+  vertical-align: top;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: none;
+}
+.oo-ui-barToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-barToolGroup .oo-ui-tool-title,
+.oo-ui-barToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled .oo-ui-tool-link {
+  cursor: pointer;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link {
+  height: 1.5em;
+  padding: 0.25em;
+}
+.oo-ui-barToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 1.5em;
+  width: 1.5em;
+}
+.oo-ui-popupToolGroup {
+  position: relative;
+  height: 2em;
+  min-width: 2.5em;
+}
+.oo-ui-popupToolGroup-handle {
+  display: block;
+  cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+  cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  display: none;
+  position: absolute;
+  z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+  display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+  left: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+  right: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-accel {
+  display: none;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+  min-width: 3.5em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2em;
+  height: 2em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+  right: 0;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+  left: 0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 1em;
+}
+.oo-ui-popupToolGroup-header {
+  line-height: 2.6em;
+  font-size: 0.8em;
+  margin: 0 0.6em;
+  font-weight: bold;
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-left: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin-right: 2.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+  top: 2em;
+  margin: 0 -1px;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  height: 2em;
+  width: 2em;
+  margin-right: 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+  line-height: 2em;
+  font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+  display: inline-block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+  padding-right: 0.5em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+  display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  display: block;
+  cursor: pointer;
+  white-space: nowrap;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: none;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
+  background-image: /* @embed */ url(images/icons/check.svg);
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+  cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+  min-width: 8em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em 0 0.25em 0;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+  padding: 0 1em 0 0.25em;
+}
+.oo-ui-toolbar {
+  clear: both;
+}
+.oo-ui-toolbar-bar {
+  line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+  float: right;
+}
+.oo-ui-toolbar-tools {
+  float: left;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+  -webkit-touch-callout: default;
+  -webkit-user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: all;
+  user-select: all;
+}
+.oo-ui-toolbar-shadow {
+  background-position: left top;
+  background-repeat: repeat-x;
+  position: absolute;
+  width: 100%;
+  pointer-events: none;
+}
+.oo-ui-selectWidget {
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-optionWidget {
+  position: relative;
+  display: block;
+  cursor: pointer;
+  padding: 0.8em 1em 0.8em 3.35em;
+  border: none;
+  border-bottom: 1px solid #dddddd;
+  font-weight: bold;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  display: block;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+  line-height: 1.5em;
+}
+.oo-ui-optionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+  padding-right: 1.5em;
+}
+.oo-ui-optionWidget-level-0 {
+  padding-left: 3.5em;
+}
+.oo-ui-optionWidget-level-0 .oo-ui-iconElement-icon {
+  left: 1em;
+}
+.oo-ui-optionWidget-level-1 {
+  padding-left: 5em;
+}
+.oo-ui-optionWidget-level-1 .oo-ui-iconElement-icon {
+  left: 2.5em;
+}
+.oo-ui-optionWidget-level-2 {
+  padding-left: 6.5em;
+}
+.oo-ui-optionWidget-level-2 .oo-ui-iconElement-icon {
+  left: 4em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  top: 50%;
+  width: 2em;
+  height: 2em;
+  margin-top: -1em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon {
+  left: 0.5em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+  right: 0.5em;
+}
+.oo-ui-buttonSelectWidget {
+  display: inline-block;
+  white-space: nowrap;
+}
+.oo-ui-buttonOptionWidget {
+  display: inline-block;
+  padding: 0;
+  background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  position: static;
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+  height: 1.9em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  height: 1.9em;
+  margin-top: 0;
+}
+.oo-ui-labelWidget {
+  display: inline-block;
+  padding: 0.5em 0;
+}
+.oo-ui-iconWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 1.9em;
+  width: 1.9em;
+  opacity: 0.8;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+  display: inline-block;
+  vertical-align: middle;
+  background-position: center center;
+  background-repeat: no-repeat;
+  line-height: 2.5em;
+  height: 1.9em;
+  width: 1.9em;
+  opacity: 0.8;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+  opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+  display: inline-block;
+  vertical-align: middle;
+}
+.oo-ui-buttonGroupWidget {
+  border-radius: 0.3em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+  border-radius: 0;
+  margin-bottom: -1px;
+  margin-left: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+  margin-left: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+.oo-ui-toggleSwitchWidget {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  overflow: hidden;
+  cursor: pointer;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transform: translateZ(0px);
+  -moz-transform: translateZ(0px);
+  -ms-transform: translateZ(0px);
+  -o-transform: translateZ(0px);
+  transform: translateZ(0px);
+  height: 2em;
+  width: 4em;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+  cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  position: absolute;
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  right: 0;
+  left: 0;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+  display: none;
+}
+.oo-ui-toggleSwitchWidget-grip {
+  top: 0.25em;
+  left: 0.25em;
+  width: 1.5em;
+  height: 1.5em;
+  margin-top: -1px;
+  -webkit-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+  -moz-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+  -ms-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+  -o-transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+  transition: left 200ms ease-in-out, margin-left 200ms ease-in-out;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+  -webkit-transition: opacity 200ms ease-in-out;
+  -moz-transition: opacity 200ms ease-in-out;
+  -ms-transition: opacity 200ms ease-in-out;
+  -o-transition: opacity 200ms ease-in-out;
+  transition: opacity 200ms ease-in-out;
+}
+.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+  left: 2.25em;
+  margin-left: -2px;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+  left: 0.25em;
+  margin-left: 0;
+}
+.oo-ui-popupWidget-popup {
+  position: absolute;
+  overflow: hidden;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+  display: none;
+  z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+  display: block;
+  position: absolute;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  float: right;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  float: left;
+  cursor: default;
+}
+.oo-ui-popupWidget-body {
+  clear: both;
+  overflow: hidden;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+  margin-top: 7px;
+}
+.oo-ui-popupWidget-head {
+  height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+  margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+  margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body-padded {
+  padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+  position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+  position: absolute;
+  left: 1em;
+  cursor: auto;
+}
+.oo-ui-lookupInputWidget-menu {
+  background-color: #fff;
+}
+.oo-ui-textInputWidget {
+  position: relative;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  display: inline-block;
+  width: 100%;
+  resize: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+  background-repeat: no-repeat;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+  left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+  right: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+  padding: .8em 1em;
+}
+.oo-ui-menuWidget {
+  position: absolute;
+}
+.oo-ui-menuWidget input {
+  position: absolute;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
+}
+.oo-ui-menuItemWidget {
+  position: relative;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+  display: none;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+  display: block;
+}
+.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+  background: #347bff;
+  color: #ffffff;
+}
+.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+  background-size: 24px auto;
+}
+.oo-ui-menuSectionItemWidget {
+  cursor: default;
+  font-weight: normal;
+  color: #777777;
+  border: none;
+}
+.oo-ui-inlineMenuWidget {
+  position: relative;
+  display: inline-block;
+  margin: 0.25em 0;
+  min-width: 20em;
+}
+.oo-ui-inlineMenuWidget-handle {
+  width: 100%;
+  display: inline-block;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  position: absolute;
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+  z-index: 1;
+  width: 100%;
+}
+.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+  cursor: default;
+}
+.oo-ui-inlineMenuWidget-handle {
+  height: 2.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  top: 0;
+  width: 2.5em;
+  height: 2.5em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+  right: 0;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+  left: 0.25em;
+}
+.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  line-height: 2.5em;
+  margin: 0 0.5em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-left: 3em;
+}
+.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+  margin-right: 2em;
+}
+.oo-ui-outlineItemWidget {
+  position: relative;
+  cursor: pointer;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  padding: 0.75em;
+}
+.oo-ui-outlineControlsWidget {
+  height: 3em;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  float: left;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  float: left;
+  background-position: right center;
+  background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+  float: left;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+  float: left;
+}
+.oo-ui-outlineControlsWidget-movers {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+  float: right;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+  height: 2em;
+  margin: 0.5em;
+  padding: 0;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+  width: 1.5em;
+  height: 2em;
+  margin: 0.5em 0 0.5em 0.5em;
+}
+.oo-ui-outlineControlsWidget-items {
+  margin-left: 0;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+  z-index: 1;
+}
+.oo-ui-comboBoxWidget > .oo-ui-selectWidget > .oo-ui-selectWidget {
+  min-width: 20em;
+}
+.oo-ui-searchWidget-query {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  width: 100%;
+}
+.oo-ui-searchWidget-results {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-searchWidget-query {
+  height: 4em;
+  padding: 0 1em;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+  margin: 0.75em 0;
+}
+.oo-ui-searchWidget-results {
+  top: 4em;
+  padding: 1em;
+  line-height: 0;
+}
+.oo-ui-window {
+  line-height: 1em;
+  /* Content div takes focus when opened, so hide outline */
+}
+.oo-ui-window-frame {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+}
+.oo-ui-window-content:focus {
+  outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-window-body {
+  margin: 0;
+  padding: 0;
+  background: none;
+}
+.oo-ui-window-overlay {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  position: absolute;
+  left: 0;
+  right: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+  z-index: 1;
+  top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+  z-index: 2;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+  z-index: 1;
+  bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-overlay {
+  z-index: 3;
+}
+.oo-ui-messageDialog-actions-horizontal {
+  display: table;
+  table-layout: fixed;
+  width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  display: table-cell;
+  width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+  display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+  position: relative;
+  text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  position: relative;
+  top: auto;
+  bottom: auto;
+  display: inline;
+  white-space: nowrap;
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+  display: block;
+  text-align: center;
+  padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+  font-size: 1.5em;
+  line-height: 1em;
+  color: #000;
+}
+.oo-ui-messageDialog-message {
+  font-size: 0.9em;
+  line-height: 1.25em;
+  color: #666;
+}
+.oo-ui-messageDialog-message-verbose {
+  font-size: 1.1em;
+  line-height: 1.5em;
+  text-align: left;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+  border-right: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+  border-right-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+  border-bottom: solid 1px #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+  border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+  text-align: center;
+  line-height: 3.4em;
+  padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+  background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:hover {
+  background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary:active {
+  background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+  background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+  background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+  background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+  background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+  display: inline;
+  padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+  white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+  left: 0;
+}
+.oo-ui-processDialog-actions-primary {
+  right: 0;
+}
+.oo-ui-processDialog-errors {
+  display: none;
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 2;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+  height: 3.35em;
+  border-bottom: 1px solid #dddddd;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+  top: 3.35em;
+  padding: 2em 0;
+}
+.oo-ui-processDialog-navigation {
+  position: relative;
+  height: 3.35em;
+  padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+  padding: 0.75em 0;
+  height: 1.85em;
+  cursor: default;
+  text-align: center;
+}
+.oo-ui-processDialog-title {
+  font-weight: bold;
+  line-height: 1.85em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  padding: 0.35em 0.75em;
+  min-width: 1.85em;
+  min-height: 1.85em;
+  border: 1px solid #dddddd;
+  border-radius: 4px;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
+  line-height: 1.85em;
+  padding: 0 1em;
+  font-weight: bold;
+  color: #777777;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-iconElement-icon {
+  position: absolute;
+  margin-top: -0.125em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+  vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button {
+  border: 1px solid transparent;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-flaggedElement-destructive .oo-ui-labelElement-label {
+  color: #d11d13;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  padding: 0.75em 0.35em;
+  border: none;
+  border-radius: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {
+  background-color: #347bff;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-primary .oo-ui-labelElement-label {
+  color: #ffffff;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-left: 2.25em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+  right: 0.5em;
+}
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-labelElement-label {
+  padding-right: 2.25em;
+}
+.oo-ui-processDialog-actions-other {
+  position: absolute;
+  bottom: 1em;
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+  min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+  background-color: rgba(255, 255, 255, 0.9);
+  padding: 3em 3em 1.5em 3em;
+  text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+  margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+  font-size: 1.5em;
+  color: #000;
+  margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+  text-align: left;
+  margin: 1em;
+  padding: 1em;
+  border: solid 1px #ff9e9e;
+  background-color: #fff7f7;
+  border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  position: fixed;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+  width: auto;
+  height: auto;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+  position: fixed;
+  right: 0;
+  left: 0;
+  margin: auto;
+  overflow: hidden;
+  max-width: 100%;
+  max-height: 100%;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
+  width: 100%;
+  height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+  width: 100%;
+  height: 100%;
+  top: 0;
+  bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+  background-color: rgba(255, 255, 255, 0.5);
+  opacity: 0;
+  -webkit-transition: opacity 250ms ease-in-out;
+  -moz-transition: opacity 250ms ease-in-out;
+  -ms-transition: opacity 250ms ease-in-out;
+  -o-transition: opacity 250ms ease-in-out;
+  transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+  top: 0;
+  bottom: 0;
+  background-color: #fff;
+  -webkit-transform: translate3d(0, -200%, 0);
+  -moz-transform: translate3d(0, -200%, 0);
+  -ms-transform: translate3d(0, -200%, 0);
+  -o-transform: translate3d(0, -200%, 0);
+  transform: translate3d(0, -200%, 0);
+  -webkit-transition: transform 250ms ease-in-out;
+  -moz-transition: transform 250ms ease-in-out;
+  -ms-transition: transform 250ms ease-in-out;
+  -o-transition: transform 250ms ease-in-out;
+  transition: transform 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+  opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+  -webkit-transform: translate3d(0, 0, 0);
+  -moz-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  -o-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+  border: solid 1px #ccc;
+  border-radius: 0.5em;
+  box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
+}
+
+/*
+ * Blank theme mixins.
+ *
+ * Base styles invoke these mixins at the end of their definitions. Override these mixins to add
+ * additional rules to the base styles.
+ */
+.oo-ui-icon-check {
+  background-image: /* @embed */ url(themes/minerva/images/icons/check.png);
+  background: #347bff;
+}
index 1627aa9..e0c302d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (43f379c884)
+ * OOjs UI v0.1.0-pre (36d0c7dc3b)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-08-28T21:49:12Z
+ * Date: 2014-09-04T00:40:40Z
  */
 ( function ( OO ) {
 
@@ -1455,6 +1455,18 @@ OO.ui.Window.static.transplantStyles = function ( parentDoc, frameDoc, timeout )
 
 /* Methods */
 
+/**
+ * Handle mouse down events.
+ *
+ * @param {jQuery.Event} e Mouse down event
+ */
+OO.ui.Window.prototype.onMouseDown = function ( e ) {
+       // Prevent clicking on the click-block from stealing focus
+       if ( e.target === this.$element[0] ) {
+               return false;
+       }
+};
+
 /**
  * Check if window has been initialized.
  *
@@ -1775,6 +1787,9 @@ OO.ui.Window.prototype.initialize = function () {
        this.$foot = this.$( '<div>' );
        this.$overlay = this.$( '<div>' );
 
+       // Events
+       this.$element.on( 'mousedown', OO.ui.bind( this.onMouseDown, this ) );
+
        // Initialization
        this.$head.addClass( 'oo-ui-window-head' );
        this.$body.addClass( 'oo-ui-window-body' );
@@ -2039,7 +2054,6 @@ OO.ui.Window.prototype.load = function () {
  * @abstract
  * @class
  * @extends OO.ui.Window
- * @mixins OO.ui.LabeledElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -2399,9 +2413,6 @@ OO.ui.WindowManager = function OoUiWindowManager( config ) {
        this.onWindowMouseWheelHandler = OO.ui.bind( this.onWindowMouseWheel, this );
        this.onDocumentKeyDownHandler = OO.ui.bind( this.onDocumentKeyDown, this );
 
-       // Events
-       this.$element.on( 'mousedown', false );
-
        // Initialization
        this.$element
                .addClass( 'oo-ui-windowManager' )
@@ -2761,7 +2772,7 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
  *
  * @param {OO.ui.Window|string} win Window object or symbolic name of window to close
  * @param {Object} [data] Window closing data
- * @return {jQuery.Promise} Promise resolved when window is done opening; see {@link #event-closing}
+ * @return {jQuery.Promise} Promise resolved when window is done closing; see {@link #event-closing}
  *   for more details about the `closing` promise
  * @throws {Error} If no window by that name is being managed
  * @fires closing
@@ -3388,39 +3399,36 @@ OO.ui.ToolGroupFactory.static.getDefaultClasses = function () {
  * @class
  *
  * @constructor
- * @param {jQuery} $button Button node, assigned to #$button
  * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$button] Button node, assigned to #$button, omit to use a generated `<a>`
  * @cfg {boolean} [framed=true] Render button with a frame
  * @cfg {number} [tabIndex=0] Button's tab index, use null to have no tabIndex
  * @cfg {string} [accessKey] Button's access key
  */
-OO.ui.ButtonedElement = function OoUiButtonedElement( $button, config ) {
+OO.ui.ButtonElement = function OoUiButtonElement( config ) {
        // Configuration initialization
        config = config || {};
 
        // Properties
-       this.$button = $button;
-       this.tabIndex = null;
+       this.$button = null;
        this.framed = null;
+       this.tabIndex = null;
+       this.accessKey = null;
        this.active = false;
        this.onMouseUpHandler = OO.ui.bind( this.onMouseUp, this );
-
-       // Events
-       this.$button.on( 'mousedown', OO.ui.bind( this.onMouseDown, this ) );
+       this.onMouseDownHandler = OO.ui.bind( this.onMouseDown, this );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-buttonedElement' );
-       this.$button
-               .addClass( 'oo-ui-buttonedElement-button' )
-               .attr( 'role', 'button' );
+       this.$element.addClass( 'oo-ui-buttonElement' );
+       this.toggleFramed( config.framed === undefined || config.framed );
        this.setTabIndex( config.tabIndex || 0 );
        this.setAccessKey( config.accessKey );
-       this.toggleFramed( config.framed === undefined || config.framed );
+       this.setButtonElement( config.$button || this.$( '<a>' ) );
 };
 
 /* Setup */
 
-OO.initClass( OO.ui.ButtonedElement );
+OO.initClass( OO.ui.ButtonElement );
 
 /* Static Properties */
 
@@ -3431,25 +3439,43 @@ OO.initClass( OO.ui.ButtonedElement );
  * @inheritable
  * @property {boolean}
  */
-OO.ui.ButtonedElement.static.cancelButtonMouseDownEvents = true;
+OO.ui.ButtonElement.static.cancelButtonMouseDownEvents = true;
 
 /* Methods */
 
+/**
+ * Set the button element.
+ *
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $button Element to use as button
+ */
+OO.ui.ButtonElement.prototype.setButtonElement = function ( $button ) {
+       if ( this.$button ) {
+               this.$button
+                       .removeClass( 'oo-ui-buttonElement-button' )
+                       .removeAttr( 'role accesskey tabindex' )
+                       .off( this.onMouseDownHandler );
+       }
+
+       this.$button = $button
+               .addClass( 'oo-ui-buttonElement-button' )
+               .attr( { role: 'button', accesskey: this.accessKey, tabindex: this.tabIndex } )
+               .on( 'mousedown', this.onMouseDownHandler );
+};
+
 /**
  * Handles mouse down events.
  *
  * @param {jQuery.Event} e Mouse down event
  */
-OO.ui.ButtonedElement.prototype.onMouseDown = function ( e ) {
+OO.ui.ButtonElement.prototype.onMouseDown = function ( e ) {
        if ( this.isDisabled() || e.which !== 1 ) {
                return false;
        }
-       // tabIndex should generally be interacted with via the property, but it's not possible to
-       // reliably unset a tabIndex via a property so we use the (lowercase) "tabindex" attribute
-       this.tabIndex = this.$button.attr( 'tabindex' );
        // Remove the tab-index while the button is down to prevent the button from stealing focus
        this.$button.removeAttr( 'tabindex' );
-       this.$element.addClass( 'oo-ui-buttonedElement-pressed' );
+       this.$element.addClass( 'oo-ui-buttonElement-pressed' );
        // Run the mouseup handler no matter where the mouse is when the button is let go, so we can
        // reliably reapply the tabindex and remove the pressed class
        this.getElementDocument().addEventListener( 'mouseup', this.onMouseUpHandler, true );
@@ -3464,13 +3490,13 @@ OO.ui.ButtonedElement.prototype.onMouseDown = function ( e ) {
  *
  * @param {jQuery.Event} e Mouse up event
  */
-OO.ui.ButtonedElement.prototype.onMouseUp = function ( e ) {
+OO.ui.ButtonElement.prototype.onMouseUp = function ( e ) {
        if ( this.isDisabled() || e.which !== 1 ) {
                return false;
        }
        // Restore the tab-index after the button is up to restore the button's accesssibility
        this.$button.attr( 'tabindex', this.tabIndex );
-       this.$element.removeClass( 'oo-ui-buttonedElement-pressed' );
+       this.$element.removeClass( 'oo-ui-buttonElement-pressed' );
        // Stop listening for mouseup, since we only needed this once
        this.getElementDocument().removeEventListener( 'mouseup', this.onMouseUpHandler, true );
 };
@@ -3481,13 +3507,13 @@ OO.ui.ButtonedElement.prototype.onMouseUp = function ( e ) {
  * @param {boolean} [framed] Make button framed, omit to toggle
  * @chainable
  */
-OO.ui.ButtonedElement.prototype.toggleFramed = function ( framed ) {
+OO.ui.ButtonElement.prototype.toggleFramed = function ( framed ) {
        framed = framed === undefined ? !this.framed : !!framed;
        if ( framed !== this.framed ) {
                this.framed = framed;
                this.$element
-                       .toggleClass( 'oo-ui-buttonedElement-frameless', !framed )
-                       .toggleClass( 'oo-ui-buttonedElement-framed', framed );
+                       .toggleClass( 'oo-ui-buttonElement-frameless', !framed )
+                       .toggleClass( 'oo-ui-buttonElement-framed', framed );
        }
 
        return this;
@@ -3499,27 +3525,43 @@ OO.ui.ButtonedElement.prototype.toggleFramed = function ( framed ) {
  * @param {number|null} tabIndex Button's tab index, use null to remove
  * @chainable
  */
-OO.ui.ButtonedElement.prototype.setTabIndex = function ( tabIndex ) {
-       if ( typeof tabIndex === 'number' && tabIndex >= 0 ) {
-               this.$button.attr( 'tabindex', tabIndex );
-       } else {
-               this.$button.removeAttr( 'tabindex' );
+OO.ui.ButtonElement.prototype.setTabIndex = function ( tabIndex ) {
+       tabIndex = typeof tabIndex === 'number' && tabIndex >= 0 ? tabIndex : null;
+
+       if ( this.tabIndex !== tabIndex ) {
+               if ( this.$button ) {
+                       if ( tabIndex !== null ) {
+                               this.$button.attr( 'tabindex', tabIndex );
+                       } else {
+                               this.$button.removeAttr( 'tabindex' );
+                       }
+               }
+               this.tabIndex = tabIndex;
        }
+
        return this;
 };
 
 /**
- * Set access key
+ * Set access key.
  *
  * @param {string} accessKey Button's access key, use empty string to remove
  * @chainable
  */
-OO.ui.ButtonedElement.prototype.setAccessKey = function ( accessKey ) {
-       if ( typeof accessKey === 'string' && accessKey.length ) {
-               this.$button.attr( 'accesskey', accessKey );
-       } else {
-               this.$button.removeAttr( 'accesskey' );
+OO.ui.ButtonElement.prototype.setAccessKey = function ( accessKey ) {
+       accessKey = typeof accessKey === 'string' && accessKey.length ? accessKey : null;
+
+       if ( this.accessKey !== accessKey ) {
+               if ( this.$button ) {
+                       if ( accessKey !== null ) {
+                               this.$button.attr( 'accesskey', accessKey );
+                       } else {
+                               this.$button.removeAttr( 'accesskey' );
+                       }
+               }
+               this.accessKey = accessKey;
        }
+
        return this;
 };
 
@@ -3529,898 +3571,1172 @@ OO.ui.ButtonedElement.prototype.setAccessKey = function ( accessKey ) {
  * @param {boolean} [value] Make button active
  * @chainable
  */
-OO.ui.ButtonedElement.prototype.setActive = function ( value ) {
-       this.$element.toggleClass( 'oo-ui-buttonedElement-active', !!value );
+OO.ui.ButtonElement.prototype.setActive = function ( value ) {
+       this.$element.toggleClass( 'oo-ui-buttonElement-active', !!value );
        return this;
 };
 
 /**
- * Element that can be automatically clipped to visible boundaies.
+ * Element containing a sequence of child elements.
  *
  * @abstract
  * @class
  *
  * @constructor
- * @param {jQuery} $clippable Nodes to clip, assigned to #$clippable
  * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$group] Container node, assigned to #$group, omit to use a generated `<div>`
  */
-OO.ui.ClippableElement = function OoUiClippableElement( $clippable, config ) {
-       // Configuration initialization
+OO.ui.GroupElement = function OoUiGroupElement( config ) {
+       // Configuration
        config = config || {};
 
        // Properties
-       this.$clippable = $clippable;
-       this.clipping = false;
-       this.clipped = false;
-       this.$clippableContainer = null;
-       this.$clippableScroller = null;
-       this.$clippableWindow = null;
-       this.idealWidth = null;
-       this.idealHeight = null;
-       this.onClippableContainerScrollHandler = OO.ui.bind( this.clip, this );
-       this.onClippableWindowResizeHandler = OO.ui.bind( this.clip, this );
+       this.$group = null;
+       this.items = [];
+       this.aggregateItemEvents = {};
 
        // Initialization
-       this.$clippable.addClass( 'oo-ui-clippableElement-clippable' );
+       this.setGroupElement( config.$group || this.$( '<div>' ) );
 };
 
 /* Methods */
 
 /**
- * Set clipping.
+ * Set the group element.
  *
- * @param {boolean} value Enable clipping
- * @chainable
+ * If an element is already set, items will be moved to the new element.
+ *
+ * @param {jQuery} $group Element to use as group
  */
-OO.ui.ClippableElement.prototype.setClipping = function ( value ) {
-       value = !!value;
+OO.ui.GroupElement.prototype.setGroupElement = function ( $group ) {
+       var i, len;
 
-       if ( this.clipping !== value ) {
-               this.clipping = value;
-               if ( this.clipping ) {
-                       this.$clippableContainer = this.$( this.getClosestScrollableElementContainer() );
-                       // If the clippable container is the body, we have to listen to scroll events and check
-                       // jQuery.scrollTop on the window because of browser inconsistencies
-                       this.$clippableScroller = this.$clippableContainer.is( 'body' ) ?
-                               this.$( OO.ui.Element.getWindow( this.$clippableContainer ) ) :
-                               this.$clippableContainer;
-                       this.$clippableScroller.on( 'scroll', this.onClippableContainerScrollHandler );
-                       this.$clippableWindow = this.$( this.getElementWindow() )
-                               .on( 'resize', this.onClippableWindowResizeHandler );
-                       // Initial clip after visible
-                       setTimeout( OO.ui.bind( this.clip, this ) );
-               } else {
-                       this.$clippableContainer = null;
-                       this.$clippableScroller.off( 'scroll', this.onClippableContainerScrollHandler );
-                       this.$clippableScroller = null;
-                       this.$clippableWindow.off( 'resize', this.onClippableWindowResizeHandler );
-                       this.$clippableWindow = null;
-               }
+       this.$group = $group;
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               this.$group.append( this.items[i].$element );
        }
-
-       return this;
 };
 
 /**
- * Check if the element will be clipped to fit the visible area of the nearest scrollable container.
+ * Check if there are no items.
  *
- * @return {boolean} Element will be clipped to the visible area
+ * @return {boolean} Group is empty
  */
-OO.ui.ClippableElement.prototype.isClipping = function () {
-       return this.clipping;
+OO.ui.GroupElement.prototype.isEmpty = function () {
+       return !this.items.length;
 };
 
 /**
- * Check if the bottom or right of the element is being clipped by the nearest scrollable container.
+ * Get items.
  *
- * @return {boolean} Part of the element is being clipped
+ * @return {OO.ui.Element[]} Items
  */
-OO.ui.ClippableElement.prototype.isClipped = function () {
-       return this.clipped;
+OO.ui.GroupElement.prototype.getItems = function () {
+       return this.items.slice( 0 );
 };
 
 /**
- * Set the ideal size.
+ * Add an aggregate item event.
  *
- * @param {number|string} [width] Width as a number of pixels or CSS string with unit suffix
- * @param {number|string} [height] Height as a number of pixels or CSS string with unit suffix
+ * Aggregated events are listened to on each item and then emitted by the group under a new name,
+ * and with an additional leading parameter containing the item that emitted the original event.
+ * Other arguments that were emitted from the original event are passed through.
+ *
+ * @param {Object.<string,string|null>} events Aggregate events emitted by group, keyed by item
+ *   event, use null value to remove aggregation
+ * @throws {Error} If aggregation already exists
  */
-OO.ui.ClippableElement.prototype.setIdealSize = function ( width, height ) {
-       this.idealWidth = width;
-       this.idealHeight = height;
+OO.ui.GroupElement.prototype.aggregate = function ( events ) {
+       var i, len, item, add, remove, itemEvent, groupEvent;
+
+       for ( itemEvent in events ) {
+               groupEvent = events[itemEvent];
+
+               // Remove existing aggregated event
+               if ( itemEvent in this.aggregateItemEvents ) {
+                       // Don't allow duplicate aggregations
+                       if ( groupEvent ) {
+                               throw new Error( 'Duplicate item event aggregation for ' + itemEvent );
+                       }
+                       // Remove event aggregation from existing items
+                       for ( i = 0, len = this.items.length; i < len; i++ ) {
+                               item = this.items[i];
+                               if ( item.connect && item.disconnect ) {
+                                       remove = {};
+                                       remove[itemEvent] = [ 'emit', groupEvent, item ];
+                                       item.disconnect( this, remove );
+                               }
+                       }
+                       // Prevent future items from aggregating event
+                       delete this.aggregateItemEvents[itemEvent];
+               }
+
+               // Add new aggregate event
+               if ( groupEvent ) {
+                       // Make future items aggregate event
+                       this.aggregateItemEvents[itemEvent] = groupEvent;
+                       // Add event aggregation to existing items
+                       for ( i = 0, len = this.items.length; i < len; i++ ) {
+                               item = this.items[i];
+                               if ( item.connect && item.disconnect ) {
+                                       add = {};
+                                       add[itemEvent] = [ 'emit', groupEvent, item ];
+                                       item.connect( this, add );
+                               }
+                       }
+               }
+       }
 };
 
 /**
- * Clip element to visible boundaries and allow scrolling when needed.
+ * Add items.
  *
- * Element will be clipped the bottom or right of the element is within 10px of the edge of, or
- * overlapped by, the visible area of the nearest scrollable container.
+ * Adding an existing item (by value) will move it.
  *
+ * @param {OO.ui.Element[]} items Item
+ * @param {number} [index] Index to insert items at
  * @chainable
  */
-OO.ui.ClippableElement.prototype.clip = function () {
-       if ( !this.clipping ) {
-               // this.$clippableContainer and this.$clippableWindow are null, so the below will fail
-               return this;
-       }
+OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
+       var i, len, item, event, events, currentIndex,
+               itemElements = [];
 
-       var buffer = 10,
-               cOffset = this.$clippable.offset(),
-               $container = this.$clippableContainer.is( 'body' ) ? this.$clippableWindow : this.$clippableContainer,
-               ccOffset = $container.offset() || { top: 0, left: 0 },
-               ccHeight = $container.innerHeight() - buffer,
-               ccWidth = $container.innerWidth() - buffer,
-               scrollTop = this.$clippableScroller.scrollTop(),
-               scrollLeft = this.$clippableScroller.scrollLeft(),
-               desiredWidth = ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
-               desiredHeight = ( ccOffset.top + scrollTop + ccHeight ) - cOffset.top,
-               naturalWidth = this.$clippable.prop( 'scrollWidth' ),
-               naturalHeight = this.$clippable.prop( 'scrollHeight' ),
-               clipWidth = desiredWidth < naturalWidth,
-               clipHeight = desiredHeight < naturalHeight;
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               item = items[i];
 
-       if ( clipWidth ) {
-               this.$clippable.css( { overflowX: 'auto', width: desiredWidth } );
-       } else {
-               this.$clippable.css( 'width', this.idealWidth || '' );
-               this.$clippable.width(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
-               this.$clippable.css( 'overflowX', '' );
+               // Check if item exists then remove it first, effectively "moving" it
+               currentIndex = $.inArray( item, this.items );
+               if ( currentIndex >= 0 ) {
+                       this.removeItems( [ item ] );
+                       // Adjust index to compensate for removal
+                       if ( currentIndex < index ) {
+                               index--;
+                       }
+               }
+               // Add the item
+               if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
+                       events = {};
+                       for ( event in this.aggregateItemEvents ) {
+                               events[event] = [ 'emit', this.aggregateItemEvents[event], item ];
+                       }
+                       item.connect( this, events );
+               }
+               item.setElementGroup( this );
+               itemElements.push( item.$element.get( 0 ) );
        }
-       if ( clipHeight ) {
-               this.$clippable.css( { overflowY: 'auto', height: desiredHeight } );
+
+       if ( index === undefined || index < 0 || index >= this.items.length ) {
+               this.$group.append( itemElements );
+               this.items.push.apply( this.items, items );
+       } else if ( index === 0 ) {
+               this.$group.prepend( itemElements );
+               this.items.unshift.apply( this.items, items );
        } else {
-               this.$clippable.css( 'height', this.idealHeight || '' );
-               this.$clippable.height(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
-               this.$clippable.css( 'overflowY', '' );
+               this.items[index].$element.before( itemElements );
+               this.items.splice.apply( this.items, [ index, 0 ].concat( items ) );
        }
 
-       this.clipped = clipWidth || clipHeight;
-
        return this;
 };
 
 /**
- * Element with named flags that can be added, removed, listed and checked.
- *
- * A flag, when set, adds a CSS class on the `$element` by combing `oo-ui-flaggableElement-` with
- * the flag name. Flags are primarily useful for styling.
+ * Remove items.
  *
- * @abstract
- * @class
+ * Items will be detached, not removed, so they can be used later.
  *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string[]} [flags=[]] Styling flags, e.g. 'primary', 'destructive' or 'constructive'
+ * @param {OO.ui.Element[]} items Items to remove
+ * @chainable
  */
-OO.ui.FlaggableElement = function OoUiFlaggableElement( config ) {
-       // Config initialization
-       config = config || {};
+OO.ui.GroupElement.prototype.removeItems = function ( items ) {
+       var i, len, item, index, remove, itemEvent;
 
-       // Properties
-       this.flags = {};
+       // Remove specific items
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               item = items[i];
+               index = $.inArray( item, this.items );
+               if ( index !== -1 ) {
+                       if (
+                               item.connect && item.disconnect &&
+                               !$.isEmptyObject( this.aggregateItemEvents )
+                       ) {
+                               remove = {};
+                               if ( itemEvent in this.aggregateItemEvents ) {
+                                       remove[itemEvent] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
+                               }
+                               item.disconnect( this, remove );
+                       }
+                       item.setElementGroup( null );
+                       this.items.splice( index, 1 );
+                       item.$element.detach();
+               }
+       }
 
-       // Initialization
-       this.setFlags( config.flags );
+       return this;
 };
 
-/* Events */
-
 /**
- * @event flag
- * @param {Object.<string,boolean>} changes Object keyed by flag name containing boolean
- *   added/removed properties
+ * Clear all items.
+ *
+ * Items will be detached, not removed, so they can be used later.
+ *
+ * @chainable
  */
+OO.ui.GroupElement.prototype.clearItems = function () {
+       var i, len, item, remove, itemEvent;
 
-/* Methods */
+       // Remove all items
+       for ( i = 0, len = this.items.length; i < len; i++ ) {
+               item = this.items[i];
+               if (
+                       item.connect && item.disconnect &&
+                       !$.isEmptyObject( this.aggregateItemEvents )
+               ) {
+                       remove = {};
+                       if ( itemEvent in this.aggregateItemEvents ) {
+                               remove[itemEvent] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
+                       }
+                       item.disconnect( this, remove );
+               }
+               item.setElementGroup( null );
+               item.$element.detach();
+       }
+
+       this.items = [];
+       return this;
+};
 
 /**
- * Check if a flag is set.
+ * Element containing an icon.
  *
- * @param {string} flag Name of flag
- * @return {boolean} Has flag
+ * Icons are graphics, about the size of normal text. They can be used to aid the user in locating
+ * a control or convey information in a more space efficient way. Icons should rarely be used
+ * without labels; such as in a toolbar where space is at a premium or within a context where the
+ * meaning is very clear to the user.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$icon] Icon node, assigned to #$icon, omit to use a generated `<span>`
+ * @cfg {Object|string} [icon=''] Symbolic icon name, or map of icon names keyed by language ID;
+ *  use the 'default' key to specify the icon to be used when there is no icon in the user's
+ *  language
+ * @cfg {string} [iconTitle] Icon title text or a function that returns text
  */
-OO.ui.FlaggableElement.prototype.hasFlag = function ( flag ) {
-       return flag in this.flags;
+OO.ui.IconElement = function OoUiIconElement( config ) {
+       // Config intialization
+       config = config || {};
+
+       // Properties
+       this.$icon = null;
+       this.icon = null;
+       this.iconTitle = null;
+
+       // Initialization
+       this.setIcon( config.icon || this.constructor.static.icon );
+       this.setIconTitle( config.iconTitle || this.constructor.static.iconTitle );
+       this.setIconElement( config.$icon || this.$( '<span>' ) );
 };
 
+/* Setup */
+
+OO.initClass( OO.ui.IconElement );
+
+/* Static Properties */
+
 /**
- * Get the names of all flags set.
+ * Icon.
  *
- * @return {string[]} flags Flag names
+ * Value should be the unique portion of an icon CSS class name, such as 'up' for 'oo-ui-icon-up'.
+ *
+ * For i18n purposes, this property can be an object containing a `default` icon name property and
+ * additional icon names keyed by language code.
+ *
+ * Example of i18n icon definition:
+ *     { default: 'bold-a', en: 'bold-b', de: 'bold-f' }
+ *
+ * @static
+ * @inheritable
+ * @property {Object|string} Symbolic icon name, or map of icon names keyed by language ID;
+ *  use the 'default' key to specify the icon to be used when there is no icon in the user's
+ *  language
  */
-OO.ui.FlaggableElement.prototype.getFlags = function () {
-       return Object.keys( this.flags );
+OO.ui.IconElement.static.icon = null;
+
+/**
+ * Icon title.
+ *
+ * @static
+ * @inheritable
+ * @property {string|Function|null} Icon title text, a function that returns text or null for no
+ *  icon title
+ */
+OO.ui.IconElement.static.iconTitle = null;
+
+/* Methods */
+
+/**
+ * Set the icon element.
+ *
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $icon Element to use as icon
+ */
+OO.ui.IconElement.prototype.setIconElement = function ( $icon ) {
+       if ( this.$icon ) {
+               this.$icon
+                       .removeClass( 'oo-ui-iconElement-icon oo-ui-icon-' + this.icon )
+                       .removeAttr( 'title' );
+       }
+
+       this.$icon = $icon
+               .addClass( 'oo-ui-iconElement-icon' )
+               .toggleClass( 'oo-ui-icon-' + this.icon, !!this.icon );
+       if ( this.iconTitle !== null ) {
+               this.$icon.attr( 'title', this.iconTitle );
+       }
 };
 
 /**
- * Clear all flags.
+ * Set icon.
  *
+ * @param {Object|string|null} icon Symbolic icon name, or map of icon names keyed by language ID;
+ *  use the 'default' key to specify the icon to be used when there is no icon in the user's
+ *  language, use null to remove icon
  * @chainable
- * @fires flag
  */
-OO.ui.FlaggableElement.prototype.clearFlags = function () {
-       var flag,
-               changes = {},
-               classPrefix = 'oo-ui-flaggableElement-';
+OO.ui.IconElement.prototype.setIcon = function ( icon ) {
+       icon = OO.isPlainObject( icon ) ? OO.ui.getLocalValue( icon, null, 'default' ) : icon;
+       icon = typeof icon === 'string' && icon.trim().length ? icon.trim() : null;
 
-       for ( flag in this.flags ) {
-               changes[flag] = false;
-               delete this.flags[flag];
-               this.$element.removeClass( classPrefix + flag );
+       if ( this.icon !== icon ) {
+               if ( this.$icon ) {
+                       if ( this.icon !== null ) {
+                               this.$icon.removeClass( 'oo-ui-icon-' + this.icon );
+                       }
+                       if ( icon !== null ) {
+                               this.$icon.addClass( 'oo-ui-icon-' + icon );
+                       }
+               }
+               this.icon = icon;
        }
 
-       this.emit( 'flag', changes );
+       this.$element.toggleClass( 'oo-ui-iconElement', !!this.icon );
 
        return this;
 };
 
 /**
- * Add one or more flags.
+ * Set icon title.
  *
- * @param {string|string[]|Object.<string, boolean>} flags One or more flags to add, or an object
- *  keyed by flag name containing boolean set/remove instructions.
+ * @param {string|Function|null} icon Icon title text, a function that returns text or null
+ *  for no icon title
  * @chainable
- * @fires flag
  */
-OO.ui.FlaggableElement.prototype.setFlags = function ( flags ) {
-       var i, len, flag,
-               changes = {},
-               classPrefix = 'oo-ui-flaggableElement-';
+OO.ui.IconElement.prototype.setIconTitle = function ( iconTitle ) {
+       iconTitle = typeof iconTitle === 'function' ||
+               ( typeof iconTitle === 'string' && iconTitle.length ) ?
+                       OO.ui.resolveMsg( iconTitle ) : null;
 
-       if ( typeof flags === 'string' ) {
-               // Set
-               this.flags[flags] = true;
-               this.$element.addClass( classPrefix + flags );
-       } else if ( $.isArray( flags ) ) {
-               for ( i = 0, len = flags.length; i < len; i++ ) {
-                       flag = flags[i];
-                       // Set
-                       changes[flag] = true;
-                       this.flags[flag] = true;
-                       this.$element.addClass( classPrefix + flag );
-               }
-       } else if ( OO.isPlainObject( flags ) ) {
-               for ( flag in flags ) {
-                       if ( flags[flag] ) {
-                               // Set
-                               changes[flag] = true;
-                               this.flags[flag] = true;
-                               this.$element.addClass( classPrefix + flag );
+       if ( this.iconTitle !== iconTitle ) {
+               this.iconTitle = iconTitle;
+               if ( this.$icon ) {
+                       if ( this.iconTitle !== null ) {
+                               this.$icon.attr( 'title', iconTitle );
                        } else {
-                               // Remove
-                               changes[flag] = false;
-                               delete this.flags[flag];
-                               this.$element.removeClass( classPrefix + flag );
+                               this.$icon.removeAttr( 'title' );
                        }
                }
        }
 
-       this.emit( 'flag', changes );
-
        return this;
 };
 
 /**
- * Element containing a sequence of child elements.
+ * Get icon.
+ *
+ * @return {string} Icon
+ */
+OO.ui.IconElement.prototype.getIcon = function () {
+       return this.icon;
+};
+
+/**
+ * Element containing an indicator.
+ *
+ * Indicators are graphics, smaller than normal text. They can be used to describe unique status or
+ * behavior. Indicators should only be used in exceptional cases; such as a button that opens a menu
+ * instead of performing an action directly, or an item in a list which has errors that need to be
+ * resolved.
  *
  * @abstract
  * @class
  *
  * @constructor
- * @param {jQuery} $group Container node, assigned to #$group
  * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$indicator] Indicator node, assigned to #$indicator, omit to use a generated
+ *   `<span>`
+ * @cfg {string} [indicator] Symbolic indicator name
+ * @cfg {string} [indicatorTitle] Indicator title text or a function that returns text
  */
-OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
-       // Configuration
+OO.ui.IndicatorElement = function OoUiIndicatorElement( config ) {
+       // Config intialization
        config = config || {};
 
        // Properties
-       this.$group = $group;
-       this.items = [];
-       this.aggregateItemEvents = {};
+       this.$indicator = null;
+       this.indicator = null;
+       this.indicatorTitle = null;
+
+       // Initialization
+       this.setIndicator( config.indicator || this.constructor.static.indicator );
+       this.setIndicatorTitle( config.indicatorTitle || this.constructor.static.indicatorTitle );
+       this.setIndicatorElement( config.$indicator || this.$( '<span>' ) );
 };
 
-/* Methods */
+/* Setup */
 
-/**
- * Check if there are no items.
- *
- * @return {boolean} Group is empty
- */
-OO.ui.GroupElement.prototype.isEmpty = function () {
-       return !this.items.length;
-};
+OO.initClass( OO.ui.IndicatorElement );
+
+/* Static Properties */
 
 /**
- * Get items.
+ * indicator.
  *
- * @return {OO.ui.Element[]} Items
+ * @static
+ * @inheritable
+ * @property {string|null} Symbolic indicator name or null for no indicator
  */
-OO.ui.GroupElement.prototype.getItems = function () {
-       return this.items.slice( 0 );
-};
+OO.ui.IndicatorElement.static.indicator = null;
 
 /**
- * Add an aggregate item event.
- *
- * Aggregated events are listened to on each item and then emitted by the group under a new name,
- * and with an additional leading parameter containing the item that emitted the original event.
- * Other arguments that were emitted from the original event are passed through.
+ * Indicator title.
  *
- * @param {Object.<string,string|null>} events Aggregate events emitted by group, keyed by item
- *   event, use null value to remove aggregation
- * @throws {Error} If aggregation already exists
+ * @static
+ * @inheritable
+ * @property {string|Function|null} Indicator title text, a function that returns text or null for no
+ *  indicator title
  */
-OO.ui.GroupElement.prototype.aggregate = function ( events ) {
-       var i, len, item, add, remove, itemEvent, groupEvent;
-
-       for ( itemEvent in events ) {
-               groupEvent = events[itemEvent];
+OO.ui.IndicatorElement.static.indicatorTitle = null;
 
-               // Remove existing aggregated event
-               if ( itemEvent in this.aggregateItemEvents ) {
-                       // Don't allow duplicate aggregations
-                       if ( groupEvent ) {
-                               throw new Error( 'Duplicate item event aggregation for ' + itemEvent );
-                       }
-                       // Remove event aggregation from existing items
-                       for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               item = this.items[i];
-                               if ( item.connect && item.disconnect ) {
-                                       remove = {};
-                                       remove[itemEvent] = [ 'emit', groupEvent, item ];
-                                       item.disconnect( this, remove );
-                               }
-                       }
-                       // Prevent future items from aggregating event
-                       delete this.aggregateItemEvents[itemEvent];
-               }
-
-               // Add new aggregate event
-               if ( groupEvent ) {
-                       // Make future items aggregate event
-                       this.aggregateItemEvents[itemEvent] = groupEvent;
-                       // Add event aggregation to existing items
-                       for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               item = this.items[i];
-                               if ( item.connect && item.disconnect ) {
-                                       add = {};
-                                       add[itemEvent] = [ 'emit', groupEvent, item ];
-                                       item.connect( this, add );
-                               }
-                       }
-               }
-       }
-};
+/* Methods */
 
 /**
- * Add items.
+ * Set the indicator element.
  *
- * @param {OO.ui.Element[]} items Item
- * @param {number} [index] Index to insert items at
- * @chainable
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $indicator Element to use as indicator
  */
-OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
-       var i, len, item, event, events, currentIndex,
-               itemElements = [];
-
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[i];
-
-               // Check if item exists then remove it first, effectively "moving" it
-               currentIndex = $.inArray( item, this.items );
-               if ( currentIndex >= 0 ) {
-                       this.removeItems( [ item ] );
-                       // Adjust index to compensate for removal
-                       if ( currentIndex < index ) {
-                               index--;
-                       }
-               }
-               // Add the item
-               if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
-                       events = {};
-                       for ( event in this.aggregateItemEvents ) {
-                               events[event] = [ 'emit', this.aggregateItemEvents[event], item ];
-                       }
-                       item.connect( this, events );
-               }
-               item.setElementGroup( this );
-               itemElements.push( item.$element.get( 0 ) );
+OO.ui.IndicatorElement.prototype.setIndicatorElement = function ( $indicator ) {
+       if ( this.$indicator ) {
+               this.$indicator
+                       .removeClass( 'oo-ui-indicatorElement-indicator oo-ui-indicator-' + this.indicator )
+                       .removeAttr( 'title' );
        }
 
-       if ( index === undefined || index < 0 || index >= this.items.length ) {
-               this.$group.append( itemElements );
-               this.items.push.apply( this.items, items );
-       } else if ( index === 0 ) {
-               this.$group.prepend( itemElements );
-               this.items.unshift.apply( this.items, items );
-       } else {
-               this.items[index].$element.before( itemElements );
-               this.items.splice.apply( this.items, [ index, 0 ].concat( items ) );
+       this.$indicator = $indicator
+               .addClass( 'oo-ui-indicatorElement-indicator' )
+               .toggleClass( 'oo-ui-indicator-' + this.indicator, !!this.indicator );
+       if ( this.indicatorTitle !== null ) {
+               this.$indicatorTitle.attr( 'title', this.indicatorTitle );
        }
-
-       return this;
 };
 
 /**
- * Remove items.
- *
- * Items will be detached, not removed, so they can be used later.
+ * Set indicator.
  *
- * @param {OO.ui.Element[]} items Items to remove
+ * @param {string|null} indicator Symbolic name of indicator to use or null for no indicator
  * @chainable
  */
-OO.ui.GroupElement.prototype.removeItems = function ( items ) {
-       var i, len, item, index, remove, itemEvent;
+OO.ui.IndicatorElement.prototype.setIndicator = function ( indicator ) {
+       indicator = typeof indicator === 'string' && indicator.length ? indicator.trim() : null;
 
-       // Remove specific items
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[i];
-               index = $.inArray( item, this.items );
-               if ( index !== -1 ) {
-                       if (
-                               item.connect && item.disconnect &&
-                               !$.isEmptyObject( this.aggregateItemEvents )
-                       ) {
-                               remove = {};
-                               if ( itemEvent in this.aggregateItemEvents ) {
-                                       remove[itemEvent] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
-                               }
-                               item.disconnect( this, remove );
+       if ( this.indicator !== indicator ) {
+               if ( this.$indicator ) {
+                       if ( this.indicator !== null ) {
+                               this.$indicator.removeClass( 'oo-ui-indicator-' + this.indicator );
+                       }
+                       if ( indicator !== null ) {
+                               this.$indicator.addClass( 'oo-ui-indicator-' + indicator );
                        }
-                       item.setElementGroup( null );
-                       this.items.splice( index, 1 );
-                       item.$element.detach();
                }
+               this.indicator = indicator;
        }
 
+       this.$element.toggleClass( 'oo-ui-indicatorElement', !!this.indicator );
+
        return this;
 };
 
-/**
- * Clear all items.
- *
- * Items will be detached, not removed, so they can be used later.
- *
- * @chainable
- */
-OO.ui.GroupElement.prototype.clearItems = function () {
-       var i, len, item, remove, itemEvent;
-
-       // Remove all items
-       for ( i = 0, len = this.items.length; i < len; i++ ) {
-               item = this.items[i];
-               if (
-                       item.connect && item.disconnect &&
-                       !$.isEmptyObject( this.aggregateItemEvents )
-               ) {
-                       remove = {};
-                       if ( itemEvent in this.aggregateItemEvents ) {
-                               remove[itemEvent] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
+/**
+ * Set indicator title.
+ *
+ * @param {string|Function|null} indicator Indicator title text, a function that returns text or
+ *   null for no indicator title
+ * @chainable
+ */
+OO.ui.IndicatorElement.prototype.setIndicatorTitle = function ( indicatorTitle ) {
+       indicatorTitle = typeof indicatorTitle === 'function' ||
+               ( typeof indicatorTitle === 'string' && indicatorTitle.length ) ?
+                       OO.ui.resolveMsg( indicatorTitle ) : null;
+
+       if ( this.indicatorTitle !== indicatorTitle ) {
+               this.indicatorTitle = indicatorTitle;
+               if ( this.$indicator ) {
+                       if ( this.indicatorTitle !== null ) {
+                               this.$indicator.attr( 'title', indicatorTitle );
+                       } else {
+                               this.$indicator.removeAttr( 'title' );
                        }
-                       item.disconnect( this, remove );
                }
-               item.setElementGroup( null );
-               item.$element.detach();
        }
 
-       this.items = [];
        return this;
 };
 
 /**
- * Element containing an icon.
+ * Get indicator.
  *
- * Icons are graphics, about the size of normal text. They can be used to aid the user in locating
- * a control or convey information in a more space efficient way. Icons should rarely be used
- * without labels; such as in a toolbar where space is at a premium or within a context where the
- * meaning is very clear to the user.
+ * @return {string} title Symbolic name of indicator
+ */
+OO.ui.IndicatorElement.prototype.getIndicator = function () {
+       return this.indicator;
+};
+
+/**
+ * Get indicator title.
+ *
+ * @return {string} Indicator title text
+ */
+OO.ui.IndicatorElement.prototype.getIndicatorTitle = function () {
+       return this.indicatorTitle;
+};
+
+/**
+ * Element containing a label.
  *
  * @abstract
  * @class
  *
  * @constructor
- * @param {jQuery} $icon Icon node, assigned to #$icon
  * @param {Object} [config] Configuration options
- * @cfg {Object|string} [icon=''] Symbolic icon name, or map of icon names keyed by language ID;
- *  use the 'default' key to specify the icon to be used when there is no icon in the user's
- *  language
+ * @cfg {jQuery} [$label] Label node, assigned to #$label, omit to use a generated `<span>`
+ * @cfg {jQuery|string|Function} [label] Label nodes, text or a function that returns nodes or text
+ * @cfg {boolean} [autoFitLabel=true] Whether to fit the label or not.
  */
-OO.ui.IconedElement = function OoUiIconedElement( $icon, config ) {
+OO.ui.LabelElement = function OoUiLabelElement( config ) {
        // Config intialization
        config = config || {};
 
        // Properties
-       this.$icon = $icon;
-       this.icon = null;
+       this.$label = null;
+       this.label = null;
+       this.autoFitLabel = config.autoFitLabel === undefined || !!config.autoFitLabel;
 
        // Initialization
-       this.$icon.addClass( 'oo-ui-iconedElement-icon' );
-       this.setIcon( config.icon || this.constructor.static.icon );
+       this.setLabel( config.label || this.constructor.static.label );
+       this.setLabelElement( config.$label || this.$( '<span>' ) );
 };
 
 /* Setup */
 
-OO.initClass( OO.ui.IconedElement );
+OO.initClass( OO.ui.LabelElement );
 
 /* Static Properties */
 
 /**
- * Icon.
- *
- * Value should be the unique portion of an icon CSS class name, such as 'up' for 'oo-ui-icon-up'.
- *
- * For i18n purposes, this property can be an object containing a `default` icon name property and
- * additional icon names keyed by language code.
- *
- * Example of i18n icon definition:
- *     { default: 'bold-a', en: 'bold-b', de: 'bold-f' }
+ * Label.
  *
  * @static
  * @inheritable
- * @property {Object|string} Symbolic icon name, or map of icon names keyed by language ID;
- *  use the 'default' key to specify the icon to be used when there is no icon in the user's
- *  language
+ * @property {string|Function|null} Label text; a function that returns nodes or text; or null for
+ *  no label
  */
-OO.ui.IconedElement.static.icon = null;
+OO.ui.LabelElement.static.label = null;
 
 /* Methods */
 
 /**
- * Set icon.
+ * Set the label element.
  *
- * @param {Object|string} icon Symbolic icon name, or map of icon names keyed by language ID;
- *  use the 'default' key to specify the icon to be used when there is no icon in the user's
- *  language
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $label Element to use as label
+ */
+OO.ui.LabelElement.prototype.setLabelElement = function ( $label ) {
+       if ( this.$label ) {
+               this.$label.removeClass( 'oo-ui-labelElement-label' ).empty();
+       }
+
+       this.$label = $label.addClass( 'oo-ui-labelElement-label' );
+       this.setLabelContent( this.label );
+};
+
+/**
+ * Set the label.
+ *
+ * An empty string will result in the label being hidden. A string containing only whitespace will
+ * be converted to a single &nbsp;
+ *
+ * @param {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
+ *  text; or null for no label
  * @chainable
  */
-OO.ui.IconedElement.prototype.setIcon = function ( icon ) {
-       icon = OO.isPlainObject( icon ) ? OO.ui.getLocalValue( icon, null, 'default' ) : icon;
+OO.ui.LabelElement.prototype.setLabel = function ( label ) {
+       label = typeof label === 'function' ? OO.ui.resolveMsg( label ) : label;
+       label = ( typeof label === 'string' && label.length ) || label instanceof jQuery ? label : null;
 
-       if ( this.icon ) {
-               this.$icon.removeClass( 'oo-ui-icon-' + this.icon );
-       }
-       if ( typeof icon === 'string' ) {
-               icon = icon.trim();
-               if ( icon.length ) {
-                       this.$icon.addClass( 'oo-ui-icon-' + icon );
-                       this.icon = icon;
+       if ( this.label !== label ) {
+               if ( this.$label ) {
+                       this.setLabelContent( label );
                }
+               this.label = label;
        }
-       this.$element.toggleClass( 'oo-ui-iconedElement', !!this.icon );
+
+       this.$element.toggleClass( 'oo-ui-labelElement', !!this.label );
 
        return this;
 };
 
 /**
- * Get icon.
+ * Get the label.
  *
- * @return {string} Icon
+ * @return {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
+ *  text; or null for no label
  */
-OO.ui.IconedElement.prototype.getIcon = function () {
-       return this.icon;
+OO.ui.LabelElement.prototype.getLabel = function () {
+       return this.label;
 };
 
 /**
- * Element containing an indicator.
+ * Fit the label.
  *
- * Indicators are graphics, smaller than normal text. They can be used to describe unique status or
- * behavior. Indicators should only be used in exceptional cases; such as a button that opens a menu
- * instead of performing an action directly, or an item in a list which has errors that need to be
- * resolved.
+ * @chainable
+ */
+OO.ui.LabelElement.prototype.fitLabel = function () {
+       if ( this.$label && this.$label.autoEllipsis && this.autoFitLabel ) {
+               this.$label.autoEllipsis( { hasSpan: false, tooltip: true } );
+       }
+
+       return this;
+};
+
+/**
+ * Set the content of the label.
+ *
+ * Do not call this method until after the label element has been set by #setLabelElement.
+ *
+ * @private
+ * @param {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
+ *  text; or null for no label
+ */
+OO.ui.LabelElement.prototype.setLabelContent = function ( label ) {
+       if ( typeof label === 'string' ) {
+               if ( label.match( /^\s*$/ ) ) {
+                       // Convert whitespace only string to a single non-breaking space
+                       this.$label.html( '&nbsp;' );
+               } else {
+                       this.$label.text( label );
+               }
+       } else if ( label instanceof jQuery ) {
+               this.$label.empty().append( label );
+       } else {
+               this.$label.empty();
+       }
+       this.$label.css( 'display', !label ? 'none' : '' );
+};
+
+/**
+ * Element containing an OO.ui.PopupWidget object.
  *
  * @abstract
  * @class
  *
  * @constructor
- * @param {jQuery} $indicator Indicator node, assigned to #$indicator
  * @param {Object} [config] Configuration options
- * @cfg {string} [indicator] Symbolic indicator name
- * @cfg {string} [indicatorTitle] Indicator title text or a function that return text
+ * @cfg {Object} [popup] Configuration to pass to popup
+ * @cfg {boolean} [autoClose=true] Popup auto-closes when it loses focus
  */
-OO.ui.IndicatedElement = function OoUiIndicatedElement( $indicator, config ) {
-       // Config intialization
+OO.ui.PopupElement = function OoUiPopupElement( config ) {
+       // Configuration initialization
        config = config || {};
 
        // Properties
-       this.$indicator = $indicator;
-       this.indicator = null;
-       this.indicatorLabel = null;
+       this.popup = new OO.ui.PopupWidget( $.extend(
+               { autoClose: true },
+               config.popup,
+               { $: this.$, $autoCloseIgnore: this.$element }
+       ) );
+};
+
+/* Methods */
+
+/**
+ * Get popup.
+ *
+ * @return {OO.ui.PopupWidget} Popup widget
+ */
+OO.ui.PopupElement.prototype.getPopup = function () {
+       return this.popup;
+};
+
+/**
+ * Element with named flags that can be added, removed, listed and checked.
+ *
+ * A flag, when set, adds a CSS class on the `$element` by combining `oo-ui-flaggedElement-` with
+ * the flag name. Flags are primarily useful for styling.
+ *
+ * @abstract
+ * @class
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string[]} [flags=[]] Styling flags, e.g. 'primary', 'destructive' or 'constructive'
+ * @cfg {jQuery} [$flagged] Flagged node, assigned to #$flagged, omit to use #$element
+ */
+OO.ui.FlaggedElement = function OoUiFlaggedElement( config ) {
+       // Config initialization
+       config = config || {};
+
+       // Properties
+       this.flags = {};
+       this.$flagged = null;
 
        // Initialization
-       this.$indicator.addClass( 'oo-ui-indicatedElement-indicator' );
-       this.setIndicator( config.indicator || this.constructor.static.indicator );
-       this.setIndicatorTitle( config.indicatorTitle || this.constructor.static.indicatorTitle );
+       this.setFlags( config.flags );
+       this.setFlaggedElement( config.$flagged || this.$element );
 };
 
-/* Setup */
+/* Events */
 
-OO.initClass( OO.ui.IndicatedElement );
+/**
+ * @event flag
+ * @param {Object.<string,boolean>} changes Object keyed by flag name containing boolean
+ *   added/removed properties
+ */
 
-/* Static Properties */
+/* Methods */
 
 /**
- * indicator.
+ * Set the flagged element.
  *
- * @static
- * @inheritable
- * @property {string|null} Symbolic indicator name or null for no indicator
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $flagged Element to add flags to
  */
-OO.ui.IndicatedElement.static.indicator = null;
+OO.ui.FlaggedElement.prototype.setFlaggedElement = function ( $flagged ) {
+       var classNames = Object.keys( this.flags ).map( function ( flag ) {
+               return 'oo-ui-flaggedElement-' + flag;
+       } ).join( ' ' );
+
+       if ( this.$flagged ) {
+               this.$flagged.removeClass( classNames );
+       }
+
+       this.$flagged = $flagged.addClass( classNames );
+};
 
 /**
- * Indicator title.
+ * Check if a flag is set.
  *
- * @static
- * @inheritable
- * @property {string|Function|null} Indicator title text, a function that return text or null for no
- *  indicator title
+ * @param {string} flag Name of flag
+ * @return {boolean} Has flag
  */
-OO.ui.IndicatedElement.static.indicatorTitle = null;
+OO.ui.FlaggedElement.prototype.hasFlag = function ( flag ) {
+       return flag in this.flags;
+};
 
-/* Methods */
+/**
+ * Get the names of all flags set.
+ *
+ * @return {string[]} flags Flag names
+ */
+OO.ui.FlaggedElement.prototype.getFlags = function () {
+       return Object.keys( this.flags );
+};
 
 /**
- * Set indicator.
+ * Clear all flags.
  *
- * @param {string|null} indicator Symbolic name of indicator to use or null for no indicator
  * @chainable
+ * @fires flag
  */
-OO.ui.IndicatedElement.prototype.setIndicator = function ( indicator ) {
-       if ( this.indicator ) {
-               this.$indicator.removeClass( 'oo-ui-indicator-' + this.indicator );
-               this.indicator = null;
+OO.ui.FlaggedElement.prototype.clearFlags = function () {
+       var flag, className,
+               changes = {},
+               remove = [],
+               classPrefix = 'oo-ui-flaggedElement-';
+
+       for ( flag in this.flags ) {
+               className = classPrefix + flag;
+               changes[flag] = false;
+               delete this.flags[flag];
+               remove.push( className );
        }
-       if ( typeof indicator === 'string' ) {
-               indicator = indicator.trim();
-               if ( indicator.length ) {
-                       this.$indicator.addClass( 'oo-ui-indicator-' + indicator );
-                       this.indicator = indicator;
-               }
+
+       if ( this.$flagged ) {
+               this.$flagged.removeClass( remove.join( ' ' ) );
        }
-       this.$element.toggleClass( 'oo-ui-indicatedElement', !!this.indicator );
+
+       this.emit( 'flag', changes );
 
        return this;
 };
 
 /**
- * Set indicator label.
+ * Add one or more flags.
  *
- * @param {string|Function|null} indicator Indicator title text, a function that return text or null
- *  for no indicator title
+ * @param {string|string[]|Object.<string, boolean>} flags One or more flags to add, or an object
+ *  keyed by flag name containing boolean set/remove instructions.
  * @chainable
+ * @fires flag
  */
-OO.ui.IndicatedElement.prototype.setIndicatorTitle = function ( indicatorTitle ) {
-       this.indicatorTitle = indicatorTitle = OO.ui.resolveMsg( indicatorTitle );
+OO.ui.FlaggedElement.prototype.setFlags = function ( flags ) {
+       var i, len, flag, className,
+               changes = {},
+               add = [],
+               remove = [],
+               classPrefix = 'oo-ui-flaggedElement-';
 
-       if ( typeof indicatorTitle === 'string' && indicatorTitle.length ) {
-               this.$indicator.attr( 'title', indicatorTitle );
-       } else {
-               this.$indicator.removeAttr( 'title' );
+       if ( typeof flags === 'string' ) {
+               className = classPrefix + flags;
+               // Set
+               if ( !this.flags[flags] ) {
+                       this.flags[flags] = true;
+                       add.push( className );
+               }
+       } else if ( $.isArray( flags ) ) {
+               for ( i = 0, len = flags.length; i < len; i++ ) {
+                       flag = flags[i];
+                       className = classPrefix + flag;
+                       // Set
+                       if ( !this.flags[flag] ) {
+                               changes[flag] = true;
+                               this.flags[flag] = true;
+                               add.push( className );
+                       }
+               }
+       } else if ( OO.isPlainObject( flags ) ) {
+               for ( flag in flags ) {
+                       className = classPrefix + flag;
+                       if ( flags[flag] ) {
+                               // Set
+                               if ( !this.flags[flag] ) {
+                                       changes[flag] = true;
+                                       this.flags[flag] = true;
+                                       add.push( className );
+                               }
+                       } else {
+                               // Remove
+                               if ( this.flags[flag] ) {
+                                       changes[flag] = false;
+                                       delete this.flags[flag];
+                                       remove.push( className );
+                               }
+                       }
+               }
        }
 
-       return this;
-};
+       if ( this.$flagged ) {
+               this.$flagged
+                       .addClass( add.join( ' ' ) )
+                       .removeClass( remove.join( ' ' ) );
+       }
 
-/**
- * Get indicator.
- *
- * @return {string} title Symbolic name of indicator
- */
-OO.ui.IndicatedElement.prototype.getIndicator = function () {
-       return this.indicator;
-};
+       this.emit( 'flag', changes );
 
-/**
- * Get indicator title.
- *
- * @return {string} Indicator title text
- */
-OO.ui.IndicatedElement.prototype.getIndicatorTitle = function () {
-       return this.indicatorTitle;
+       return this;
 };
 
 /**
- * Element containing a label.
+ * Element with a title.
+ *
+ * Titles are rendered by the browser and are made visible when hovering the element. Titles are
+ * not visible on touch devices.
  *
  * @abstract
  * @class
  *
  * @constructor
- * @param {jQuery} $label Label node, assigned to #$label
  * @param {Object} [config] Configuration options
- * @cfg {jQuery|string|Function} [label] Label nodes, text or a function that returns nodes or text
- * @cfg {boolean} [autoFitLabel=true] Whether to fit the label or not.
+ * @cfg {jQuery} [$titled] Titled node, assigned to #$titled, omit to use #$element
+ * @cfg {string|Function} [title] Title text or a function that returns text
  */
-OO.ui.LabeledElement = function OoUiLabeledElement( $label, config ) {
+OO.ui.TitledElement = function OoUiTitledElement( config ) {
        // Config intialization
        config = config || {};
 
        // Properties
-       this.$label = $label;
-       this.label = null;
+       this.$titled = null;
+       this.title = null;
 
        // Initialization
-       this.$label.addClass( 'oo-ui-labeledElement-label' );
-       this.setLabel( config.label || this.constructor.static.label );
-       this.autoFitLabel = config.autoFitLabel === undefined || !!config.autoFitLabel;
+       this.setTitle( config.title || this.constructor.static.title );
+       this.setTitledElement( config.$titled || this.$element );
 };
 
 /* Setup */
 
-OO.initClass( OO.ui.LabeledElement );
+OO.initClass( OO.ui.TitledElement );
 
 /* Static Properties */
 
 /**
- * Label.
+ * Title.
  *
  * @static
  * @inheritable
- * @property {string|Function|null} Label text; a function that returns nodes or text; or null for
- *  no label
+ * @property {string|Function} Title text or a function that returns text
  */
-OO.ui.LabeledElement.static.label = null;
+OO.ui.TitledElement.static.title = null;
 
 /* Methods */
 
 /**
- * Set the label.
+ * Set the titled element.
  *
- * An empty string will result in the label being hidden. A string containing only whitespace will
- * be converted to a single &nbsp;
+ * If an element is already set, it will be cleaned up before setting up the new element.
  *
- * @param {jQuery|string|Function|null} label Label nodes; text; a function that retuns nodes or
- *  text; or null for no label
- * @chainable
+ * @param {jQuery} $titled Element to set title on
  */
-OO.ui.LabeledElement.prototype.setLabel = function ( label ) {
-       var empty = false;
-
-       this.label = label = OO.ui.resolveMsg( label ) || null;
-       if ( typeof label === 'string' && label.length ) {
-               if ( label.match( /^\s*$/ ) ) {
-                       // Convert whitespace only string to a single non-breaking space
-                       this.$label.html( '&nbsp;' );
-               } else {
-                       this.$label.text( label );
-               }
-       } else if ( label instanceof jQuery ) {
-               this.$label.empty().append( label );
-       } else {
-               this.$label.empty();
-               empty = true;
+OO.ui.TitledElement.prototype.setTitledElement = function ( $titled ) {
+       if ( this.$titled ) {
+               this.$titled.removeAttr( 'title' );
        }
-       this.$element.toggleClass( 'oo-ui-labeledElement', !empty );
-       this.$label.css( 'display', empty ? 'none' : '' );
 
-       return this;
+       this.$titled = $titled;
+       if ( this.title ) {
+               this.$titled.attr( 'title', this.title );
+       }
 };
 
 /**
- * Get the label.
+ * Set title.
  *
- * @return {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
- *  text; or null for no label
+ * @param {string|Function|null} title Title text, a function that returns text or null for no title
+ * @chainable
  */
-OO.ui.LabeledElement.prototype.getLabel = function () {
-       return this.label;
+OO.ui.TitledElement.prototype.setTitle = function ( title ) {
+       title = typeof title === 'string' ? OO.ui.resolveMsg( title ) : null;
+
+       if ( this.title !== title ) {
+               if ( this.$titled ) {
+                       if ( title !== null ) {
+                               this.$titled.attr( 'title', title );
+                       } else {
+                               this.$titled.removeAttr( 'title' );
+                       }
+               }
+               this.title = title;
+       }
+
+       return this;
 };
 
 /**
- * Fit the label.
+ * Get title.
  *
- * @chainable
+ * @return {string} Title string
  */
-OO.ui.LabeledElement.prototype.fitLabel = function () {
-       if ( this.$label.autoEllipsis && this.autoFitLabel ) {
-               this.$label.autoEllipsis( { hasSpan: false, tooltip: true } );
-       }
-       return this;
+OO.ui.TitledElement.prototype.getTitle = function () {
+       return this.title;
 };
 
 /**
- * Element containing an OO.ui.PopupWidget object.
+ * Element that can be automatically clipped to visible boundaries.
+ *
+ * Whenever the element's natural height changes, you have to call
+ * #clip to make sure it's still clipping correctly.
  *
  * @abstract
  * @class
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {Object} [popup] Configuration to pass to popup
- * @cfg {boolean} [autoClose=true] Popup auto-closes when it loses focus
+ * @cfg {jQuery} [$clippable] Nodes to clip, assigned to #$clippable, omit to use #$element
  */
-OO.ui.PopuppableElement = function OoUiPopuppableElement( config ) {
+OO.ui.ClippableElement = function OoUiClippableElement( config ) {
        // Configuration initialization
        config = config || {};
 
        // Properties
-       this.popup = new OO.ui.PopupWidget( $.extend(
-               { autoClose: true },
-               config.popup,
-               { $: this.$, $autoCloseIgnore: this.$element }
-       ) );
+       this.$clippable = null;
+       this.clipping = false;
+       this.clippedHorizontally = false;
+       this.clippedVertically = false;
+       this.$clippableContainer = null;
+       this.$clippableScroller = null;
+       this.$clippableWindow = null;
+       this.idealWidth = null;
+       this.idealHeight = null;
+       this.onClippableContainerScrollHandler = OO.ui.bind( this.clip, this );
+       this.onClippableWindowResizeHandler = OO.ui.bind( this.clip, this );
+
+       // Initialization
+       this.setClippableElement( config.$clippable || this.$element );
 };
 
 /* Methods */
 
 /**
- * Get popup.
+ * Set clippable element.
  *
- * @return {OO.ui.PopupWidget} Popup widget
+ * If an element is already set, it will be cleaned up before setting up the new element.
+ *
+ * @param {jQuery} $clippable Element to make clippable
  */
-OO.ui.PopuppableElement.prototype.getPopup = function () {
-       return this.popup;
+OO.ui.ClippableElement.prototype.setClippableElement = function ( $clippable ) {
+       if ( this.$clippable ) {
+               this.$clippable.removeClass( 'oo-ui-clippableElement-clippable' );
+               this.$clippable.css( { width: '', height: '' } );
+               this.$clippable.width(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
+               this.$clippable.css( { overflowX: '', overflowY: '' } );
+       }
+
+       this.$clippable = $clippable.addClass( 'oo-ui-clippableElement-clippable' );
+       this.clip();
 };
 
 /**
- * Element with a title.
- *
- * Titles are rendered by the browser and are made visible when hovering the element. Titles are
- * not visible on touch devices.
+ * Toggle clipping.
  *
- * @abstract
- * @class
+ * Do not turn clipping on until after the element is attached to the DOM and visible.
  *
- * @constructor
- * @param {jQuery} $label Titled node, assigned to #$titled
- * @param {Object} [config] Configuration options
- * @cfg {string|Function} [title] Title text or a function that returns text
+ * @param {boolean} [clipping] Enable clipping, omit to toggle
+ * @chainable
  */
-OO.ui.TitledElement = function OoUiTitledElement( $titled, config ) {
-       // Config intialization
-       config = config || {};
+OO.ui.ClippableElement.prototype.toggleClipping = function ( clipping ) {
+       clipping = clipping === undefined ? !this.clipping : !!clipping;
 
-       // Properties
-       this.$titled = $titled;
-       this.title = null;
+       if ( this.clipping !== clipping ) {
+               this.clipping = clipping;
+               if ( clipping ) {
+                       this.$clippableContainer = this.$( this.getClosestScrollableElementContainer() );
+                       // If the clippable container is the body, we have to listen to scroll events and check
+                       // jQuery.scrollTop on the window because of browser inconsistencies
+                       this.$clippableScroller = this.$clippableContainer.is( 'body' ) ?
+                               this.$( OO.ui.Element.getWindow( this.$clippableContainer ) ) :
+                               this.$clippableContainer;
+                       this.$clippableScroller.on( 'scroll', this.onClippableContainerScrollHandler );
+                       this.$clippableWindow = this.$( this.getElementWindow() )
+                               .on( 'resize', this.onClippableWindowResizeHandler );
+                       // Initial clip after visible
+                       this.clip();
+               } else {
+                       this.$clippable.css( { width: '', height: '' } );
+                       this.$clippable.width(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
+                       this.$clippable.css( { overflowX: '', overflowY: '' } );
 
-       // Initialization
-       this.setTitle( config.title || this.constructor.static.title );
+                       this.$clippableContainer = null;
+                       this.$clippableScroller.off( 'scroll', this.onClippableContainerScrollHandler );
+                       this.$clippableScroller = null;
+                       this.$clippableWindow.off( 'resize', this.onClippableWindowResizeHandler );
+                       this.$clippableWindow = null;
+               }
+       }
+
+       return this;
 };
 
-/* Setup */
+/**
+ * Check if the element will be clipped to fit the visible area of the nearest scrollable container.
+ *
+ * @return {boolean} Element will be clipped to the visible area
+ */
+OO.ui.ClippableElement.prototype.isClipping = function () {
+       return this.clipping;
+};
 
-OO.initClass( OO.ui.TitledElement );
+/**
+ * Check if the bottom or right of the element is being clipped by the nearest scrollable container.
+ *
+ * @return {boolean} Part of the element is being clipped
+ */
+OO.ui.ClippableElement.prototype.isClipped = function () {
+       return this.clippedHorizontally || this.clippedVertically;
+};
 
-/* Static Properties */
+/**
+ * Check if the right of the element is being clipped by the nearest scrollable container.
+ *
+ * @return {boolean} Part of the element is being clipped
+ */
+OO.ui.ClippableElement.prototype.isClippedHorizontally = function () {
+       return this.clippedHorizontally;
+};
 
 /**
- * Title.
+ * Check if the bottom of the element is being clipped by the nearest scrollable container.
  *
- * @static
- * @inheritable
- * @property {string|Function} Title text or a function that returns text
+ * @return {boolean} Part of the element is being clipped
  */
-OO.ui.TitledElement.static.title = null;
+OO.ui.ClippableElement.prototype.isClippedVertically = function () {
+       return this.clippedVertically;
+};
 
-/* Methods */
+/**
+ * Set the ideal size.
+ *
+ * @param {number|string} [width] Width as a number of pixels or CSS string with unit suffix
+ * @param {number|string} [height] Height as a number of pixels or CSS string with unit suffix
+ */
+OO.ui.ClippableElement.prototype.setIdealSize = function ( width, height ) {
+       this.idealWidth = width;
+       this.idealHeight = height;
+};
 
 /**
- * Set title.
+ * Clip element to visible boundaries and allow scrolling when needed. Call this method when
+ * the element's natural height changes.
+ *
+ * Element will be clipped the bottom or right of the element is within 10px of the edge of, or
+ * overlapped by, the visible area of the nearest scrollable container.
  *
- * @param {string|Function|null} title Title text, a function that returns text or null for no title
  * @chainable
  */
-OO.ui.TitledElement.prototype.setTitle = function ( title ) {
-       this.title = title = OO.ui.resolveMsg( title ) || null;
+OO.ui.ClippableElement.prototype.clip = function () {
+       if ( !this.clipping ) {
+               // this.$clippableContainer and this.$clippableWindow are null, so the below will fail
+               return this;
+       }
+
+       var buffer = 10,
+               cOffset = this.$clippable.offset(),
+               $container = this.$clippableContainer.is( 'body' ) ?
+                       this.$clippableWindow : this.$clippableContainer,
+               ccOffset = $container.offset() || { top: 0, left: 0 },
+               ccHeight = $container.innerHeight() - buffer,
+               ccWidth = $container.innerWidth() - buffer,
+               scrollTop = this.$clippableScroller.scrollTop(),
+               scrollLeft = this.$clippableScroller.scrollLeft(),
+               desiredWidth = ( ccOffset.left + scrollLeft + ccWidth ) - cOffset.left,
+               desiredHeight = ( ccOffset.top + scrollTop + ccHeight ) - cOffset.top,
+               naturalWidth = this.$clippable.prop( 'scrollWidth' ),
+               naturalHeight = this.$clippable.prop( 'scrollHeight' ),
+               clipWidth = desiredWidth < naturalWidth,
+               clipHeight = desiredHeight < naturalHeight;
 
-       if ( typeof title === 'string' && title.length ) {
-               this.$titled.attr( 'title', title );
+       if ( clipWidth ) {
+               this.$clippable.css( { overflowX: 'auto', width: desiredWidth } );
        } else {
-               this.$titled.removeAttr( 'title' );
+               this.$clippable.css( 'width', this.idealWidth || '' );
+               this.$clippable.width(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
+               this.$clippable.css( 'overflowX', '' );
+       }
+       if ( clipHeight ) {
+               this.$clippable.css( { overflowY: 'auto', height: desiredHeight } );
+       } else {
+               this.$clippable.css( 'height', this.idealHeight || '' );
+               this.$clippable.height(); // Force reflow for https://code.google.com/p/chromium/issues/detail?id=387290
+               this.$clippable.css( 'overflowY', '' );
        }
 
-       return this;
-};
+       this.clippedHorizontally = clipWidth;
+       this.clippedVertically = clipHeight;
 
-/**
- * Get title.
- *
- * @return {string} Title string
- */
-OO.ui.TitledElement.prototype.getTitle = function () {
-       return this.title;
+       return this;
 };
 
 /**
@@ -4429,7 +4745,7 @@ OO.ui.TitledElement.prototype.getTitle = function () {
  * @abstract
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.IconElement
  *
  * @constructor
  * @param {OO.ui.ToolGroup} toolGroup
@@ -4444,7 +4760,7 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
        OO.ui.Tool.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.IconElement.call( this, config );
 
        // Properties
        this.toolGroup = toolGroup;
@@ -4477,7 +4793,7 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.Tool, OO.ui.Widget );
-OO.mixinClass( OO.ui.Tool, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.Tool, OO.ui.IconElement );
 
 /* Events */
 
@@ -4701,7 +5017,7 @@ OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
 
        // Mixin constructors
        OO.EventEmitter.call( this );
-       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+       OO.ui.GroupElement.call( this, config );
 
        // Properties
        this.toolFactory = toolFactory;
@@ -4916,7 +5232,7 @@ OO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) {
        OO.ui.ToolGroup.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+       OO.ui.GroupElement.call( this, config );
 
        // Properties
        this.toolbar = toolbar;
@@ -6076,7 +6392,7 @@ OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
  *
  * @class
  * @extends OO.ui.Layout
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.LabelElement
  *
  * Available label alignment modes include:
  *  - left: Label is before the field and aligned away from it, best for when the user will be
@@ -6095,7 +6411,6 @@ OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
  * @cfg {string} [help] Explanatory text shown as a '?' icon.
  */
 OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
-       var popupButtonWidget;
        // Config initialization
        config = $.extend( { align: 'left' }, config );
 
@@ -6103,27 +6418,25 @@ OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
        OO.ui.FieldLayout.super.call( this, config );
 
        // Mixin constructors
-       this.$help = this.$( '<div>' );
-       OO.ui.LabeledElement.call( this, this.$( '<label>' ), config );
-       if ( config.help ) {
-               popupButtonWidget = new OO.ui.PopupButtonWidget( $.extend(
-                       {
-                               $: this.$,
-                               frameless: true,
-                               icon: 'info',
-                               title: config.help
-                       },
-                       config,
-                       { label: null }
-               ) );
-               popupButtonWidget.getPopup().$body.append( this.getElementDocument().createTextNode( config.help ) );
-               this.$help = popupButtonWidget.$element;
-       }
+       OO.ui.LabelElement.call( this, config );
 
        // Properties
        this.$field = this.$( '<div>' );
        this.field = field;
        this.align = null;
+       if ( config.help ) {
+               this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       $: this.$,
+                       frameless: true,
+                       icon: 'info',
+                       title: config.help
+               } );
+
+               this.popupButtonWidget.getPopup().$body.append( this.$( '<span>' ).text( config.help ) );
+               this.$help = this.popupButtonWidget.$element;
+       } else {
+               this.$help = this.$( '<div>' );
+       }
 
        // Events
        if ( this.field instanceof OO.ui.InputWidget ) {
@@ -6143,7 +6456,7 @@ OO.ui.FieldLayout = function OoUiFieldLayout( field, config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.FieldLayout, OO.ui.Layout );
-OO.mixinClass( OO.ui.FieldLayout, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.FieldLayout, OO.ui.LabelElement );
 
 /* Methods */
 
@@ -6216,8 +6529,8 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
  *
  * @class
  * @extends OO.ui.Layout
- * @mixins OO.ui.LabeledElement
- * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.LabelElement
+ * @mixins OO.ui.IconElement
  * @mixins OO.ui.GroupElement
  *
  * @constructor
@@ -6233,9 +6546,9 @@ OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
        OO.ui.FieldsetLayout.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<div>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<div>' ), config );
-       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
+       OO.ui.IconElement.call( this, config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.GroupElement.call( this, config );
 
        // Initialization
        this.$element
@@ -6249,8 +6562,8 @@ OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.FieldsetLayout, OO.ui.Layout );
-OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.IconElement );
+OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.GroupElement );
 
 /* Static Properties */
@@ -6643,7 +6956,7 @@ OO.ui.StackLayout = function OoUiStackLayout( config ) {
        OO.ui.StackLayout.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.GroupElement.call( this, this.$element, config );
+       OO.ui.GroupElement.call( this, $.extend( {}, config, { $group: this.$element } ) );
 
        // Properties
        this.currentItem = null;
@@ -6829,9 +7142,9 @@ OO.ui.BarToolGroup.static.name = 'bar';
  * @abstract
  * @class
  * @extends OO.ui.ToolGroup
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.IndicatedElement
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.IndicatorElement
+ * @mixins OO.ui.LabelElement
  * @mixins OO.ui.TitledElement
  * @mixins OO.ui.ClippableElement
  *
@@ -6848,11 +7161,11 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
        OO.ui.PopupToolGroup.super.call( this, toolbar, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
-       OO.ui.TitledElement.call( this, this.$element, config );
-       OO.ui.ClippableElement.call( this, this.$group, config );
+       OO.ui.IconElement.call( this, config );
+       OO.ui.IndicatorElement.call( this, config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.TitledElement.call( this, config );
+       OO.ui.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );
 
        // Properties
        this.active = false;
@@ -6888,9 +7201,9 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.PopupToolGroup, OO.ui.ToolGroup );
-OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IndicatedElement );
-OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IconElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.IndicatorElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.TitledElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.ClippableElement );
 
@@ -6967,13 +7280,25 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
        if ( this.active !== value ) {
                this.active = value;
                if ( value ) {
-                       this.setClipping( true );
-                       this.$element.addClass( 'oo-ui-popupToolGroup-active' );
                        this.getElementDocument().addEventListener( 'mouseup', this.onBlurHandler, true );
+
+                       // Try anchoring the popup to the left first
+                       this.$element.addClass( 'oo-ui-popupToolGroup-active oo-ui-popupToolGroup-left' );
+                       this.toggleClipping( true );
+                       if ( this.isClippedHorizontally() ) {
+                               // Anchoring to the left caused the popup to clip, so anchor it to the right instead
+                               this.toggleClipping( false );
+                               this.$element
+                                       .removeClass( 'oo-ui-popupToolGroup-left' )
+                                       .addClass( 'oo-ui-popupToolGroup-right' );
+                               this.toggleClipping( true );
+                       }
                } else {
-                       this.setClipping( false );
-                       this.$element.removeClass( 'oo-ui-popupToolGroup-active' );
                        this.getElementDocument().removeEventListener( 'mouseup', this.onBlurHandler, true );
+                       this.$element.removeClass(
+                               'oo-ui-popupToolGroup-active oo-ui-popupToolGroup-left  oo-ui-popupToolGroup-right'
+                       );
+                       this.toggleClipping( false );
                }
        }
 };
@@ -7067,7 +7392,7 @@ OO.ui.MenuToolGroup.prototype.onUpdateState = function () {
  * @abstract
  * @class
  * @extends OO.ui.Tool
- * @mixins OO.ui.PopuppableElement
+ * @mixins OO.ui.PopupElement
  *
  * @constructor
  * @param {OO.ui.Toolbar} toolbar
@@ -7078,7 +7403,7 @@ OO.ui.PopupTool = function OoUiPopupTool( toolbar, config ) {
        OO.ui.PopupTool.super.call( this, toolbar, config );
 
        // Mixin constructors
-       OO.ui.PopuppableElement.call( this, config );
+       OO.ui.PopupElement.call( this, config );
 
        // Initialization
        this.$element
@@ -7089,7 +7414,7 @@ OO.ui.PopupTool = function OoUiPopupTool( toolbar, config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.PopupTool, OO.ui.Tool );
-OO.mixinClass( OO.ui.PopupTool, OO.ui.PopuppableElement );
+OO.mixinClass( OO.ui.PopupTool, OO.ui.PopupElement );
 
 /* Methods */
 
@@ -7125,12 +7450,11 @@ OO.ui.PopupTool.prototype.onUpdateState = function () {
  * @extends OO.ui.GroupElement
  *
  * @constructor
- * @param {jQuery} $group Container node, assigned to #$group
  * @param {Object} [config] Configuration options
  */
-OO.ui.GroupWidget = function OoUiGroupWidget( $element, config ) {
+OO.ui.GroupWidget = function OoUiGroupWidget( config ) {
        // Parent constructor
-       OO.ui.GroupWidget.super.call( this, $element, config );
+       OO.ui.GroupWidget.super.call( this, config );
 };
 
 /* Setup */
@@ -7456,7 +7780,7 @@ OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.GroupElement
- * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.IconElement
  *
  * @constructor
  * @param {OO.ui.OutlineWidget} outline Outline to control
@@ -7470,8 +7794,8 @@ OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, confi
        OO.ui.OutlineControlsWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.GroupElement.call( this, this.$( '<div>' ), config );
-       OO.ui.IconedElement.call( this, this.$( '<div>' ), config );
+       OO.ui.GroupElement.call( this, config );
+       OO.ui.IconElement.call( this, config );
 
        // Properties
        this.outline = outline;
@@ -7518,7 +7842,7 @@ OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, confi
 
 OO.inheritClass( OO.ui.OutlineControlsWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.GroupElement );
-OO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.IconElement );
 
 /* Events */
 
@@ -7641,7 +7965,7 @@ OO.ui.ButtonGroupWidget = function OoUiButtonGroupWidget( config ) {
        OO.ui.ButtonGroupWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.GroupElement.call( this, this.$element, config );
+       OO.ui.GroupElement.call( this, $.extend( {}, config, { $group: this.$element } ) );
 
        // Initialization
        this.$element.addClass( 'oo-ui-buttonGroupWidget' );
@@ -7660,12 +7984,12 @@ OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.GroupElement );
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.ButtonedElement
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.IndicatedElement
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.ButtonElement
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.IndicatorElement
+ * @mixins OO.ui.LabelElement
  * @mixins OO.ui.TitledElement
- * @mixins OO.ui.FlaggableElement
+ * @mixins OO.ui.FlaggedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -7680,12 +8004,12 @@ OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
        OO.ui.ButtonWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.ButtonedElement.call( this, this.$( '<a>' ), config );
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
-       OO.ui.TitledElement.call( this, this.$button, config );
-       OO.ui.FlaggableElement.call( this, config );
+       OO.ui.ButtonElement.call( this, config );
+       OO.ui.IconElement.call( this, config );
+       OO.ui.IndicatorElement.call( this, config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.TitledElement.call( this, config, $.extend( {}, config, { $titled: this.$button } ) );
+       OO.ui.FlaggedElement.call( this, config );
 
        // Properties
        this.href = null;
@@ -7710,12 +8034,12 @@ OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.ButtonWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.ButtonedElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IndicatedElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.ButtonElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IconElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.IndicatorElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.ButtonWidget, OO.ui.TitledElement );
-OO.mixinClass( OO.ui.ButtonWidget, OO.ui.FlaggableElement );
+OO.mixinClass( OO.ui.ButtonWidget, OO.ui.FlaggedElement );
 
 /* Events */
 
@@ -7912,7 +8236,7 @@ OO.ui.ActionWidget.prototype.propagateResize = function () {
  */
 OO.ui.ActionWidget.prototype.setIcon = function () {
        // Mixin method
-       OO.ui.IconedElement.prototype.setIcon.apply( this, arguments );
+       OO.ui.IconElement.prototype.setIcon.apply( this, arguments );
        this.propagateResize();
 
        return this;
@@ -7923,7 +8247,7 @@ OO.ui.ActionWidget.prototype.setIcon = function () {
  */
 OO.ui.ActionWidget.prototype.setLabel = function () {
        // Mixin method
-       OO.ui.LabeledElement.prototype.setLabel.apply( this, arguments );
+       OO.ui.LabelElement.prototype.setLabel.apply( this, arguments );
        this.propagateResize();
 
        return this;
@@ -7934,7 +8258,7 @@ OO.ui.ActionWidget.prototype.setLabel = function () {
  */
 OO.ui.ActionWidget.prototype.setFlags = function () {
        // Mixin method
-       OO.ui.FlaggableElement.prototype.setFlags.apply( this, arguments );
+       OO.ui.FlaggedElement.prototype.setFlags.apply( this, arguments );
        this.propagateResize();
 
        return this;
@@ -7945,7 +8269,7 @@ OO.ui.ActionWidget.prototype.setFlags = function () {
  */
 OO.ui.ActionWidget.prototype.clearFlags = function () {
        // Mixin method
-       OO.ui.FlaggableElement.prototype.clearFlags.apply( this, arguments );
+       OO.ui.FlaggedElement.prototype.clearFlags.apply( this, arguments );
        this.propagateResize();
 
        return this;
@@ -7970,7 +8294,7 @@ OO.ui.ActionWidget.prototype.toggle = function () {
  *
  * @class
  * @extends OO.ui.ButtonWidget
- * @mixins OO.ui.PopuppableElement
+ * @mixins OO.ui.PopupElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -7980,7 +8304,7 @@ OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
        OO.ui.PopupButtonWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.PopuppableElement.call( this, config );
+       OO.ui.PopupElement.call( this, config );
 
        // Initialization
        this.$element
@@ -7991,7 +8315,7 @@ OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.PopupButtonWidget, OO.ui.ButtonWidget );
-OO.mixinClass( OO.ui.PopupButtonWidget, OO.ui.PopuppableElement );
+OO.mixinClass( OO.ui.PopupButtonWidget, OO.ui.PopupElement );
 
 /* Methods */
 
@@ -8076,9 +8400,11 @@ OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
 /**
  * Icon widget.
  *
+ * See OO.ui.IconElement for more information.
+ *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.IconedElement
+ * @mixins OO.ui.IconElement
  * @mixins OO.ui.TitledElement
  *
  * @constructor
@@ -8092,8 +8418,8 @@ OO.ui.IconWidget = function OoUiIconWidget( config ) {
        OO.ui.IconWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$element, config );
-       OO.ui.TitledElement.call( this, this.$element, config );
+       OO.ui.IconElement.call( this, $.extend( {}, config, { $icon: this.$element } ) );
+       OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$element } ) );
 
        // Initialization
        this.$element.addClass( 'oo-ui-iconWidget' );
@@ -8102,7 +8428,7 @@ OO.ui.IconWidget = function OoUiIconWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.IconWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.IconWidget, OO.ui.IconedElement );
+OO.mixinClass( OO.ui.IconWidget, OO.ui.IconElement );
 OO.mixinClass( OO.ui.IconWidget, OO.ui.TitledElement );
 
 /* Static Properties */
@@ -8112,11 +8438,11 @@ OO.ui.IconWidget.static.tagName = 'span';
 /**
  * Indicator widget.
  *
- * See OO.ui.IndicatedElement for more information.
+ * See OO.ui.IndicatorElement for more information.
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.IndicatorElement
  * @mixins OO.ui.TitledElement
  *
  * @constructor
@@ -8130,8 +8456,8 @@ OO.ui.IndicatorWidget = function OoUiIndicatorWidget( config ) {
        OO.ui.IndicatorWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.IndicatedElement.call( this, this.$element, config );
-       OO.ui.TitledElement.call( this, this.$element, config );
+       OO.ui.IndicatorElement.call( this, $.extend( {}, config, { $indicator: this.$element } ) );
+       OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$element } ) );
 
        // Initialization
        this.$element.addClass( 'oo-ui-indicatorWidget' );
@@ -8140,7 +8466,7 @@ OO.ui.IndicatorWidget = function OoUiIndicatorWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.IndicatorWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.IndicatorElement );
 OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.TitledElement );
 
 /* Static Properties */
@@ -8157,9 +8483,9 @@ OO.ui.IndicatorWidget.static.tagName = 'span';
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.IndicatedElement
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.IndicatorElement
+ * @mixins OO.ui.LabelElement
  * @mixins OO.ui.TitledElement
  *
  * @constructor
@@ -8174,10 +8500,10 @@ OO.ui.InlineMenuWidget = function OoUiInlineMenuWidget( config ) {
        OO.ui.InlineMenuWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
-       OO.ui.TitledElement.call( this, this.$label, config );
+       OO.ui.IconElement.call( this, config );
+       OO.ui.IndicatorElement.call( this, config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$label } ) );
 
        // Properties
        this.menu = new OO.ui.MenuWidget( $.extend( { $: this.$, widget: this }, config.menu ) );
@@ -8199,9 +8525,9 @@ OO.ui.InlineMenuWidget = function OoUiInlineMenuWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.InlineMenuWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IndicatedElement );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IconElement );
+OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IndicatorElement );
+OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.TitledElement );
 
 /* Methods */
@@ -8538,8 +8864,8 @@ OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
  *
  * @class
  * @extends OO.ui.InputWidget
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.IndicatorElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -8556,8 +8882,8 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        OO.ui.TextInputWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.IconElement.call( this, config );
+       OO.ui.IndicatorElement.call( this, config );
 
        // Properties
        this.pending = 0;
@@ -8584,8 +8910,8 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.TextInputWidget, OO.ui.InputWidget );
-OO.mixinClass( OO.ui.TextInputWidget, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.TextInputWidget, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.TextInputWidget, OO.ui.IconElement );
+OO.mixinClass( OO.ui.TextInputWidget, OO.ui.IndicatorElement );
 
 /* Events */
 
@@ -8926,7 +9252,7 @@ OO.ui.ComboBoxWidget.prototype.setDisabled = function ( disabled ) {
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.LabelElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -8939,7 +9265,7 @@ OO.ui.LabelWidget = function OoUiLabelWidget( config ) {
        OO.ui.LabelWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.LabeledElement.call( this, this.$element, config );
+       OO.ui.LabelElement.call( this, $.extend( {}, config, { $label: this.$element } ) );
 
        // Properties
        this.input = config.input;
@@ -8956,7 +9282,7 @@ OO.ui.LabelWidget = function OoUiLabelWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.LabelWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.LabelWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.LabelWidget, OO.ui.LabelElement );
 
 /* Static Properties */
 
@@ -8979,8 +9305,8 @@ OO.ui.LabelWidget.prototype.onClick = function () {
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.LabeledElement
- * @mixins OO.ui.FlaggableElement
+ * @mixins OO.ui.LabelElement
+ * @mixins OO.ui.FlaggedElement
  *
  * @constructor
  * @param {Mixed} data Option data
@@ -8996,8 +9322,8 @@ OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
 
        // Mixin constructors
        OO.ui.ItemWidget.call( this );
-       OO.ui.LabeledElement.call( this, this.$( '<span>' ), config );
-       OO.ui.FlaggableElement.call( this, config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.FlaggedElement.call( this, config );
 
        // Properties
        this.data = data;
@@ -9021,8 +9347,8 @@ OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
 
 OO.inheritClass( OO.ui.OptionWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.OptionWidget, OO.ui.ItemWidget );
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.LabeledElement );
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.FlaggableElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.LabelElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.FlaggedElement );
 
 /* Static Properties */
 
@@ -9181,8 +9507,8 @@ OO.ui.OptionWidget.prototype.getData = function () {
  *
  * @class
  * @extends OO.ui.OptionWidget
- * @mixins OO.ui.IconedElement
- * @mixins OO.ui.IndicatedElement
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.IndicatorElement
  *
  * @constructor
  * @param {Mixed} data Option data
@@ -9193,8 +9519,8 @@ OO.ui.DecoratedOptionWidget = function OoUiDecoratedOptionWidget( data, config )
        OO.ui.DecoratedOptionWidget.super.call( this, data, config );
 
        // Mixin constructors
-       OO.ui.IconedElement.call( this, this.$( '<span>' ), config );
-       OO.ui.IndicatedElement.call( this, this.$( '<span>' ), config );
+       OO.ui.IconElement.call( this, config );
+       OO.ui.IndicatorElement.call( this, config );
 
        // Initialization
        this.$element
@@ -9206,8 +9532,8 @@ OO.ui.DecoratedOptionWidget = function OoUiDecoratedOptionWidget( data, config )
 /* Setup */
 
 OO.inheritClass( OO.ui.DecoratedOptionWidget, OO.ui.OptionWidget );
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.IconedElement );
-OO.mixinClass( OO.ui.OptionWidget, OO.ui.IndicatedElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.IconElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.IndicatorElement );
 
 /**
  * Option widget that looks like a button.
@@ -9216,7 +9542,7 @@ OO.mixinClass( OO.ui.OptionWidget, OO.ui.IndicatedElement );
  *
  * @class
  * @extends OO.ui.DecoratedOptionWidget
- * @mixins OO.ui.ButtonedElement
+ * @mixins OO.ui.ButtonElement
  *
  * @constructor
  * @param {Mixed} data Option data
@@ -9227,7 +9553,7 @@ OO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( data, config ) {
        OO.ui.ButtonOptionWidget.super.call( this, data, config );
 
        // Mixin constructors
-       OO.ui.ButtonedElement.call( this, this.$( '<a>' ), config );
+       OO.ui.ButtonElement.call( this, config );
 
        // Initialization
        this.$element.addClass( 'oo-ui-buttonOptionWidget' );
@@ -9238,7 +9564,7 @@ OO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( data, config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.ButtonOptionWidget, OO.ui.DecoratedOptionWidget );
-OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.ButtonedElement );
+OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.ButtonElement );
 
 /* Static Properties */
 
@@ -9445,7 +9771,7 @@ OO.ui.OutlineItemWidget.prototype.setLevel = function ( level ) {
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.LabeledElement
+ * @mixins OO.ui.LabelElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -9468,14 +9794,14 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        OO.ui.PopupWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.LabeledElement.call( this, this.$( '<div>' ), config );
-       OO.ui.ClippableElement.call( this, this.$( '<div>' ), config );
+       OO.ui.LabelElement.call( this, config );
+       OO.ui.ClippableElement.call( this, config );
 
        // Properties
        this.visible = false;
        this.$popup = this.$( '<div>' );
        this.$head = this.$( '<div>' );
-       this.$body = this.$clippable;
+       this.$body = this.$( '<div>' );
        this.$anchor = this.$( '<div>' );
        this.$container = config.$container || this.$( 'body' );
        this.autoClose = !!config.autoClose;
@@ -9515,12 +9841,13 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        if ( config.padded ) {
                this.$body.addClass( 'oo-ui-popupWidget-body-padded' );
        }
+       this.setClippableElement( this.$body );
 };
 
 /* Setup */
 
 OO.inheritClass( OO.ui.PopupWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.PopupWidget, OO.ui.LabeledElement );
+OO.mixinClass( OO.ui.PopupWidget, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.PopupWidget, OO.ui.ClippableElement );
 
 /* Events */
@@ -9614,13 +9941,13 @@ OO.ui.PopupWidget.prototype.toggle = function ( show ) {
 
        if ( change ) {
                if ( show ) {
-                       this.setClipping( true );
+                       this.toggleClipping( true );
                        if ( this.autoClose ) {
                                this.bindMouseDownListener();
                        }
                        this.updateDimensions();
                } else {
-                       this.setClipping( false );
+                       this.toggleClipping( false );
                        if ( this.autoClose ) {
                                this.unbindMouseDownListener();
                        }
@@ -9890,7 +10217,7 @@ OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
        OO.ui.SelectWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.GroupWidget.call( this, this.$element, config );
+       OO.ui.GroupWidget.call( this, $.extend( {}, config, { $group: this.$element } ) );
 
        // Properties
        this.pressed = false;
@@ -10435,7 +10762,7 @@ OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
        OO.ui.MenuWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.ClippableElement.call( this, this.$group, config );
+       OO.ui.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );
 
        // Properties
        this.flashing = false;
@@ -10574,13 +10901,7 @@ OO.ui.MenuWidget.prototype.chooseItem = function ( item ) {
 };
 
 /**
- * Add items.
- *
- * Adding an existing item (by value) will move it.
- *
- * @param {OO.ui.MenuItemWidget[]} items Items to add
- * @param {number} [index] Index to insert items after
- * @chainable
+ * @inheritdoc
  */
 OO.ui.MenuWidget.prototype.addItems = function ( items, index ) {
        var i, len, item;
@@ -10596,13 +10917,42 @@ OO.ui.MenuWidget.prototype.addItems = function ( items, index ) {
        for ( i = 0, len = items.length; i < len; i++ ) {
                item = items[i];
                if ( this.isVisible() ) {
-                       // Defer fitting label until
+                       // Defer fitting label until item has been attached
                        item.fitLabel();
                } else {
                        this.newItems.push( item );
                }
        }
 
+       // Reevaluate clipping
+       this.clip();
+
+       return this;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MenuWidget.prototype.removeItems = function ( items ) {
+       // Parent method
+       OO.ui.MenuWidget.super.prototype.removeItems.call( this, items );
+
+       // Reevaluate clipping
+       this.clip();
+
+       return this;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MenuWidget.prototype.clearItems = function () {
+       // Parent method
+       OO.ui.MenuWidget.super.prototype.clearItems.call( this );
+
+       // Reevaluate clipping
+       this.clip();
+
        return this;
 };
 
@@ -10633,7 +10983,7 @@ OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
                                }
                                this.newItems = null;
                        }
-                       this.setClipping( true );
+                       this.toggleClipping( true );
 
                        // Auto-hide
                        if ( this.autoHide ) {
@@ -10650,7 +11000,7 @@ OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
                        this.getElementDocument().removeEventListener(
                                'mousedown', this.onDocumentMouseDownHandler, true
                        );
-                       this.setClipping( false );
+                       this.toggleClipping( false );
                }
        }
 
@@ -10660,7 +11010,7 @@ OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
 /**
  * Menu for a text input widget.
  *
- * This menu is specially designed to be positioned beneeth the text input widget. Even if the input
+ * This menu is specially designed to be positioned beneath the text input widget. Even if the input
  * is in a different frame, the menu's position is automatically calulated and maintained when the
  * menu is toggled or the window is resized.
  *
index 7f919a3..dd0811f 100644 (file)
 /*!
- * OOjs UI v0.1.0-pre (43f379c884)
+ * OOjs UI v0.1.0-pre (36d0c7dc3b)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-08-28T21:49:12Z
+ * Date: 2014-09-04T00:40:40Z
  */
-.oo-ui-icon-add-item{background-image:url(images/icons/add-item.svg)}.oo-ui-icon-advanced{background-image:url(images/icons/advanced.svg)}.oo-ui-icon-alert{background-image:url(images/icons/alert.svg)}.oo-ui-icon-check{background-image:url(images/icons/check.svg)}.oo-ui-icon-clear{background-image:url(images/icons/clear.svg)}.oo-ui-icon-close{background-image:url(images/icons/close.svg)}.oo-ui-icon-code{background-image:url(images/icons/code.svg)}.oo-ui-icon-collapse{background-image:url(images/icons/collapse.svg)}.oo-ui-icon-comment{background-image:url(images/icons/comment.svg)}.oo-ui-icon-expand{background-image:url(images/icons/expand.svg)}.oo-ui-icon-help{background-image:url(images/icons/help.svg)}.oo-ui-icon-info{background-image:url(images/icons/info.svg)}.oo-ui-icon-link{background-image:url(images/icons/link.svg)}.oo-ui-icon-menu{background-image:url(images/icons/menu.svg)}.oo-ui-icon-next{background-image:url(images/icons/move-ltr.svg)}.oo-ui-icon-picture{background-image:url(images/icons/picture.svg)}.oo-ui-icon-previous{background-image:url(images/icons/move-rtl.svg)}.oo-ui-icon-redo{background-image:url(images/icons/arched-arrow-ltr.svg)}.oo-ui-icon-remove{background-image:url(images/icons/remove.svg)}.oo-ui-icon-search{background-image:url(images/icons/search.svg)}.oo-ui-icon-settings{background-image:url(images/icons/settings.svg)}.oo-ui-icon-tag{background-image:url(images/icons/tag.svg)}.oo-ui-icon-undo{background-image:url(images/icons/arched-arrow-rtl.svg)}.oo-ui-icon-window{background-image:url(images/icons/window.svg)}.oo-ui-indicator-alert{background-image:url(images/indicators/alert.svg)}.oo-ui-indicator-down{background-image:url(images/indicators/arrow-down.svg)}.oo-ui-indicator-next{background-image:url(images/indicators/arrow-ltr.svg)}.oo-ui-indicator-previous{background-image:url(images/indicators/arrow-rtl.svg)}.oo-ui-indicator-required{background-image:url(images/indicators/required.svg)}.oo-ui-indicator-up{background-image:url(images/indicators/arrow-up.svg)}.oo-ui-texture-pending{background-image:url(images/textures/pending.gif)}.oo-ui-texture-transparency{background-image:url(images/textures/transparency.svg)}
\ No newline at end of file
+/*
+ * Blank theme mixins.
+ *
+ * Base styles invoke these mixins at the end of their definitions. Override these mixins to add
+ * additional rules to the base styles.
+ */
+.oo-ui-icon-add-item {
+  background-image: /* @embed */ url(images/icons/add-item.svg);
+}
+.oo-ui-icon-advanced {
+  background-image: /* @embed */ url(images/icons/advanced.svg);
+}
+.oo-ui-icon-alert {
+  background-image: /* @embed */ url(images/icons/alert.svg);
+}
+.oo-ui-icon-check {
+  background-image: /* @embed */ url(images/icons/check.svg);
+}
+.oo-ui-icon-clear {
+  background-image: /* @embed */ url(images/icons/clear.svg);
+}
+.oo-ui-icon-close {
+  background-image: /* @embed */ url(images/icons/close.svg);
+}
+.oo-ui-icon-code {
+  background-image: /* @embed */ url(images/icons/code.svg);
+}
+.oo-ui-icon-collapse {
+  background-image: /* @embed */ url(images/icons/collapse.svg);
+}
+.oo-ui-icon-comment {
+  background-image: /* @embed */ url(images/icons/comment.svg);
+}
+.oo-ui-icon-expand {
+  background-image: /* @embed */ url(images/icons/expand.svg);
+}
+.oo-ui-icon-help {
+  background-image: /* @embed */ url(images/icons/help.svg);
+}
+.oo-ui-icon-info {
+  background-image: /* @embed */ url(images/icons/info.svg);
+}
+.oo-ui-icon-link {
+  background-image: /* @embed */ url(images/icons/link.svg);
+}
+.oo-ui-icon-menu {
+  background-image: /* @embed */ url(images/icons/menu.svg);
+}
+.oo-ui-icon-next {
+  background-image: /* @embed */ url(images/icons/move-ltr.svg);
+}
+.oo-ui-icon-picture {
+  background-image: /* @embed */ url(images/icons/picture.svg);
+}
+.oo-ui-icon-previous {
+  background-image: /* @embed */ url(images/icons/move-rtl.svg);
+}
+.oo-ui-icon-redo {
+  background-image: /* @embed */ url(images/icons/arched-arrow-ltr.svg);
+}
+.oo-ui-icon-remove {
+  background-image: /* @embed */ url(images/icons/remove.svg);
+}
+.oo-ui-icon-search {
+  background-image: /* @embed */ url(images/icons/search.svg);
+}
+.oo-ui-icon-settings {
+  background-image: /* @embed */ url(images/icons/settings.svg);
+}
+.oo-ui-icon-tag {
+  background-image: /* @embed */ url(images/icons/tag.svg);
+}
+.oo-ui-icon-undo {
+  background-image: /* @embed */ url(images/icons/arched-arrow-rtl.svg);
+}
+.oo-ui-icon-window {
+  background-image: /* @embed */ url(images/icons/window.svg);
+}
+.oo-ui-indicator-alert {
+  background-image: /* @embed */ url(images/indicators/alert.svg);
+}
+.oo-ui-indicator-down {
+  background-image: /* @embed */ url(images/indicators/arrow-down.svg);
+}
+.oo-ui-indicator-next {
+  background-image: /* @embed */ url(images/indicators/arrow-ltr.svg);
+}
+.oo-ui-indicator-previous {
+  background-image: /* @embed */ url(images/indicators/arrow-rtl.svg);
+}
+.oo-ui-indicator-required {
+  background-image: /* @embed */ url(images/indicators/required.svg);
+}
+.oo-ui-indicator-up {
+  background-image: /* @embed */ url(images/indicators/arrow-up.svg);
+}
+.oo-ui-texture-pending {
+  background-image: /* @embed */ url(images/textures/pending.gif);
+}
+.oo-ui-texture-transparency {
+  background-image: /* @embed */ url(images/textures/transparency.svg);
+}
index 061f5d6..9a196b5 100644 (file)
@@ -108,7 +108,7 @@ $.fn.autoEllipsis = function ( options ) {
                                        r = trimmableText.length;
                                        do {
                                                m = Math.ceil( ( l + r ) / 2 );
-                                               $trimmableText.text( trimmableText.substr( 0, m ) + '...' );
+                                               $trimmableText.text( trimmableText.slice( 0, m ) + '...' );
                                                if ( $trimmableText.width() + pw > w ) {
                                                        // Text is too long
                                                        r = m - 1;
@@ -116,7 +116,7 @@ $.fn.autoEllipsis = function ( options ) {
                                                        l = m;
                                                }
                                        } while ( l < r );
-                                       $trimmableText.text( trimmableText.substr( 0, l ) + '...' );
+                                       $trimmableText.text( trimmableText.slice( 0, l ) + '...' );
                                        break;
                                case 'center':
                                        // TODO: Use binary search like for 'right'
@@ -124,7 +124,7 @@ $.fn.autoEllipsis = function ( options ) {
                                        // Begin with making the end shorter
                                        side = 1;
                                        while ( $trimmableText.outerWidth() + pw > w && i[0] > 0 ) {
-                                               $trimmableText.text( trimmableText.substr( 0, i[0] ) + '...' + trimmableText.substr( i[1] ) );
+                                               $trimmableText.text( trimmableText.slice( 0, i[0] ) + '...' + trimmableText.slice( i[1] ) );
                                                // Alternate between trimming the end and begining
                                                if ( side === 0 ) {
                                                        // Make the begining shorter
@@ -141,7 +141,7 @@ $.fn.autoEllipsis = function ( options ) {
                                        // TODO: Use binary search like for 'right'
                                        r = 0;
                                        while ( $trimmableText.outerWidth() + pw > w && r < trimmableText.length ) {
-                                               $trimmableText.text( '...' + trimmableText.substr( r ) );
+                                               $trimmableText.text( '...' + trimmableText.slice( r ) );
                                                r++;
                                        }
                                        break;
index de05fdf..5551232 100644 (file)
 
                inpParts = [
                        // Same start
-                       newVal.substring( 0, startMatches ),
+                       newVal.slice( 0, startMatches ),
                        // Inserted content
-                       newVal.substring( startMatches, newVal.length - endMatches ),
+                       newVal.slice( startMatches, newVal.length - endMatches ),
                        // Same end
-                       newVal.substring( newVal.length - endMatches )
+                       newVal.slice( newVal.length - endMatches )
                ];
 
                // Chop off characters from the end of the "inserted content" string
index 1881085..d7024cc 100644 (file)
@@ -51,7 +51,7 @@ jQuery._farbtastic = function (container, callback) {
                $('*', e).each(function () {
                        if (this.currentStyle.backgroundImage != 'none') {
                                var image = this.currentStyle.backgroundImage;
-                               image = this.currentStyle.backgroundImage.substring(5, image.length - 2);
+                               image = this.currentStyle.backgroundImage.slice(5, image.length - 2);
                                $(this).css({
                                        'backgroundImage': 'none',
                                        'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
index 71b083b..4ecfeb8 100644 (file)
@@ -110,7 +110,7 @@ $.matchSrcSet = function ( devicePixelRatio, srcset ) {
                bits = candidate.split( / +/ );
                src = bits[0];
                if ( bits.length > 1 && bits[1].charAt( bits[1].length - 1 ) === 'x' ) {
-                       ratioStr = bits[1].substr( 0, bits[1].length - 1 );
+                       ratioStr = bits[1].slice( 0, -1 );
                        ratio = parseFloat( ratioStr );
                        if ( ratio <= devicePixelRatio && ratio > selectedRatio ) {
                                selectedRatio = ratio;
index cdcb8fb..dc7aaa4 100644 (file)
@@ -12,7 +12,7 @@
                                        '' : str.toString().replace( /\s+$/, '' );
                },
                ucFirst: function ( str ) {
-                       return str.charAt( 0 ).toUpperCase() + str.substr( 1 );
+                       return str.charAt( 0 ).toUpperCase() + str.slice( 1 );
                },
                escapeRE: function ( str ) {
                        return str.replace ( /([\\{}()|.?*+\-\^$\[\]])/g, '\\$1' );
index 289cd22..8d440fd 100644 (file)
                                                } else {
                                                        while ( selText.charAt( selText.length - 1 ) === ' ' ) {
                                                                // Exclude ending space char
-                                                               selText = selText.substring( 0, selText.length - 1 );
+                                                               selText = selText.slice( 0, -1 );
                                                                post += ' ';
                                                        }
                                                        while ( selText.charAt( 0 ) === ' ' ) {
                                                                // Exclude prepending space char
-                                                               selText = selText.substring( 1, selText.length );
+                                                               selText = selText.slice( 1 );
                                                                pre = ' ' + pre;
                                                        }
                                                }
                                                                        post += '\n';
                                                                }
                                                        }
-                                                       this.value = this.value.substring( 0, startPos ) + insertText +
-                                                               this.value.substring( endPos, this.value.length );
+                                                       this.value = this.value.slice( 0, startPos ) + insertText +
+                                                               this.value.slice( endPos );
                                                        // Setting this.value scrolls the textarea to the top, restore the scroll position
                                                        this.scrollTop = scrollTop;
                                                        if ( window.opera ) {
index 2382aae..453a675 100644 (file)
@@ -34,7 +34,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        break;
                case 'illative':
                        // Double the last letter and add 'n'
-                       word += word.substr(  word.length - 1 ) + 'n';
+                       word += word.slice( -1 ) + 'n';
                        break;
                case 'inessive':
                        word += ( aou ? 'ssa' : 'ssä' );
index 48351bc..d1eba43 100644 (file)
@@ -11,17 +11,17 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                case 'prefixed':
                case 'תחילית': // the same word in Hebrew
                        // Duplicate prefixed "Waw", but only if it's not already double
-                       if ( word.substr( 0, 1 ) === 'ו' && word.substr( 0, 2 ) !== 'וו' ) {
+                       if ( word.slice( 0, 1 ) === 'ו' && word.slice( 0, 2 ) !== 'וו' ) {
                                word = 'ו' + word;
                        }
 
                        // Remove the "He" if prefixed
-                       if ( word.substr( 0, 1 ) === 'ה' ) {
-                               word = word.substr( 1, word.length );
+                       if ( word.slice( 0, 1 ) === 'ה' ) {
+                               word = word.slice( 1 );
                        }
 
                        // Add a hyphen (maqaf) before numbers and non-Hebrew letters
-                       if ( word.substr( 0, 1 ) < 'א' ||  word.substr( 0, 1 ) > 'ת' ) {
+                       if ( word.slice( 0, 1 ) < 'א' ||  word.slice( 0, 1 ) > 'ת' ) {
                                word = '־' + word;
                        }
        }
index ae16f24..9cae360 100644 (file)
@@ -14,12 +14,12 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
 
        switch ( form ) {
                case 'genitive': // սեռական հոլով
-                       if ( word.substr( -1 ) === 'ա' ) {
-                               word = word.substr( 0, word.length - 1 ) + 'այի';
-                       } else if ( word.substr( -1 ) === 'ո' ) {
-                               word = word.substr( 0, word.length - 1 ) + 'ոյի';
-                       } else if ( word.substr( -4 ) === 'գիրք' ) {
-                               word = word.substr( 0, word.length - 4 ) + 'գրքի';
+                       if ( word.slice( -1 ) === 'ա' ) {
+                               word = word.slice( 0, -1 ) + 'այի';
+                       } else if ( word.slice( -1 ) === 'ո' ) {
+                               word = word.slice( 0, -1 ) + 'ոյի';
+                       } else if ( word.slice( -4 ) === 'գիրք' ) {
+                               word = word.slice( 0, -4 ) + 'գրքի';
                        } else {
                                word = word + 'ի';
                        }
index bdf59be..787be36 100644 (file)
@@ -19,7 +19,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        }
        // Checking if the $word is in plural form
        if ( word.match( /тæ$/i ) ) {
-               word = word.substring( 0, word.length - 1 );
+               word = word.slice( 0, -1 );
                endAllative = 'æм';
        }
        // Works if word is in singular form.
@@ -30,7 +30,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        // Checking if word ends on 'у'. 'У' can be either consonant 'W' or vowel 'U' in cyrillic Ossetic.
        // Examples: {{grammar:genitive|аунеу}} = аунеуы, {{grammar:genitive|лæппу}} = лæппуйы.
        else if ( word.match( /у$/i ) ) {
-               if ( !word.substring( word.length - 2, word.length - 1 ).match( /[аæеёиоыэюя]$/i ) ) {
+               if ( !word.slice( -2, -1 ).match( /[аæеёиоыэюя]$/i ) ) {
                        jot = 'й';
                }
        } else if ( !word.match( /[бвгджзйклмнопрстфхцчшщьъ]$/i ) ) {
index b6ba59f..2077b6b 100644 (file)
@@ -15,41 +15,41 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        }
        switch ( form ) {
                case 'genitive': // родительный падеж
-                       if ( word.substr( word.length - 1 ) === 'ь' ) {
-                               word = word.substr(0, word.length - 1 ) + 'я';
-                       } else if ( word.substr( word.length - 2 ) === 'ия' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ии';
-                       } else if ( word.substr( word.length - 2 ) === 'ка' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ки';
-                       } else if ( word.substr( word.length - 2 )  === 'ти' ) {
-                               word = word.substr(0, word.length - 2 ) + 'тей';
-                       } else if ( word.substr( word.length - 2 ) === 'ды' ) {
-                               word = word.substr(0, word.length - 2 ) + 'дов';
-                       } else if ( word.substr( word.length - 1 ) === 'д' ) {
-                               word = word.substr(0, word.length - 1 ) + 'да';
-                       } else if ( word.substr( word.length - 3 ) === 'ные' ) {
-                               word = word.substr(0, word.length - 3 ) + 'ных';
-                       } else if ( word.substr( word.length - 3 ) === 'ник' ) {
-                               word = word.substr(0, word.length - 3 ) + 'ника';
+                       if ( word.slice( -1 ) === 'ь' ) {
+                               word = word.slice( 0, -1 ) + 'я';
+                       } else if ( word.slice( -2 ) === 'ия' ) {
+                               word = word.slice( 0, -2 ) + 'ии';
+                       } else if ( word.slice( -2 ) === 'ка' ) {
+                               word = word.slice( 0, -2 ) + 'ки';
+                       } else if ( word.slice( -2 ) === 'ти' ) {
+                               word = word.slice( 0, -2 ) + 'тей';
+                       } else if ( word.slice( -2 ) === 'ды' ) {
+                               word = word.slice( 0, -2 ) + 'дов';
+                       } else if ( word.slice( -1 ) === 'д' ) {
+                               word = word.slice( 0, -1 ) + 'да';
+                       } else if ( word.slice( -3 ) === 'ные' ) {
+                               word = word.slice( 0, -3 ) + 'ных';
+                       } else if ( word.slice( -3 ) === 'ник' ) {
+                               word = word.slice( 0, -3 ) + 'ника';
                        }
                        break;
                case 'prepositional': // предложный падеж
-                       if ( word.substr( word.length - 1 ) === 'ь' ) {
-                               word = word.substr(0, word.length - 1 ) + 'е';
-                       } else if ( word.substr( word.length - 2 ) === 'ия' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ии';
-                       } else if ( word.substr( word.length - 2 ) === 'ка' ) {
-                               word = word.substr(0, word.length - 2 ) + 'ке';
-                       } else if ( word.substr( word.length - 2 )  === 'ти' ) {
-                               word = word.substr(0, word.length - 2 ) + 'тях';
-                       } else if ( word.substr( word.length - 2 ) === 'ды' ) {
-                               word = word.substr(0, word.length - 2 ) + 'дах';
-                       } else if ( word.substr( word.length - 1 ) === 'д' ) {
-                               word = word.substr(0, word.length - 1 ) + 'де';
-                       } else if ( word.substr( word.length - 3 ) === 'ные' ) {
-                               word = word.substr(0, word.length - 3 ) + 'ных';
-                       } else if ( word.substr( word.length - 3 ) === 'ник' ) {
-                               word = word.substr(0, word.length - 3 ) + 'нике';
+                       if ( word.slice( -1 ) === 'ь' ) {
+                               word = word.slice( 0, -1 ) + 'е';
+                       } else if ( word.slice( -2 ) === 'ия' ) {
+                               word = word.slice( 0, -2 ) + 'ии';
+                       } else if ( word.slice( -2 ) === 'ка' ) {
+                               word = word.slice( 0, -2 ) + 'ке';
+                       } else if ( word.slice( -2 ) === 'ти' ) {
+                               word = word.slice( 0, -2 ) + 'тях';
+                       } else if ( word.slice( -2 ) === 'ды' ) {
+                               word = word.slice( 0, -2 ) + 'дах';
+                       } else if ( word.slice( -1 ) === 'д' ) {
+                               word = word.slice( 0, -1 ) + 'де';
+                       } else if ( word.slice( -3 ) === 'ные' ) {
+                               word = word.slice( 0, -3 ) + 'ных';
+                       } else if ( word.slice( -3 ) === 'ник' ) {
+                               word = word.slice( 0, -3 ) + 'нике';
                        }
                        break;
        }
index 69f7ec5..550a388 100644 (file)
@@ -9,26 +9,26 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
        }
        switch ( form ) {
                case 'genitive': // родовий відмінок
-                       if ( word.substr( word.length - 4 ) !== 'вікі' && word.substr( word.length - 4 ) !== 'Вікі' ) {
-                               if ( word.substr( word.length - 1 ) === 'ь' ) {
-                                       word = word.substr(0, word.length - 1 ) + 'я';
-                               } else if ( word.substr( word.length - 2 ) === 'ія' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'ії';
-                               } else if ( word.substr( word.length - 2 ) === 'ка' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'ки';
-                               } else if ( word.substr( word.length - 2 ) === 'ти' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'тей';
-                               } else if ( word.substr( word.length - 2 ) === 'ды' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'дов';
-                               } else if ( word.substr( word.length - 3 ) === 'ник' ) {
-                                       word = word.substr(0, word.length - 3 ) + 'ника';
+                       if ( word.slice( -4 ) !== 'вікі' && word.slice( -4 ) !== 'Вікі' ) {
+                               if ( word.slice( -1 ) === 'ь' ) {
+                                       word = word.slice(0, -1 ) + 'я';
+                               } else if ( word.slice( -2 ) === 'ія' ) {
+                                       word = word.slice(0, -2 ) + 'ії';
+                               } else if ( word.slice( -2 ) === 'ка' ) {
+                                       word = word.slice(0, -2 ) + 'ки';
+                               } else if ( word.slice( -2 ) === 'ти' ) {
+                                       word = word.slice(0, -2 ) + 'тей';
+                               } else if ( word.slice( -2 ) === 'ды' ) {
+                                       word = word.slice(0, -2 ) + 'дов';
+                               } else if ( word.slice( -3 ) === 'ник' ) {
+                                       word = word.slice(0, -3 ) + 'ника';
                                }
                        }
                        break;
                case 'accusative': // знахідний відмінок
-                       if ( word.substr( word.length - 4 ) !== 'вікі' && word.substr( word.length - 4 ) !== 'Вікі' ) {
-                               if ( word.substr( word.length - 2 ) === 'ія' ) {
-                                       word = word.substr(0, word.length - 2 ) + 'ію';
+                       if ( word.slice( -4 ) !== 'вікі' && word.slice( -4 ) !== 'Вікі' ) {
+                               if ( word.slice( -2 ) === 'ія' ) {
+                                       word = word.slice(0, -2 ) + 'ію';
                                }
                        }
                        break;
index 2e84858..d4f3c69 100644 (file)
@@ -59,9 +59,9 @@ $.extend( mw.language, {
                        form = forms[index];
                        if ( /^\d+=/.test( form ) ) {
                                equalsPosition = form.indexOf( '=' );
-                               formCount = parseInt( form.substring( 0, equalsPosition ), 10 );
+                               formCount = parseInt( form.slice( 0, equalsPosition ), 10 );
                                if ( formCount === count ) {
-                                       return form.substr( equalsPosition + 1 );
+                                       return form.slice( equalsPosition + 1 );
                                }
                                forms[index] = undefined;
                        }
index 8bd2de9..a0b8141 100644 (file)
 
                        // Truncate fractional
                        if ( maxPlaces < fractional.length ) {
-                               valueParts[1] = fractional.substr( 0, maxPlaces );
+                               valueParts[1] = fractional.slice( 0, maxPlaces );
                        }
                } else {
                        if ( valueParts[1] ) {
 
                        // Truncate whole
                        if ( patternDigits.indexOf( '#' ) === -1 ) {
-                               valueParts[0] = valueParts[0].substr( valueParts[0].length - padLength );
+                               valueParts[0] = valueParts[0].slice( valueParts[0].length - padLength );
                        }
                }
 
 
                if ( index !== -1 ) {
                        groupSize = patternParts[0].length - index - 1;
-                       remainder = patternParts[0].substr( 0, index );
+                       remainder = patternParts[0].slice( 0, index );
                        index = remainder.lastIndexOf( ',' );
                        if ( index !== -1 ) {
                                groupSize2 = remainder.length - index - 1;
 
                for ( whole = valueParts[0]; whole; ) {
                        off = groupSize ? whole.length - groupSize : 0;
-                       pieces.push( ( off > 0 ) ? whole.substr( off ) : whole );
+                       pieces.push( ( off > 0 ) ? whole.slice( off ) : whole );
                        whole = ( off > 0 ) ? whole.slice( 0, off ) : '';
 
                        if ( groupSize2 ) {
index 144bdf9..c81b388 100644 (file)
                                if ( slash === -1 && backslash === -1 ) {
                                        fname = path;
                                } else if ( slash > backslash ) {
-                                       fname = path.substring( slash + 1 );
+                                       fname = path.slice( slash + 1 );
                                } else {
-                                       fname = path.substring( backslash + 1 );
+                                       fname = path.slice( backslash + 1 );
                                }
 
                                // Clear the filename if it does not have a valid extension.
                                        if (
                                                fname.lastIndexOf( '.' ) === -1 ||
                                                $.inArray(
-                                                       fname.substr( fname.lastIndexOf( '.' ) + 1 ).toLowerCase(),
+                                                       fname.slice( fname.lastIndexOf( '.' ) + 1 ).toLowerCase(),
                                                        $.map( mw.config.get( 'wgFileExtensions' ), function ( element ) {
                                                                return element.toLowerCase();
                                                        } )
                                fname = fname.replace( / /g, '_' );
                                // Capitalise first letter if needed
                                if ( mw.config.get( 'wgCapitalizeUploads' ) ) {
-                                       fname = fname.charAt( 0 ).toUpperCase().concat( fname.substring( 1 ) );
+                                       fname = fname.charAt( 0 ).toUpperCase().concat( fname.slice( 1 ) );
                                }
 
                                // Output result
diff --git a/resources/src/mediawiki.skinning/content.css b/resources/src/mediawiki.skinning/content.css
new file mode 100644 (file)
index 0000000..622afe6
--- /dev/null
@@ -0,0 +1,232 @@
+/**
+ * MediaWiki style sheet for general styles on complex content
+ *
+ * Styles for complex things which are a standard part of page content
+ * (ie: the CSS classing built into the system), like the TOC.
+ */
+
+/* Table of Contents */
+#toc,
+.toc,
+.mw-warning {
+       border: 1px solid #aaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       font-size: 95%;
+}
+
+/**
+ * We want to display the ToC element with intrinsic width in block mode. The fit-content
+ * value for width is however not supported by large groups of browsers.
+ *
+ * We use display:table. Even though it should only contain other table-* display
+ * elements, there are no known problems with using this.
+ *
+ * Because IE < 8, FF 2 and other older browsers don't support display:table, we fallback to
+ * using inline-block mode, which features at least intrinsic width, but won't clear preceding
+ * inline elements. In practice inline elements surrounding the TOC are uncommon enough that
+ * this is an acceptable sacrifice.
+ */
+#toc,
+.toc {
+       display: -moz-inline-block;
+       display: inline-block;
+       display: table;
+
+       /* IE7 and earlier */
+       zoom: 1;
+       *display: inline;
+
+       padding: 7px;
+}
+
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+       border-collapse: collapse;
+}
+
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+       padding: 0;
+}
+
+#toc h2,
+.toc h2 {
+       display: inline;
+       border: none;
+       padding: 0;
+       font-size: 100%;
+       font-weight: bold;
+}
+
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+       text-align: center;
+}
+
+#toc ul,
+.toc ul {
+       list-style-type: none;
+       list-style-image: none;
+       margin-left: 0;
+       padding: 0;
+       text-align: left;
+}
+
+#toc ul ul,
+.toc ul ul {
+       margin: 0 0 0 2em;
+}
+
+#toc .toctoggle,
+.toc .toctoggle {
+       font-size: 94%;
+}
+
+.toccolours {
+       border: 1px solid #aaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       font-size: 95%;
+}
+
+/* Warning */
+.mw-warning {
+       margin-left: 50px;
+       margin-right: 50px;
+       text-align: center;
+}
+
+/* Images */
+/* @noflip */div.floatright, table.floatright {
+       margin: 0 0 .5em .5em;
+       border: 0;
+}
+
+div.floatright p {
+       font-style: italic;
+}
+
+/* @noflip */div.floatleft, table.floatleft {
+       margin: 0 .5em .5em 0;
+       border: 0;
+}
+
+div.floatleft p {
+       font-style: italic;
+}
+
+/* Thumbnails */
+div.thumb {
+       margin-bottom: .5em;
+       width: auto;
+       background-color: transparent;
+}
+
+div.thumbinner {
+       border: 1px solid #ccc;
+       padding: 3px;
+       background-color: #f9f9f9;
+       font-size: 94%;
+       text-align: center;
+       overflow: hidden;
+}
+
+html .thumbimage {
+       border: 1px solid #ccc;
+}
+
+html .thumbcaption {
+       border: none;
+       line-height: 1.4em;
+       padding: 3px;
+       font-size: 94%;
+       /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
+       text-align: left;
+}
+
+div.magnify {
+       /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
+       float: right;
+       margin-left: 3px;
+}
+
+div.magnify a {
+       display: block;
+       /* Hide the text… */
+       text-indent: 15px;
+       white-space: nowrap;
+       overflow: hidden;
+       /* …and replace it with the image */
+       width: 15px;
+       height: 11px;
+       /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
+       /* @embed */
+       background: url(images/magnify-clip-ltr.png) center center no-repeat;
+       /* Don't annoy people who copy-paste everything too much */
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+/* Temporary WMF deployment hack, to be removed before 1.24 release */
+div.magnify img {
+       display: none;
+}
+
+img.thumbborder {
+       border: 1px solid #dddddd;
+}
+
+/* Directionality-specific styles for thumbnails - their positioning depends on content language */
+
+/* @noflip */
+.mw-content-ltr .thumbcaption {
+       text-align: left;
+}
+
+/* @noflip */
+.mw-content-ltr .magnify {
+       float: right;
+       margin-left: 3px;
+       margin-right: 0;
+}
+
+/* @noflip */
+.mw-content-ltr div.magnify a {
+       /* @embed */
+       background-image: url(images/magnify-clip-ltr.png);
+}
+
+/* @noflip */
+.mw-content-rtl .thumbcaption {
+       text-align: right;
+}
+
+/* @noflip */
+.mw-content-rtl .magnify {
+       float: left;
+       margin-left: 0;
+       margin-right: 3px;
+}
+
+/* @noflip */
+.mw-content-rtl div.magnify a {
+       /* @embed */
+       background-image: url(images/magnify-clip-rtl.png);
+}
+
+/* @noflip */
+div.tright {
+       margin: .5em 0 1.3em 1.4em;
+}
+
+/* @noflip */
+div.tleft {
+       margin: .5em 1.4em 1.3em 0;
+}
diff --git a/resources/src/mediawiki.skinning/elements.css b/resources/src/mediawiki.skinning/elements.css
new file mode 100644 (file)
index 0000000..392a2a6
--- /dev/null
@@ -0,0 +1,273 @@
+/**
+ * MediaWiki style sheet for general styles on basic content elements
+ *
+ * Styles for basic elements: links, lists, etc...
+ *
+ * This style sheet is used by the Monobook and Vector skins.
+ */
+
+/* Links */
+a {
+       text-decoration: none;
+       color: #0645ad;
+       background: none;
+}
+
+a:visited {
+       color: #0b0080;
+}
+
+a:active {
+       color: #faa700;
+}
+
+a:hover, a:focus {
+       text-decoration: underline;
+}
+
+a.stub {
+       color: #772233;
+}
+
+a.new, #p-personal a.new {
+       color: #ba0000;
+}
+
+a.new:visited, #p-personal a.new:visited {
+       color: #a55858;
+}
+
+/* Interwiki Styling */
+.mw-body a.extiw,
+.mw-body a.extiw:active {
+       color: #36b;
+}
+
+.mw-body a.extiw:visited {
+       color: #636;
+}
+
+.mw-body a.extiw:active {
+       color: #b63;
+}
+
+/* External links */
+.mw-body a.external {
+       color: #36b;
+}
+
+.mw-body a.external:visited {
+       color: #636; /* bug 3112 */
+}
+
+.mw-body a.external:active {
+       color: #b63;
+}
+
+/* Inline Elements */
+img {
+       border: none;
+       vertical-align: middle;
+}
+
+hr {
+       height: 1px;
+       color: #aaa;
+       background-color: #aaa;
+       border: 0;
+       margin: .2em 0;
+}
+
+/* Structural Elements */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+       color: black;
+       background: none;
+       font-weight: normal;
+       margin: 0;
+       overflow: hidden;
+       padding-top: .5em;
+       padding-bottom: .17em;
+       border-bottom: 1px solid #aaa;
+}
+
+h1 {
+       font-size: 188%;
+}
+
+h2 {
+       font-size: 150%;
+}
+
+h3,
+h4,
+h5,
+h6 {
+       border-bottom: none;
+       font-weight: bold;
+}
+
+h3 {
+       font-size: 132%;
+}
+
+h4 {
+       font-size: 116%;
+}
+
+h5 {
+       font-size: 108%;
+}
+
+h6 {
+       font-size: 100%;
+}
+
+/* Some space under the headers in the content area */
+h1,
+h2 {
+       margin-bottom: .6em;
+}
+
+h3,
+h4,
+h5 {
+       margin-bottom: .3em;
+}
+
+p {
+       margin: .4em 0 .5em 0;
+       line-height: 1.5em;
+}
+
+p img {
+       margin: 0;
+}
+
+ul {
+       line-height: 1.5em;
+       list-style-type: square;
+       margin: .3em 0 0 1.6em;
+       padding: 0;
+}
+
+ol {
+       line-height: 1.5em;
+       margin: .3em 0 0 3.2em;
+       padding: 0;
+       list-style-image: none;
+}
+
+li {
+       margin-bottom: .1em;
+}
+
+dt {
+       font-weight: bold;
+       margin-bottom: .1em;
+}
+
+dl {
+       margin-top: .2em;
+       margin-bottom: .5em;
+}
+
+dd {
+       line-height: 1.5em;
+       margin-left: 1.6em;
+       margin-bottom: .1em;
+}
+
+/* IE 6 and 7 lack support for quotes aroud the <q> element ('::before' and '::after'
+   pseudoelements, 'quotes' property). Let's italicize it instead (using the star hack). */
+q {
+       *font-style: italic;
+}
+
+pre, code, tt, kbd, samp, .mw-code {
+       /*
+        * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
+        * Specifying any valid, second value will trigger correct behavior without forcing a different font.
+        */
+       font-family: monospace, Courier;
+}
+
+code {
+       color: black;
+       background-color: #f9f9f9;
+       border: 1px solid #ddd;
+       border-radius: 2px;
+       padding: 1px 4px;
+}
+
+pre, .mw-code {
+       color: black;
+       background-color: #f9f9f9;
+       border: 1px solid #ddd;
+       padding: 1em;
+}
+
+/* Tables */
+table {
+       font-size: 100%;
+}
+
+/* Forms */
+fieldset {
+       border: 1px solid #2f6fab;
+       margin: 1em 0 1em 0;
+       padding: 0 1em 1em;
+       line-height: 1.5em;
+}
+
+fieldset.nested {
+       margin: 0 0 0.5em 0;
+       padding: 0 0.5em 0.5em;
+}
+
+legend {
+       padding: .5em;
+       font-size: 95%;
+}
+
+form {
+       border: none;
+       margin: 0;
+}
+
+textarea {
+       width: 100%;
+       padding: .1em;
+       display: block;
+       -moz-box-sizing: border-box;
+       -webkit-box-sizing: border-box;
+       box-sizing: border-box;
+}
+
+select {
+       vertical-align: top;
+}
+
+/* Emulate Center */
+.center {
+       width: 100%;
+       text-align: center;
+}
+
+*.center * {
+       margin-left: auto;
+       margin-right: auto;
+}
+
+/* Small for tables and similar */
+.small {
+       font-size: 94%;
+}
+
+table.small {
+       font-size: 100%;
+}
diff --git a/resources/src/mediawiki.skinning/images/magnify-clip-ltr.png b/resources/src/mediawiki.skinning/images/magnify-clip-ltr.png
new file mode 100644 (file)
index 0000000..00a9cee
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/magnify-clip-ltr.png differ
diff --git a/resources/src/mediawiki.skinning/images/magnify-clip-rtl.png b/resources/src/mediawiki.skinning/images/magnify-clip-rtl.png
new file mode 100644 (file)
index 0000000..ff85c07
Binary files /dev/null and b/resources/src/mediawiki.skinning/images/magnify-clip-rtl.png differ
diff --git a/resources/src/mediawiki.skinning/interface.css b/resources/src/mediawiki.skinning/interface.css
new file mode 100644 (file)
index 0000000..733fd11
--- /dev/null
@@ -0,0 +1,71 @@
+/**
+ * MediaWiki style sheet for common core styles on interfaces
+ *
+ * Styles for the Monobook/Vector pattern of laying out common interfaces.
+ * These ids/classes are not built into the system,
+ * they are outputted by the actual MonoBook/Vector code by convention.
+ */
+
+/* Categories */
+.catlinks {
+       border: 1px solid #aaa;
+       background-color: #f9f9f9;
+       padding: 5px;
+       margin-top: 1em;
+       clear: both;
+}
+
+/* User Message */
+.usermessage {
+       background-color: #ffce7b;
+       border: 1px solid #ffa500;
+       color: black;
+       font-weight: bold;
+       margin: 2em 0 1em;
+       padding: .5em 1em;
+       vertical-align: middle;
+}
+
+/* Site Notice (includes notices from CentralNotice extension) */
+#siteNotice {
+       position: relative;
+       text-align: center;
+       margin: 0;
+}
+
+#localNotice {
+       margin-bottom: 0.9em;
+}
+
+/* First h1 */
+.firstHeading,
+#firstHeading {
+       margin-bottom: .1em;
+       /* These two rules hack around bug 2013 (fix for more limited bug 11325).
+        * When bug 2013 is fixed properly, they should be removed. */
+       line-height: 1.2em;
+       padding-bottom: 0;
+}
+
+/* Sub-navigation */
+#siteSub {
+       display: none;
+}
+
+#jump-to-nav {
+       /* Negate #contentSub's margin and replicate it so that the jump to links don't affect the spacing */
+       margin-top: -1.4em;
+       margin-bottom: 1.4em;
+}
+
+#contentSub, #contentSub2 {
+       font-size: 84%;
+       line-height: 1.2em;
+       margin: 0 0 1.4em 1em;
+       color: #545454;
+       width: auto;
+}
+
+span.subpages {
+       display: block;
+}
index a4128f9..b27fe34 100644 (file)
@@ -39,8 +39,8 @@
                                var parts = $( this ).attr( 'href' ).split( 'search=' ),
                                        lastpart = '',
                                        prefix = 'search=';
-                               if ( parts.length > 1 && parts[1].indexOf( '&' ) >= 0 ) {
-                                       lastpart = parts[1].substring( parts[1].indexOf( '&' ) );
+                               if ( parts.length > 1 && parts[1].indexOf( '&' ) !== -1 ) {
+                                       lastpart = parts[1].slice( parts[1].indexOf( '&' ) );
                                } else {
                                        prefix = '&search=';
                                }
index 4387608..fc8e7e9 100644 (file)
                        namespace = NS_MAIN;
                        title = title
                                // Strip colon
-                               .substr( 1 )
+                               .slice( 1 )
                                // Trim underscores
                                .replace( rUnderscoreTrim, '' );
                }
                } else {
                        fragment = title
                                // Get segment starting after the hash
-                               .substr( i + 1 )
+                               .slice( i + 1 )
                                // Convert to text
                                // NB: Must not be trimmed ("Example#_foo" is not the same as "Example#foo")
                                .replace( /_/g, ' ' );
 
                        title = title
                                // Strip hash
-                               .substr( 0, i )
+                               .slice( 0, i )
                                // Trim underscores, again (strips "_" from "bar" in "Foo_bar_#quux")
                                .replace( rUnderscoreTrim, '' );
                }
                                title.indexOf( '../' ) === 0 ||
                                title.indexOf( '/./' ) !== -1 ||
                                title.indexOf( '/../' ) !== -1 ||
-                               title.substr( title.length - 2 ) === '/.' ||
-                               title.substr( title.length - 3 ) === '/..'
+                               title.slice( -2 ) === '/.' ||
+                               title.slice( -3 ) === '/..'
                        )
                ) {
                        return false;
                        // Extensions are the non-empty segment after the last dot
                        ext = null;
                } else {
-                       ext = title.substr( i + 1 );
-                       title = title.substr( 0, i );
+                       ext = title.slice( i + 1 );
+                       title = title.slice( 0, i );
                }
 
                return {
index 505a9be..4935984 100644 (file)
@@ -61,7 +61,7 @@
                 */
                switchPane: function ( e ) {
                        var currentPaneId = debug.$container.data( 'currentPane' ),
-                               requestedPaneId = $( this ).prop( 'id' ).substr( 9 ),
+                               requestedPaneId = $( this ).prop( 'id' ).slice( 9 ),
                                $currentPane = $( '#mw-debug-pane-' + currentPaneId ),
                                $requestedPane = $( '#mw-debug-pane-' + requestedPaneId ),
                                hovDone = false;
 
                        gitInfo = '';
                        if ( this.data.gitRevision !== false ) {
-                               gitInfo = '(' + this.data.gitRevision.substring( 0, 7 ) + ')';
+                               gitInfo = '(' + this.data.gitRevision.slice( 0, 7 ) + ')';
                                if ( this.data.gitViewUrl !== false ) {
                                        gitInfo = $( '<a>' )
                                                .attr( 'href', this.data.gitViewUrl )
index b4d5773..7bbbbd3 100644 (file)
        ProfileData.groupOf = function ( label ) {
                var pos, prefix = 'Profile section ended by close(): ';
                if ( label.indexOf( prefix ) === 0 ) {
-                       label = label.substring( prefix.length );
+                       label = label.slice( prefix.length );
                }
 
                pos = [ '::', ':', '-' ].reduce( function ( result, separator ) {
                if ( pos === -1 ) {
                        return label;
                } else {
-                       return label.substring( 0, pos );
+                       return label.slice( 0, pos );
                }
        };
 
index eda7689..8e9fc89 100644 (file)
                },
 
                /**
-                * Perform a substring search across the JavaScript and CSS source code
+                * Perform a string search across the JavaScript and CSS source code
                 * of all loaded modules and return an array of the names of the
                 * modules that matched.
                 *
index a81730e..ad71b08 100644 (file)
                         */
                        function makeRegexParser( regex ) {
                                return function () {
-                                       var matches = input.substr( pos ).match( regex );
+                                       var matches = input.slice( pos ).match( regex );
                                        if ( matches === null ) {
                                                return null;
                                        }
 
                                if ( parsedCloseTagResult === null ) {
                                        // Closing tag failed.  Return the start tag and contents.
-                                       return [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ]
+                                       return [ 'CONCAT', input.slice( startOpenTagPos, endOpenTagPos ) ]
                                                .concat( parsedHtmlContents );
                                }
 
                                        // parsed HTML link.
                                        //
                                        // Concatenate everything from the tag, flattening the contents.
-                                       result = [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ]
-                                               .concat( parsedHtmlContents, input.substring( startCloseTagPos, endCloseTagPos ) );
+                                       result = [ 'CONCAT', input.slice( startOpenTagPos, endOpenTagPos ) ]
+                                               .concat( parsedHtmlContents, input.slice( startCloseTagPos, endCloseTagPos ) );
                                }
 
                                return result;
index d50fe48..5e5a3ac 100644 (file)
                                                        for ( i = 0; i < modules.length; i += 1 ) {
                                                                // Determine how many bytes this module would add to the query string
                                                                lastDotIndex = modules[i].lastIndexOf( '.' );
-                                                               // Note that these substr() calls work even if lastDotIndex == -1
+
+                                                               // If lastDotIndex is -1, substr() returns an empty string
                                                                prefix = modules[i].substr( 0, lastDotIndex );
-                                                               suffix = modules[i].substr( lastDotIndex + 1 );
+                                                               suffix = modules[i].slice( lastDotIndex + 1 );
+
                                                                bytesAdded = moduleMap[prefix] !== undefined
                                                                        ? suffix.length + 3 // '%2C'.length == 3
                                                                        : modules[i].length + 3; // '%7C'.length == 3
                                                }
 
                                                for ( key in mw.loader.store.items ) {
-                                                       module = key.substring( 0, key.indexOf( '@' ) );
+                                                       module = key.slice( 0, key.indexOf( '@' ) );
                                                        if ( mw.loader.store.getModuleKey( module ) !== key ) {
                                                                mw.loader.store.stats.expired++;
                                                                delete mw.loader.store.items[key];
index 7933f1d..e93707e 100644 (file)
@@ -62,7 +62,7 @@
                                seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
                        for ( i = 0; i < 32; i++ ) {
                                r = Math.floor( Math.random() * seed.length );
-                               id += seed.substring( r, r + 1 );
+                               id += seed.charAt( r );
                        }
                        return id;
                },
diff --git a/skins/common/commonContent.css b/skins/common/commonContent.css
deleted file mode 100644 (file)
index 622afe6..0000000
+++ /dev/null
@@ -1,232 +0,0 @@
-/**
- * MediaWiki style sheet for general styles on complex content
- *
- * Styles for complex things which are a standard part of page content
- * (ie: the CSS classing built into the system), like the TOC.
- */
-
-/* Table of Contents */
-#toc,
-.toc,
-.mw-warning {
-       border: 1px solid #aaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       font-size: 95%;
-}
-
-/**
- * We want to display the ToC element with intrinsic width in block mode. The fit-content
- * value for width is however not supported by large groups of browsers.
- *
- * We use display:table. Even though it should only contain other table-* display
- * elements, there are no known problems with using this.
- *
- * Because IE < 8, FF 2 and other older browsers don't support display:table, we fallback to
- * using inline-block mode, which features at least intrinsic width, but won't clear preceding
- * inline elements. In practice inline elements surrounding the TOC are uncommon enough that
- * this is an acceptable sacrifice.
- */
-#toc,
-.toc {
-       display: -moz-inline-block;
-       display: inline-block;
-       display: table;
-
-       /* IE7 and earlier */
-       zoom: 1;
-       *display: inline;
-
-       padding: 7px;
-}
-
-/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
-table#toc,
-table.toc {
-       border-collapse: collapse;
-}
-
-/* Remove additional paddings inside table-cells that are not present in <div>s */
-table#toc td,
-table.toc td {
-       padding: 0;
-}
-
-#toc h2,
-.toc h2 {
-       display: inline;
-       border: none;
-       padding: 0;
-       font-size: 100%;
-       font-weight: bold;
-}
-
-#toc #toctitle,
-.toc #toctitle,
-#toc .toctitle,
-.toc .toctitle {
-       text-align: center;
-}
-
-#toc ul,
-.toc ul {
-       list-style-type: none;
-       list-style-image: none;
-       margin-left: 0;
-       padding: 0;
-       text-align: left;
-}
-
-#toc ul ul,
-.toc ul ul {
-       margin: 0 0 0 2em;
-}
-
-#toc .toctoggle,
-.toc .toctoggle {
-       font-size: 94%;
-}
-
-.toccolours {
-       border: 1px solid #aaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       font-size: 95%;
-}
-
-/* Warning */
-.mw-warning {
-       margin-left: 50px;
-       margin-right: 50px;
-       text-align: center;
-}
-
-/* Images */
-/* @noflip */div.floatright, table.floatright {
-       margin: 0 0 .5em .5em;
-       border: 0;
-}
-
-div.floatright p {
-       font-style: italic;
-}
-
-/* @noflip */div.floatleft, table.floatleft {
-       margin: 0 .5em .5em 0;
-       border: 0;
-}
-
-div.floatleft p {
-       font-style: italic;
-}
-
-/* Thumbnails */
-div.thumb {
-       margin-bottom: .5em;
-       width: auto;
-       background-color: transparent;
-}
-
-div.thumbinner {
-       border: 1px solid #ccc;
-       padding: 3px;
-       background-color: #f9f9f9;
-       font-size: 94%;
-       text-align: center;
-       overflow: hidden;
-}
-
-html .thumbimage {
-       border: 1px solid #ccc;
-}
-
-html .thumbcaption {
-       border: none;
-       line-height: 1.4em;
-       padding: 3px;
-       font-size: 94%;
-       /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
-       text-align: left;
-}
-
-div.magnify {
-       /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
-       float: right;
-       margin-left: 3px;
-}
-
-div.magnify a {
-       display: block;
-       /* Hide the text… */
-       text-indent: 15px;
-       white-space: nowrap;
-       overflow: hidden;
-       /* …and replace it with the image */
-       width: 15px;
-       height: 11px;
-       /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
-       /* @embed */
-       background: url(images/magnify-clip-ltr.png) center center no-repeat;
-       /* Don't annoy people who copy-paste everything too much */
-       -moz-user-select: none;
-       -webkit-user-select: none;
-       -ms-user-select: none;
-       user-select: none;
-}
-
-/* Temporary WMF deployment hack, to be removed before 1.24 release */
-div.magnify img {
-       display: none;
-}
-
-img.thumbborder {
-       border: 1px solid #dddddd;
-}
-
-/* Directionality-specific styles for thumbnails - their positioning depends on content language */
-
-/* @noflip */
-.mw-content-ltr .thumbcaption {
-       text-align: left;
-}
-
-/* @noflip */
-.mw-content-ltr .magnify {
-       float: right;
-       margin-left: 3px;
-       margin-right: 0;
-}
-
-/* @noflip */
-.mw-content-ltr div.magnify a {
-       /* @embed */
-       background-image: url(images/magnify-clip-ltr.png);
-}
-
-/* @noflip */
-.mw-content-rtl .thumbcaption {
-       text-align: right;
-}
-
-/* @noflip */
-.mw-content-rtl .magnify {
-       float: left;
-       margin-left: 0;
-       margin-right: 3px;
-}
-
-/* @noflip */
-.mw-content-rtl div.magnify a {
-       /* @embed */
-       background-image: url(images/magnify-clip-rtl.png);
-}
-
-/* @noflip */
-div.tright {
-       margin: .5em 0 1.3em 1.4em;
-}
-
-/* @noflip */
-div.tleft {
-       margin: .5em 1.4em 1.3em 0;
-}
diff --git a/skins/common/commonElements.css b/skins/common/commonElements.css
deleted file mode 100644 (file)
index 392a2a6..0000000
+++ /dev/null
@@ -1,273 +0,0 @@
-/**
- * MediaWiki style sheet for general styles on basic content elements
- *
- * Styles for basic elements: links, lists, etc...
- *
- * This style sheet is used by the Monobook and Vector skins.
- */
-
-/* Links */
-a {
-       text-decoration: none;
-       color: #0645ad;
-       background: none;
-}
-
-a:visited {
-       color: #0b0080;
-}
-
-a:active {
-       color: #faa700;
-}
-
-a:hover, a:focus {
-       text-decoration: underline;
-}
-
-a.stub {
-       color: #772233;
-}
-
-a.new, #p-personal a.new {
-       color: #ba0000;
-}
-
-a.new:visited, #p-personal a.new:visited {
-       color: #a55858;
-}
-
-/* Interwiki Styling */
-.mw-body a.extiw,
-.mw-body a.extiw:active {
-       color: #36b;
-}
-
-.mw-body a.extiw:visited {
-       color: #636;
-}
-
-.mw-body a.extiw:active {
-       color: #b63;
-}
-
-/* External links */
-.mw-body a.external {
-       color: #36b;
-}
-
-.mw-body a.external:visited {
-       color: #636; /* bug 3112 */
-}
-
-.mw-body a.external:active {
-       color: #b63;
-}
-
-/* Inline Elements */
-img {
-       border: none;
-       vertical-align: middle;
-}
-
-hr {
-       height: 1px;
-       color: #aaa;
-       background-color: #aaa;
-       border: 0;
-       margin: .2em 0;
-}
-
-/* Structural Elements */
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-       color: black;
-       background: none;
-       font-weight: normal;
-       margin: 0;
-       overflow: hidden;
-       padding-top: .5em;
-       padding-bottom: .17em;
-       border-bottom: 1px solid #aaa;
-}
-
-h1 {
-       font-size: 188%;
-}
-
-h2 {
-       font-size: 150%;
-}
-
-h3,
-h4,
-h5,
-h6 {
-       border-bottom: none;
-       font-weight: bold;
-}
-
-h3 {
-       font-size: 132%;
-}
-
-h4 {
-       font-size: 116%;
-}
-
-h5 {
-       font-size: 108%;
-}
-
-h6 {
-       font-size: 100%;
-}
-
-/* Some space under the headers in the content area */
-h1,
-h2 {
-       margin-bottom: .6em;
-}
-
-h3,
-h4,
-h5 {
-       margin-bottom: .3em;
-}
-
-p {
-       margin: .4em 0 .5em 0;
-       line-height: 1.5em;
-}
-
-p img {
-       margin: 0;
-}
-
-ul {
-       line-height: 1.5em;
-       list-style-type: square;
-       margin: .3em 0 0 1.6em;
-       padding: 0;
-}
-
-ol {
-       line-height: 1.5em;
-       margin: .3em 0 0 3.2em;
-       padding: 0;
-       list-style-image: none;
-}
-
-li {
-       margin-bottom: .1em;
-}
-
-dt {
-       font-weight: bold;
-       margin-bottom: .1em;
-}
-
-dl {
-       margin-top: .2em;
-       margin-bottom: .5em;
-}
-
-dd {
-       line-height: 1.5em;
-       margin-left: 1.6em;
-       margin-bottom: .1em;
-}
-
-/* IE 6 and 7 lack support for quotes aroud the <q> element ('::before' and '::after'
-   pseudoelements, 'quotes' property). Let's italicize it instead (using the star hack). */
-q {
-       *font-style: italic;
-}
-
-pre, code, tt, kbd, samp, .mw-code {
-       /*
-        * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
-        * Specifying any valid, second value will trigger correct behavior without forcing a different font.
-        */
-       font-family: monospace, Courier;
-}
-
-code {
-       color: black;
-       background-color: #f9f9f9;
-       border: 1px solid #ddd;
-       border-radius: 2px;
-       padding: 1px 4px;
-}
-
-pre, .mw-code {
-       color: black;
-       background-color: #f9f9f9;
-       border: 1px solid #ddd;
-       padding: 1em;
-}
-
-/* Tables */
-table {
-       font-size: 100%;
-}
-
-/* Forms */
-fieldset {
-       border: 1px solid #2f6fab;
-       margin: 1em 0 1em 0;
-       padding: 0 1em 1em;
-       line-height: 1.5em;
-}
-
-fieldset.nested {
-       margin: 0 0 0.5em 0;
-       padding: 0 0.5em 0.5em;
-}
-
-legend {
-       padding: .5em;
-       font-size: 95%;
-}
-
-form {
-       border: none;
-       margin: 0;
-}
-
-textarea {
-       width: 100%;
-       padding: .1em;
-       display: block;
-       -moz-box-sizing: border-box;
-       -webkit-box-sizing: border-box;
-       box-sizing: border-box;
-}
-
-select {
-       vertical-align: top;
-}
-
-/* Emulate Center */
-.center {
-       width: 100%;
-       text-align: center;
-}
-
-*.center * {
-       margin-left: auto;
-       margin-right: auto;
-}
-
-/* Small for tables and similar */
-.small {
-       font-size: 94%;
-}
-
-table.small {
-       font-size: 100%;
-}
diff --git a/skins/common/commonInterface.css b/skins/common/commonInterface.css
deleted file mode 100644 (file)
index 733fd11..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * MediaWiki style sheet for common core styles on interfaces
- *
- * Styles for the Monobook/Vector pattern of laying out common interfaces.
- * These ids/classes are not built into the system,
- * they are outputted by the actual MonoBook/Vector code by convention.
- */
-
-/* Categories */
-.catlinks {
-       border: 1px solid #aaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       margin-top: 1em;
-       clear: both;
-}
-
-/* User Message */
-.usermessage {
-       background-color: #ffce7b;
-       border: 1px solid #ffa500;
-       color: black;
-       font-weight: bold;
-       margin: 2em 0 1em;
-       padding: .5em 1em;
-       vertical-align: middle;
-}
-
-/* Site Notice (includes notices from CentralNotice extension) */
-#siteNotice {
-       position: relative;
-       text-align: center;
-       margin: 0;
-}
-
-#localNotice {
-       margin-bottom: 0.9em;
-}
-
-/* First h1 */
-.firstHeading,
-#firstHeading {
-       margin-bottom: .1em;
-       /* These two rules hack around bug 2013 (fix for more limited bug 11325).
-        * When bug 2013 is fixed properly, they should be removed. */
-       line-height: 1.2em;
-       padding-bottom: 0;
-}
-
-/* Sub-navigation */
-#siteSub {
-       display: none;
-}
-
-#jump-to-nav {
-       /* Negate #contentSub's margin and replicate it so that the jump to links don't affect the spacing */
-       margin-top: -1.4em;
-       margin-bottom: 1.4em;
-}
-
-#contentSub, #contentSub2 {
-       font-size: 84%;
-       line-height: 1.2em;
-       margin: 0 0 1.4em 1em;
-       color: #545454;
-       width: auto;
-}
-
-span.subpages {
-       display: block;
-}
diff --git a/skins/common/images/magnify-clip-ltr.png b/skins/common/images/magnify-clip-ltr.png
deleted file mode 100644 (file)
index 00a9cee..0000000
Binary files a/skins/common/images/magnify-clip-ltr.png and /dev/null differ
index 1005316..e8c5121 100644 (file)
@@ -41,7 +41,7 @@
                // Add two characters using scary black magic
                spanText = $span.text();
                d = findDivergenceIndex( origText, spanText );
-               spanTextNew = spanText.substr( 0, d ) + origText[d] + origText[d] + '...';
+               spanTextNew = spanText.slice( 0, d ) + origText[d] + origText[d] + '...';
 
                assert.gt( spanTextNew.length, spanText.length, 'Verify that the new span-length is indeed greater' );
 
index 9681330..5bcd57b 100644 (file)
                // Confirm that mw.loader.load() works with protocol-relative URLs
                target = target.replace( /https?:/, '' );
 
-               assert.equal( target.substr( 0, 2 ), '//',
+               assert.equal( target.slice( 0, 2 ), '//',
                        'URL must be relative to test relative URLs!'
                );