MediaWiki:Common.js: Difference between revisions

From Geometry Dash Expanded Wiki
Jump to navigation Jump to search
Keep the editor search panel and source surface at full width
Load readable find panel controls with the toolbar repair
Line 1,088: Line 1,088:
(function(){var s=document.createElement("style");s.id="expanded-gallery-consistency";s.textContent="/* Consistent gallery cards across current and legacy MediaWiki gallery markup. */\n#bodyContent .gallery .gallerybox {flex-direction:column;box-sizing:border-box;min-width:0;}\n#bodyContent .gallery .gallerybox > .thumb {display:flex;align-items:center;justify-content:center;flex:1 1 auto;width:100%!important;height:auto!important;border:0;background:none;}\n#bodyContent .gallery .gallerybox > .thumb > span,\n#bodyContent .gallery .gallerybox > .thumb > a {display:block;width:100%;}\n#bodyContent .gallery .gallerybox > .thumb img {width:100%;height:auto;max-width:100%;object-fit:contain;}\n#bodyContent .gallery .gallerybox > .gallerytext,\n#bodyContent .gallery .gallerybox > .gallerytextwrapper .gallerytext {display:block;flex:0 0 auto;width:auto;margin:1rem 0 0;padding:0 1rem;border:0;outline:0;box-shadow:none;border-radius:var(--custom-border-radius-small);line-height:inherit;text-align:center;font-size:.8rem;color:var(--wiki-content-text-color);background:var(--wiki-content-background-color--secondary);}\n#bodyContent .gallery .gallerybox > .gallerytextwrapper {position:static;display:block!important;flex:0 0 auto;width:100%!important;height:auto;max-height:none;margin:0;padding:0;background:none;}\n#bodyContent .gallery .gallerybox > .gallerytext:empty,\n#bodyContent .gallery .gallerybox > .gallerytextwrapper:has(> .gallerytext:empty) {display:none!important;}\n#bodyContent figure[typeof~=\"mw:File/Thumb\"]:has(> figcaption:empty),\n#bodyContent figure[typeof~=\"mw:File/Frame\"]:has(> figcaption:empty) {padding:0;border:0;outline:0;box-shadow:none;background:transparent;}\n#bodyContent figure > figcaption:empty {display:none!important;}\n#bodyContent .thumbinner:has(> .thumbcaption:empty) {padding:0;border:0;outline:0;box-shadow:none;background:transparent;}\n#bodyContent .thumbcaption:empty {display:none!important;}\n#bodyContent figure:has(> figcaption:empty) > a::after {display:none!important;content:none!important;}\n#bodyContent figure:has(> figcaption:empty) img {background:transparent;border:0;border-radius:0;outline:0;box-shadow:none;}\n";document.head.appendChild(s);}());
(function(){var s=document.createElement("style");s.id="expanded-gallery-consistency";s.textContent="/* Consistent gallery cards across current and legacy MediaWiki gallery markup. */\n#bodyContent .gallery .gallerybox {flex-direction:column;box-sizing:border-box;min-width:0;}\n#bodyContent .gallery .gallerybox > .thumb {display:flex;align-items:center;justify-content:center;flex:1 1 auto;width:100%!important;height:auto!important;border:0;background:none;}\n#bodyContent .gallery .gallerybox > .thumb > span,\n#bodyContent .gallery .gallerybox > .thumb > a {display:block;width:100%;}\n#bodyContent .gallery .gallerybox > .thumb img {width:100%;height:auto;max-width:100%;object-fit:contain;}\n#bodyContent .gallery .gallerybox > .gallerytext,\n#bodyContent .gallery .gallerybox > .gallerytextwrapper .gallerytext {display:block;flex:0 0 auto;width:auto;margin:1rem 0 0;padding:0 1rem;border:0;outline:0;box-shadow:none;border-radius:var(--custom-border-radius-small);line-height:inherit;text-align:center;font-size:.8rem;color:var(--wiki-content-text-color);background:var(--wiki-content-background-color--secondary);}\n#bodyContent .gallery .gallerybox > .gallerytextwrapper {position:static;display:block!important;flex:0 0 auto;width:100%!important;height:auto;max-height:none;margin:0;padding:0;background:none;}\n#bodyContent .gallery .gallerybox > .gallerytext:empty,\n#bodyContent .gallery .gallerybox > .gallerytextwrapper:has(> .gallerytext:empty) {display:none!important;}\n#bodyContent figure[typeof~=\"mw:File/Thumb\"]:has(> figcaption:empty),\n#bodyContent figure[typeof~=\"mw:File/Frame\"]:has(> figcaption:empty) {padding:0;border:0;outline:0;box-shadow:none;background:transparent;}\n#bodyContent figure > figcaption:empty {display:none!important;}\n#bodyContent .thumbinner:has(> .thumbcaption:empty) {padding:0;border:0;outline:0;box-shadow:none;background:transparent;}\n#bodyContent .thumbcaption:empty {display:none!important;}\n#bodyContent figure:has(> figcaption:empty) > a::after {display:none!important;content:none!important;}\n#bodyContent figure:has(> figcaption:empty) img {background:transparent;border:0;border-radius:0;outline:0;box-shadow:none;}\n";document.head.appendChild(s);}());
/* VisualEditor toolbar layout and find panel repair. */
/* VisualEditor toolbar layout and find panel repair. */
(function(){var s=document.createElement("style");s.id="expanded-editor-toolbar-fix";s.textContent="\n/* Editor toolbar dialogs must span the toolbar, not shrink as flex items. */\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar > .oo-ui-toolbar-bar > .oo-ui-windowManager {flex:0 0 100%!important;width:100%!important;min-width:0;max-width:100%;box-sizing:border-box;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog {width:100%!important;max-width:100%;box-sizing:border-box;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar > .oo-ui-toolbar-bar {background:#98562f;color:#fff;border:2px solid #fff;border-radius:10px;box-shadow:0 0 0 2px #171717;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-tool-link,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-popupToolGroup-handle {color:#fff;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-iconElement-icon,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-indicatorElement-indicator {background-color:transparent!important;filter:brightness(0) invert(1);}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-tool-link:hover,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-popupToolGroup-handle:hover {background:#b17d60;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-popupToolGroup-tools {background:#98562f;color:#fff;border-color:#c99972;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-window-frame,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-window-body {background:#98562f;color:#fff;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-inputWidget-input {background:#713d24;color:#fff;border:1px solid #c99972;border-radius:5px;font-family:Nunito,Arial,sans-serif;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {background:#93dc17;color:#fff;border:2px solid #fff;border-radius:7px;box-shadow:inset 0 0 0 1px #171717;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-widget-disabled .oo-ui-buttonElement-button {background:#947560;opacity:.65;}\n\nhtml.ve-active body.skin-vector-legacy .ve-ui-surface {display:block!important;width:100%!important;min-width:0;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-surface > .ve-ce-surface {width:100%!important;min-width:0;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar.ve-ui-toolbar-floating {top:var(--wikigg-header-scroll-height,64px)!important;}\n";document.head.appendChild(s);}());
(function(){var s=document.createElement("style");s.id="expanded-editor-toolbar-fix";s.textContent="\n/* Editor toolbar dialogs must span the toolbar, not shrink as flex items. */\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar > .oo-ui-toolbar-bar > .oo-ui-windowManager {flex:0 0 100%!important;width:100%!important;min-width:0;max-width:100%;box-sizing:border-box;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog {width:100%!important;max-width:100%;box-sizing:border-box;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar > .oo-ui-toolbar-bar {background:#98562f;color:#fff;border:2px solid #fff;border-radius:10px;box-shadow:0 0 0 2px #171717;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-tool-link,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-popupToolGroup-handle {color:#fff;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-iconElement-icon,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-indicatorElement-indicator {background-color:transparent!important;filter:brightness(0) invert(1);}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-tool-link:hover,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-popupToolGroup-handle:hover {background:#b17d60;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-popupToolGroup-tools {background:#98562f;color:#fff;border-color:#c99972;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-window-frame,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-window-body {background:#98562f;color:#fff;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-inputWidget-input {background:#713d24;color:#fff;border:1px solid #c99972;border-radius:5px;font-family:Nunito,Arial,sans-serif;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {background:#93dc17;color:#fff;border:2px solid #fff;border-radius:7px;box-shadow:inset 0 0 0 1px #171717;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-widget-disabled .oo-ui-buttonElement-button {background:#947560;opacity:.65;}\n\nhtml.ve-active body.skin-vector-legacy .ve-ui-surface {display:block!important;width:100%!important;min-width:0;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-surface > .ve-ce-surface {width:100%!important;min-width:0;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar.ve-ui-toolbar-floating {top:var(--wikigg-header-scroll-height,64px)!important;}\n\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {background:#b17d60;color:#fff;border-color:#c99972;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-buttonElement-active .oo-ui-buttonElement-button {background:#c27b35;}\n";document.head.appendChild(s);}());

Revision as of 23:19, 12 October 2026

/* Use the physical device width instead of Vector legacy's 1120px canvas. */
(function () {
    var viewport = document.querySelector('meta[name="viewport"]');
    if (!viewport) {
        viewport = document.createElement('meta');
        viewport.name = 'viewport';
        document.head.appendChild(viewport);
    }
    viewport.content = 'width=device-width, initial-scale=1';
}());

/* Any JavaScript here will be loaded for all users on every page load. */

/***************************/
/* Interface Modification **/
/***************************/

/* [[MediaWiki:Custom-Category:Games]] */
$(function () {
    var config = {
        targetCategory: 'Games (base content)',
        sourceContent: 'MediaWiki:Custom-Category:Games',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the content list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-Category:Gameplay]] */
$(function () {
    var config = {
        targetCategory: 'Gameplay (base content)',
        sourceContent: 'MediaWiki:Custom-Category:Gameplay',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the content list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-Category:Rewards]] */
$(function () {
    var config = {
        targetCategory: 'Rewards (base content)',
        sourceContent: 'MediaWiki:Custom-Category:Rewards',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the content list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-Category:Rooms]] */
$(function () {
    var config = {
        targetCategory: 'Rooms (base content)',
        sourceContent: 'MediaWiki:Custom-Category:Rooms',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the content list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-Category:LevelEditing]] */
$(function () {
    var config = {
        targetCategory: 'Level editing (base content)',
        sourceContent: 'MediaWiki:Custom-Category:LevelEditing',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the content list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-Category:AccountFeatures]] */
$(function () {
    var config = {
        targetCategory: 'Account features (base content)',
        sourceContent: 'MediaWiki:Custom-Category:AccountFeatures',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the content list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-Category:Updates]] */
$(function () {
    var config = {
        targetCategory: 'Updates (base content)',
        sourceContent: 'MediaWiki:Custom-Category:Updates',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the page list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-MainLevels]] */
$(function () {
    var config = {
        targetCategory: 'Main levels (base content)',
        sourceContent: 'MediaWiki:Custom-MainLevels',
        insertionPoint: '#mw-content-text'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-footer">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the footer from ' + config.sourceContent);
    });
});

/***************************/

/* [[Template:USERNAME]] */
$(function () { 
	mw.config.get('wgUserName');
	if (mw.config.get('wgUserName') !== null) ('span.username-insert').text(mw.config.get('wgUserName'));
});

/***************************/

/* [[Template:Discord]] (DiscordCompact.js v0.0.2 - https://support.wiki.gg/wiki/DiscordCompact) */
$(function () {
	var widget = $("#content #discord-compact-widget");
    // Cancel when no widget detected
    if (!widget.length) return;
    // Ensure that ID is not blank
	var id = widget.attr("data-id");
	if (id === "") throw new Error("DiscordCompact has a blank server id!");
	// Ensure that ID consists only of numbers with 17 character minimum
	if (!new RegExp("^[0-9]{17}[0-9]+$").test(id)) throw new Error("DiscordCompact has an invalid server id!");
	var apiBase = "https://discord.com/api/guilds/" + id;
	// Get information about the server, such as online member count and invite url, as well as limits of the server existing at all or having widgets disabled
	$.ajax(apiBase + "/widget.json").fail(function(req) {
        if (!req.responseJSON) throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.json (status: " + req.status);
		switch (req.responseJSON.code) {
            case 10004:
                throw new Error("DiscordCompact has a valid server id, but no such server exists!");
            case 50004:
                throw new Error("DiscordCompact has a valid server id, but that server has widgets disabled!");
            default:
                throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.json (status: " + req.status + "; code: " + req.responseJSON.code + ")");
        }
	}).done(function(res) {
		const inviteURL = res.instant_invite;
        // Warn when unable to retrieve invite URL
        if (inviteURL == null) console.warn("DiscordCompact cannot get an invite URL; does this server have an invite channel set in Widget settings?");
        // Generate widget image
        $.ajax({url: apiBase + "/widget.png?style=banner2", xhrFields: {responseType: "blob"}}).fail(function(req) {
            if (!req.responseJSON) throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.png! (status: " + req.status);
            throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.png! (status: " + req.status + "; code: " + req.responseJSON.code + ")");
        }).done(function(blob) {
            // Convert the image data into base64, preventing having to make the client request it a second time
            const imageReader = new FileReader();
            imageReader.readAsDataURL(blob);
            imageReader.onloadend = function() {
                const b64Data = imageReader.result;
                // Convert the widget into a selectable link
                widget.replaceWith(function() {
                    return $("<a>", {
                        id: widget.attr("id"),
                        class: widget.attr("class"),
                        style: widget.attr("style"),
                        alt: "Discord server widget",
                        href: inviteURL
                    });
                });
                // Select the widget
                widget = $("#discord-compact-widget");
                // CSS
                widget.css("display", "block");
                widget.css("max-height", "76px");
                widget.css("max-width", "320px");
                // Create image
                const widgetImage = document.createElement("img");
                widgetImage.src = b64Data;
                widgetImage.style.width = "100%";
                widgetImage.style.height = "100%";
                widgetImage.style.borderRadius = "4px";
                widget.append(widgetImage);
                // Prevent image dragging
                widget.on("dragstart", function(e) {e.preventDefault();});
                // Console message
                console.log("DiscordCompact loaded successfully!");
            };
        });
	});
});

/***************************/

/* [[Template:Discord]] (DiscordWidget.js - https://support.wiki.gg/wiki/DiscordWidget) */
$(function () {
	'use strict';
	var mconfig = mw.config.get([
		'wgContentLanguage',
		'wgUserLanguage',
		'wgUserName'
	]);
	if (window.DiscordIntegratorLoaded) {
		return;
	}
	window.DiscordIntegratorLoaded = true;
	// Main object, @static
	var DiscordIntegrator = {
		// Initialising
		init: function() {
			mw.hook('wikipage.content').add($.proxy(this.insertToContent, this));
		},
		//Finding the designated places in content in which to place the widget and placing it
		insertToContent: function($content) {
			$content.find('.DiscordIntegrator:not(.loaded)').each($.proxy(function(cabbage, el) {
				el = $(el);
				el.html(this.generateContent(el.data())).addClass('loaded');
			}, this));
		},
		// Determines the theme of the widget, @param {string} config Configured theme, @return {string} 'light' or 'dark' depending on the wiki theme and configuration
		determineTheme: function(config) {
			// If explicitly configured to light or dark
			if (config === 'dark') {
				return 'dark';
			}
			if (config === 'light') {
				return 'light';
			}
			// If not configured, try to determine based on wiki theme (set by themeToggle):
			return $(':root').hasClass('view-dark') ? 'dark' : 'light';
		},
		// Generate widget content from an object, @return {string} content of the widget
		generateContent: function(config) {
			if (!config.id || !String(config.id).match(/\d{17,19}/)) {
				return "Error: ID of the widget is malformed or not supplied, please see <a href='https://support.wiki.gg/wiki/DiscordWidget' title='the instructions'>the instructions</a> for how to find your server's ID. Please make sure you are not inserting <strong>the DiscordIntegrator template</strong> when asked for <strong>your widget ID</strong>.";
			}
			if (
				(
					config.loggedIn === true ||
					Boolean(config['logged-in']) === true &&
					config['logged-in'] !== 'false' &&
					config['logged-in'] !== '{{{loggedIn}}}'
				) && !mconfig.wgUserName
			) {
				return "Please <a href='/Special:UserLogin' title='log in'>log in</a> to see this widget.";
			}
			var username = config.username === '@disabled' ?
				'' :
				config.username === '@function' &&
				typeof window.DiscordIntegratorGetUsername === 'function' ?
					window.DiscordIntegratorGetUsername() :
					config.username || mconfig.wgUserName;
			return mw.html.element('iframe', {
				src: 'https://discord.com/widget?id=' + config.id +
					'&theme=' + this.determineTheme(config.theme) +
					'&username=' + encodeURIComponent(username),
				width: config.width || '100%',
				height: config.height || '400px',
				style: 'max-width:100%;',
				allowtransparency: 'true',
				frameborder: '0',
				title: "Discord server widget"
			});
		}
	};
	DiscordIntegrator.init();
});

/***************************/

/* CSS classes for daytime periods */
$(function() {
    'use strict';
    var currentTime = new Date().getHours();
	if (0 <= currentTime && currentTime < 6) {
		if (document.body) {document.body.classList.add('night');}
	}
	else if (6 <= currentTime && currentTime < 12) {
		if (document.body) {document.body.classList.add('morning');}
	}
	else if (12 <= currentTime && currentTime < 18) {
		if (document.body) {document.body.classList.add('afternoon');}
	}
	else {
		if (document.body) {document.body.classList.add('evening');}
	}
});

/* Geometry Dash Expanded Wiki footer: source attribution, licensing, and local contact. */
mw.loader.using('mediawiki.util').then(function () {
$(function () {
    var footer = document.querySelector('#footer');
    var information = document.querySelector('#footer-info');
    if (!footer || !information || document.getElementById('footer-info-ewiki-sources')) return;
    function link(text, href) {
        var element = document.createElement('a');
        element.textContent = text;
        element.href = href;
        return element;
    }
    var sources = document.createElement('li');
    sources.id = 'footer-info-ewiki-sources';
    sources.append('Imported material is adapted from the ',
        link('Official Wiki', 'https://geometrydash.wiki.gg/'),
        ' and, where applicable, the ',
        link('Geometry Dash Fandom', 'https://geometry-dash.fandom.com/'),
        ' and ', link('Geometry Dash Fan Fandom', 'https://geometry-dash-fan.fandom.com/'),
        ' wikis. Source and contributor links are recorded in import edit summaries.');
    var license = document.createElement('li');
    license.id = 'footer-info-ewiki-license';
    license.append('Imported wiki text retains its original licensing, including ',
        link('Creative Commons Attribution-ShareAlike 4.0', 'https://creativecommons.org/licenses/by-sa/4.0/'),
        '. Images and separately licensed code may have different terms. ',
        link('Sources and licensing', mw.util.getUrl('Project:Copyrights')), '.');
    var independent = document.createElement('li');
    independent.id = 'footer-info-ewiki-independent';
    independent.textContent = 'Geometry Dash Expanded Wiki is an independent community wiki and is not affiliated with wiki.gg or RobTop Games.';
    information.append(sources, license, independent);
    var places = document.querySelector('#footer-places');
    if (places && !document.getElementById('footer-places-ewiki-contact')) {
        var contact = document.createElement('li');
        contact.id = 'footer-places-ewiki-contact';
        contact.appendChild(link('Contact Geometry Dash Expanded Wiki', 'mailto:admin@geometrydashwiki.com'));
        places.appendChild(contact);
    }
    var footerIcons = document.getElementById('footer-icons');
    if (footerIcons) {
        if (!document.getElementById('footer-ewiki-licenseico')) {
            var licenseBadge = document.createElement('li');
            licenseBadge.id = 'footer-ewiki-licenseico';
            var licenseLink = link('', 'https://creativecommons.org/licenses/by-sa/4.0/');
            licenseLink.className = 'gd-footer-badge';
            licenseLink.title = 'Creative Commons Attribution-ShareAlike 4.0';
            var licenseImage = document.createElement('img');
            licenseImage.src = '/resources/assets/licenses/cc-by-sa.png';
            licenseImage.alt = 'Creative Commons Attribution-ShareAlike';
            licenseImage.width = 132; licenseImage.height = 47;
            licenseLink.appendChild(licenseImage); licenseBadge.appendChild(licenseLink);
            footerIcons.prepend(licenseBadge);
        }
        var poweredLink = footerIcons.querySelector('#footer-poweredbyico a');
        if (poweredLink) {
            poweredLink.className = 'gd-footer-badge';
            var poweredImage = document.createElement('img');
            poweredImage.src = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA4OSAzMSI+Cgk8cGF0aCBmaWxsPSIjZmZmIiBkPSJtNDEuOTE2IDI0LjQxLS4wMS04LjE0NmgtMS4xMjNsLTIuODY1IDUuMzk0LTIuOTE3LTUuMzk0aC0xLjEyNXY4LjE0NmgxLjN2LTUuMzNsMi40MTQgNC4zOTloLjYxMWwyLjQxNS00LjQ3LjAxIDUuMzk1aDEuMjl6bTYuOTE5LTMuMDcyYTMuNyAzLjcgMCAwIDAtLjM2My0xLjY4MkEyLjY4IDIuNjggMCAwIDAgNDYgMTguMTI0YTIuNzYgMi43NiAwIDAgMC0yLjUyNSAxLjU0MyAzLjUgMy41IDAgMCAwLS4zNzIgMS42MzRjLS4wMS41Ny4xMjMgMS4xMy4zODMgMS42NDIuMjQ1LjQ3NS42MjIuODY5IDEuMDg2IDEuMTM1YTMuNDMgMy40MyAwIDAgMCAyLjkzMi4xNTEgMi40IDIuNCAwIDAgMCAuOTU1LS43NTZsLS43MDMtLjg5NmExLjk0IDEuOTQgMCAwIDEtMS41MjQuNjc1IDEuODQgMS44NCAwIDAgMS0xLjIxMy0uNCAxLjcyIDEuNzIgMCAwIDEtLjYwNC0xLjA4OWg0LjM5N3EuMDIxLS4yOC4wMjEtLjQzem0tMi44MzYtMi4wNDlhMS40OCAxLjQ4IDAgMCAxIDEuMDcuNDE5Yy4yOTUuMjk0LjQ3Ny42OC41MTYgMS4wOTRoLTMuMTgyYy4wNDMtLjQxNy4yMzEtLjgwNi41My0xLjFBMS41IDEuNSAwIDAgMSA0NiAxOS4yODltOC4wNjEtMy41MTh2My4xODlhMi4xIDIuMSAwIDAgMC0uNzg3LS42MyAyLjQgMi40IDAgMCAwLTEuMDE4LS4yMDkgMi42OSAyLjY5IDAgMCAwLTIuNDYzIDEuNTEzIDMuOTcgMy45NyAwIDAgMCAwIDMuMzM0IDIuNjggMi42OCAwIDAgMCAyLjQ2MyAxLjUyNGMuMzY0LjAwNC43MjQtLjA3MSAxLjA1Ni0uMjIxYTIuMDYgMi4wNiAwIDAgMCAuODAzLS42NjR2LjgwM2gxLjI2di04LjYzaC0xLjMxOXptLTEuNjQ2IDcuNDc1Yy0uMy4wMDUtLjU5NS0uMDc3LS44NS0uMjM1YTEuNjUgMS42NSAwIDAgMS0uNTk5LS42ODEgMi41IDIuNSAwIDAgMSAwLTIuMDQ5Yy4xMzItLjI3OC4zNC0uNTE0LjU5OC0uNjgxYTEuNjMgMS42MyAwIDAgMSAxLjcgMGMuMjYuMTY3LjQ2Ny40MDMuNTk5LjY4MWEyLjUgMi41IDAgMCAxIDAgMi4wNDkgMS42NiAxLjY2IDAgMCAxLS41OTguNjgxIDEuNTYgMS41NiAwIDAgMS0uODUuMjM1bTQuNDcxIDEuMTYzaDEuMzF2LTYuMjE1aC0xLjMxMXptNC45NjMtNi4yODRhNC4zIDQuMyAwIDAgMC0xLjMxMy4xOTggMy4xIDMuMSAwIDAgMC0xLjA1NS41N2wuNTE1IDEuMDU1YTIuMiAyLjIgMCAwIDEgLjc3Mi0uNDU0Yy4yOTctLjEwOC42MTEtLjE2My45MjgtLjE2M2ExLjQyIDEuNDIgMCAwIDEgMS4wNDUuMzUyIDEuMzUgMS4zNSAwIDAgMSAuMzUyIDEuMDAxdi4wOTNoLTEuNDU0YTIuNiAyLjYgMCAwIDAtMS43NjkuNTA3IDEuNzIgMS43MiAwIDAgMC0uNTYxIDEuMzQ0IDEuNzYgMS43NiAwIDAgMCAuOTg2IDEuNjI0Yy4zNDQuMTY0LjcyMi4yNDQgMS4xMDIuMjM0LjM3LjAxLjczOC0uMDY0IDEuMDc1LS4yMTZhMS41NyAxLjU3IDAgMCAwIC42ODgtLjYyMnYuNzYyaDEuMjR2LTMuNjQ0YTIuNyAyLjcgMCAwIDAtLjY1Ni0xLjk4NCAyLjU1IDIuNTUgMCAwIDAtMS44OTUtLjY1OG0tLjE3OSA1LjMwN2ExLjIgMS4yIDAgMCAxLS43ODYtLjIzNC43Ny43NyAwIDAgMS0uMjg0LS42M3EwLS44MiAxLjEzNC0uODJoMS4zNTJ2LjcxNWExLjMzIDEuMzMgMCAwIDEtLjU0LjcxNiAxLjU3IDEuNTcgMCAwIDEtLjg3Ny4yNXptMTMuNzYtNy4xNy0xLjg3NiA2LjIyNy0xLjg1Ny02LjIyN2gtMS4yNjJsLTEuOSA2LjE5Mi0xLjgyNi02LjE5MmgtMS40MTdsMi40MzUgOC4xNDdoMS40NTdsMS44NDctNi4wMjkgMS44MTYgNi4wMjloMS40NWwyLjQzNS04LjE0N3ptMi4xMzEgOC4xNDdoMS4zMTJ2LTYuMjE1SDc3LjU2em03LjA1NCAwaDEuNTk1TDgzLjY0NyAyMC44bDIuMzQ2LTIuNjA3aC0xLjU3OWwtMi43MiAyLjc5NFYxNS43OGgtMS4zMXY4LjYzMWgxLjMxdi0xLjY0MmwuOTc3LTEuMDI0em0yLjE4MyAwaDEuMzEydi02LjIxNWgtMS4zMTN2Ni4yMTV6bS0yOS4yNTItNy4wMzZhLjgyLjgyIDAgMCAwIC42MDQtLjIzNS44LjggMCAwIDAgLjIzNS0uNTg2LjcuNyAwIDAgMC0uMjQyLS41NDUuODYuODYgMCAwIDAtLjU5OC0uMjE3Ljg0Ljg0IDAgMCAwLS41OTguMjI3Ljc4Ljc4IDAgMCAwLS4xNzguODc0LjguOCAwIDAgMCAuMTc4LjI1OC44NC44NCAwIDAgMCAuNTk4LjIyN3ptMjAuNjc2IDBhLjgyLjgyIDAgMCAwIC42MDQtLjIzNS44LjggMCAwIDAgLjIzNS0uNTg2LjcuNyAwIDAgMC0uMjQyLS41NDUuODYuODYgMCAwIDAtLjU5OC0uMjE3Ljg0Ljg0IDAgMCAwLS41OTguMjI3Ljc4Ljc4IDAgMCAwIDAgMS4xMzIuODQuODQgMCAwIDAgLjU5OC4yMjd6bTkuMjM2IDBhLjgyLjgyIDAgMCAwIC42MDQtLjIzNS44LjggMCAwIDAgLjIzNC0uNTg2LjcuNyAwIDAgMC0uMjQxLS41NDUuODYuODYgMCAwIDAtLjU5OC0uMjE3Ljg0Ljg0IDAgMCAwLS41OTguMjI3Ljc4Ljc4IDAgMCAwIDAgMS4xMzIuODQuODQgMCAwIDAgLjU5OC4yMjd6TTM2LjEzNiA5LjkxNmMuNDE2LjAwNy44My0uMDUzIDEuMjI3LS4xNzdhMi41IDIuNSAwIDAgMCAuODg5LS40OTggMi4xNCAyLjE0IDAgMCAwIC41NDQtLjc2MiAyLjUgMi41IDAgMCAwIC4xODQtLjk3NCAyLjYgMi42IDAgMCAwLS4xNy0uOTY4IDEuOSAxLjkgMCAwIDAtLjUyNS0uNzQ1IDIuNCAyLjQgMCAwIDAtLjg4Ni0uNDc3IDQuMiA0LjIgMCAwIDAtMS4yNTgtLjE3aC0yLjI3OXY3LjU3NGgxLjA4N1Y5LjkxNnptLTEuMTg3LTMuOTE0aDEuMTg4Yy4yNjEtLjAwNS41MjIuMDMuNzczLjEwMy4yMDIuMDU5LjM4OS4xNi41NDkuMjk4LjE0NS4xMjguMjU3LjI4OS4zMjcuNDY5LjA3NS4yMDIuMTEyLjQxNi4xMDguNjMuMDAxLjIxNi0uMDM5LjQyOS0uMTE3LjYzYTEuMyAxLjMgMCAwIDEtLjMzNi40ODdjLS4xNi4xNDItLjM0OC4yNS0uNTUxLjMxNy0uMjQ0LjA4LS41LjEyLS43NTcuMTE3aC0xLjE4NHptNS45OTMgMS40N2MtLjMwOC4xMi0uNTg2LjMxLS44MTMuNTUtLjIzLjI1LS40MDYuNTQ2LS41MTUuODY4YTMuNzQgMy43NCAwIDAgMCAwIDIuMjg4Yy4xMS4zMjMuMjg0LjYxOS41MTUuODcuMjI3LjI0Mi41MDQuNDMuODEzLjU1MWEzLjA1IDMuMDUgMCAwIDAgMi4xMzQgMGMuMzA2LS4xMjIuNTgyLS4zMS44MDctLjU1YTIuNSAyLjUgMCAwIDAgLjUxMi0uODcxIDMuNzQgMy43NCAwIDAgMCAwLTIuMjg4IDIuNSAyLjUgMCAwIDAtLjUxMi0uODY4IDIuMiAyLjIgMCAwIDAtLjgwNy0uNTUgMy4wNSAzLjA1IDAgMCAwLTIuMTM0IDBtLS4wOTUgNC4wMjNhMi40IDIuNCAwIDAgMS0uMzgzLTEuNDU3IDIuNDMgMi40MyAwIDAgMSAuMzgzLTEuNDU2IDEuMzUgMS4zNSAwIDAgMSAxLjE2My0uNTIyIDEuMzMgMS4zMyAwIDAgMSAxLjE1LjUyMmMuMjc3LjQzMy40MS45NDMuMzggMS40NTZhMi40MyAyLjQzIDAgMCAxLS4zOCAxLjQ1NyAxLjM0IDEuMzQgMCAwIDEtMS4xNS41MTcgMS4zNSAxLjM1IDAgMCAxLTEuMTYzLS41MTdtNS45NjUgMS4yMjRoLjc1NWEuMjM1LjIzNSAwIDAgMCAuMjI4LS4xOWwxLjE2NS0zLjUzMXEuMDQxLS4xMjUuMDY4LS4yNTRsLjA1My0uMjU2cS4wMjcuMTI3LjA1OS4yNTNjLjAzMi4xMjYuMDQ1LjE2OC4wNzIuMjUybDEuMTQ2IDMuNTM2YS4yMS4yMSAwIDAgMCAuMi4xOWguNzkybDEuNzMxLTUuMzU2aC0uNzU1YS4zLjMgMCAwIDAtLjI5LjJsLTEuMDAzIDMuMzRhOSA5IDAgMCAwLS4xNjQuNzU2IDEzIDEzIDAgMCAwLS4xOTYtLjc1NEw0OS42IDcuNTQzYS4yNy4yNyAwIDAgMC0uMS0uMTQuMy4zIDAgMCAwLS4xODMtLjA1NWgtLjQzYS4yNzUuMjc1IDAgMCAwLS4yNzUuMTk1bC0xLjA4NyAzLjM2LS4xMTIuMzg2cS0uMDUyLjE4NS0uMS4zN2ExMyAxMyAwIDAgMC0uMTUzLS43NTRsLS45ODYtMy4zNDFhLjMuMyAwIDAgMC0uMTAzLS4xNDIuMzIuMzIgMCAwIDAtLjE5OS0uMDU5aC0uNzl6bTguMjQtNS4yMzVjLS4zLjEzLS41Ny4zMjEtLjc5MS41NjJhMi41IDIuNSAwIDAgMC0uNDk5Ljg0IDMgMyAwIDAgMC0uMTc0IDEuMDQyYy0uMDA4LjQxOS4wNTcuODM2LjE5MiAxLjIzMi4xMTQuMzMzLjI5Ny42NC41MzYuODk4LjIzLjI0LjUxLjQyOS44Mi41NDhhMi44IDIuOCAwIDAgMCAxLjAyNy4xODhxLjI5NCAwIC41ODYtLjA0Ny4yOTctLjA0Ni41NzgtLjE1YTIuNyAyLjcgMCAwIDAgLjUyMy0uMjU4cS4yNDMtLjE1NS40MjctLjM3OGwtLjI4NS0uMzYzYS4yLjIgMCAwIDAtLjE4NC0uMDk1LjQ0LjQ0IDAgMCAwLS4yMjIuMDggNSA1IDAgMCAxLS4zMDguMTc0cS0uMjEuMTA2LS40MzMuMTc1YTIgMiAwIDAgMS0uNTk5LjA3OSAxLjggMS44IDAgMCAxLS42Ny0uMTE4IDEuMyAxLjMgMCAwIDEtLjUxNi0uMzU4IDEuNyAxLjcgMCAwIDEtLjMzNy0uNjA0IDMgMyAwIDAgMS0uMTQtLjg1NWgzLjUzNmEuMi4yIDAgMCAwIC4xODctLjA3OS42NS42NSAwIDAgMCAuMDUtLjMxMiAyLjkgMi45IDAgMCAwLS4xNjgtMS4wMjEgMi4wNCAyLjA0IDAgMCAwLTEuMTgyLTEuMjIgMi41IDIuNSAwIDAgMC0uODk3LS4xNjIgMi42IDIuNiAwIDAgMC0xLjA1Ny4yMDJtMS42MzQuNjM2YTEuMjEgMS4yMSAwIDAgMSAuNjgxLjc1MXEuMDk0LjI4Ni4wOS41ODdoLTIuODQ2YTEuODIgMS44MiAwIDAgMSAuNDctMS4wNTYgMS41OCAxLjU4IDAgMCAxIDEuNjA1LS4yODJtMy43OTQgNC41OTlWOS4zNThxLjA5MS0uMjQzLjIyLS40Ny4xMS0uMTk1LjI3NC0uMzQ5LjE1Mi0uMTQxLjM0Ni0uMjE1Yy4xNDEtLjA1Mi4yOTEtLjA3Ny40NDEtLjA3NHEuMTYxLS4wMDEuMzE5LjAzMS4xMDguMDI3LjIyLjAzMmEuMTYuMTYgMCAwIDAgLjE2OC0uMTQybC4wNy0uNzVhLjguOCAwIDAgMC0uMjczLS4xMTYgMS40IDEuNCAwIDAgMC0uMzMtLjAzOCAxLjM1IDEuMzUgMCAwIDAtLjg4Ni4zMDYgMi40IDIuNCAwIDAgMC0uNjIyLjgzOWwtLjA2NC0uNzgxYS4zNi4zNiAwIDAgMC0uMDgyLS4yMTEuMzMuMzMgMCAwIDAtLjIyNC0uMDZoLS41NzR2NS4zNTloMS4wMDJ6bTMuNzk4LTUuMjM1Yy0uMy4xMy0uNTcuMzIxLS43OTIuNTYyYTIuNSAyLjUgMCAwIDAtLjQ5OC44NCAzIDMgMCAwIDAtLjE3NSAxLjA0MiAzLjYgMy42IDAgMCAwIC4xOTIgMS4yMzJjLjExNC4zMzMuMjk3LjY0LjUzNi44OTguMjMuMjQuNTEuNDI5LjgyMS41NDhhMi44IDIuOCAwIDAgMCAxLjAyNi4xODhxLjI5NCAwIC41ODYtLjA0Ny4yOTYtLjA0Ni41NzgtLjE1YTIuNyAyLjcgMCAwIDAgLjUyMy0uMjU4IDEuOSAxLjkgMCAwIDAgLjQyNy0uMzc4bC0uMjg1LS4zNjNhLjIuMiAwIDAgMC0uMTg0LS4wOTUuNDQuNDQgMCAwIDAtLjIyMS4wOCA1IDUgMCAwIDEtLjMwOS4xNzRxLS4yMS4xMDYtLjQzMi4xNzVhMiAyIDAgMCAxLS42LjA3OSAxLjggMS44IDAgMCAxLS42Ny0uMTE4IDEuMyAxLjMgMCAwIDEtLjUxNS0uMzU4IDEuNyAxLjcgMCAwIDEtLjMzOC0uNjA0IDMgMyAwIDAgMS0uMTQtLjg1NWgzLjUzNmEuMi4yIDAgMCAwIC4xODgtLjA3OWMuMDQtLjEuMDU2LS4yMDguMDQ0LS4zMTVhMi45IDIuOSAwIDAgMC0uMTY5LTEuMDIyIDIuMSAyLjEgMCAwIDAtLjQ2OS0uNzUxIDIgMiAwIDAgMC0uNzEzLS40NyAyLjUgMi41IDAgMCAwLS44OTctLjE2IDIuNiAyLjYgMCAwIDAtMS4wNTMuMjA1em0xLjYzMy42MzZhMS4yIDEuMiAwIDAgMSAuNjgxLjc1MXEuMDk0LjI4Ni4wOS41ODdoLTIuODQ3YTEuODIgMS44MiAwIDAgMSAuNDctMS4wNTYgMS41OCAxLjU4IDAgMCAxIDEuNjA0LS4yODJ6bTcuMjU5IDQuNTk5VjQuOTM2aC0xLjAwM1Y3Ljg4YTEuODMgMS44MyAwIDAgMC0xLjQ0Ni0uNjEyIDIuMSAyLjEgMCAwIDAtLjk2NS4yMTRjLS4yODIuMTQtLjUzLjM0LS43MjguNTg2YTIuNyAyLjcgMCAwIDAtLjQ1OS44ODQgMy43IDMuNyAwIDAgMC0uMTU4IDEuMTA2Yy0uMDA2LjM5Ni4wNDIuNzkuMTQyIDEuMTczLjA4LjMwOS4yMi42LjQxLjg1Ny4xNjYuMjI0LjM4NS40MDQuNjM3LjUyNS4yNi4xMjEuNTQ0LjE4MS44MzIuMTc3cS4yNy4wMDUuNTMyLS4wNi4yNDUtLjA2LjQ3LS4xODEuMjIyLS4xMi40MTUtLjI4NS4xOTgtLjE3LjM2NS0uMzcybC4wOS42MjlhLjI0Ni4yNDYgMCAwIDAgLjI2My4yaC42MDN6bS0yLjk2Ni0uODQyYTEgMSAwIDAgMS0uNDExLS4zNDQgMS43IDEuNyAwIDAgMS0uMjYtLjU5OSAzLjcgMy43IDAgMCAxLS4wODktLjg3NiAyLjQ2IDIuNDYgMCAwIDEgLjM5LTEuNDk5IDEuMyAxLjMgMCAwIDEgMS4xMTUtLjUyIDEuNiAxLjYgMCAwIDEgLjY2NS4xMzZjLjIyMi4xMDcuNDEzLjI2OC41NTQuNDY5djIuNTYyYTIuMiAyLjIgMCAwIDEtLjYyMi41NzggMS41IDEuNSAwIDAgMS0uNzg3LjIwMyAxLjM1IDEuMzUgMCAwIDEtLjU1NS0uMTFtNy43NDcuODQyYS4yMzQuMjM0IDAgMCAwIC4yNTMtLjIxMWwuMDQ4LS40NmMuMTcuMjIzLjM4MS40MS42MjUuNTQ3LjI3My4xNC41NzcuMjA5Ljg4NC4xOThhMi4wNiAyLjA2IDAgMCAwIDEuNjgyLS43OTVjLjIwOS0uMjczLjM2NS0uNTgyLjQ2LS45MTMuMTEtLjM4NC4xNjUtLjc4Mi4xNi0xLjE4MmE0IDQgMCAwIDAtLjE0LTEuMDk1IDIuNCAyLjQgMCAwIDAtLjQwMy0uODIgMS44IDEuOCAwIDAgMC0uNjQxLS41MiAxLjkgMS45IDAgMCAwLS44NDctLjE4MiAyIDIgMCAwIDAtLjk2OC4yMjcgMi43IDIuNyAwIDAgMC0uNzU4LjYxMnYtMy4xOWgtMS4wMDR2Ny43ODR6bTIuNzMtNC4xOTJjLjI2My40Mi4zODUuOTEzLjM0NyAxLjQwNy4wNC41NDktLjA5NyAxLjEtLjM5IDEuNTYyYTEuMzMgMS4zMyAwIDAgMS0xLjEyNS41MTcgMS42IDEuNiAwIDAgMS0uNjU1LS4xMzUgMS40NiAxLjQ2IDAgMCAxLS41NTQtLjQ2OVY4Ljg2MWEyLjMgMi4zIDAgMCAxIC42MTItLjU4N2MuMjM1LS4xMzkuNTA1LS4yMS43NzktLjIwMmExLjE3IDEuMTcgMCAwIDEgLjk4Ny40NTVtNy4wNzQtMS4xNjRoLS43OTZhLjMuMyAwIDAgMC0uMjkuMmwtMS4zNCAzLjI2MnEtLjA0OC4xMTctLjA5LjI0NWwtLjA3OS4yNDVhNCA0IDAgMCAwLS4xNDItLjQ4bC0xLjM4Ny0zLjI3MmEuMy4zIDAgMCAwLS4zMDEtLjJoLS44NzNsMi4yMDUgNS4wMjktLjk4MiAyLjEyNmguNzQ3YS4zNS4zNSAwIDAgMCAuMjI4LS4wNjEuNDQuNDQgMCAwIDAgLjExNy0uMTc3eiIvPgoJPHBhdGggZmlsbD0idXJsKCNwKSIgZD0iTTguMjg0IDYuMTE2QTQuNTUgNC41NSAwIDAgMCA5LjYxIDkuMjRhMy41IDMuNSAwIDAgMCAyLjMxNC45MjMgMS4wNyAxLjA3IDAgMCAwIC43MzYtLjMzIDMuNTEgMy41MSAwIDAgMCAuODIxLTMuMzczYy0uNjIzLTIuMTYtMi4zNS0zLjM1LTQuNDU3LTQuMzg0YTkuNCA5LjQgMCAwIDAtLjc0MSA0LjAzOHoiIG9wYWNpdHk9Ii42NSIvPgoJPHBhdGggZmlsbD0idXJsKCNpKSIgZD0iTTUuMTU1IDkuMjVhNC41IDQuNSAwIDAgMCAyLjQyMiAyLjM3NGMuODA2LjI5MyAxLjY5LjI4IDIuNDg4LS4wMzcuMjU0LS4xMTcuNDUyLS4zMjcuNTU1LS41ODZhMy41MSAzLjUxIDAgMCAwLS41Mi0zLjQzYy0xLjQxLTEuNzUtMy40NS0yLjE5LTUuNzk1LTIuMzM1YTkuNCA5LjQgMCAwIDAgLjg1IDQuMDEzIiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjaCkiIGQ9Ik0zLjQ2NSAxMy4zNDVhNC40OCA0LjQ4IDAgMCAwIDMuMTQzIDEuMjYyIDMuNSAzLjUgMCAwIDAgMi4yODYtLjk5IDEuMSAxLjEgMCAwIDAgLjI4OC0uNzU2QTMuNTIgMy41MiAwIDAgMCA3LjM5IDkuODljLTEuOTYtMS4wOC00LjAyLS43MDUtNi4yNDMuMDdhOS40IDkuNCAwIDAgMCAyLjMxOCAzLjM4NCIgb3BhY2l0eT0iLjY1Ii8+Cgk8cGF0aCBmaWxsPSJ1cmwoI2cpIiBkPSJNMy40NjIgMTcuNzgxYzEuMDkuNDI5IDIuMy40MTQgMy4zODMtLjA0MWEzLjUyIDMuNTIgMCAwIDAgMS43MzQtMS43OTMgMS4xIDEuMSAwIDAgMC0uMDItLjgxIDMuNDkgMy40OSAwIDAgMC0yLjc4Ni0yLjA1NGMtMi4yMzEtLjIzNi0zLjk4MS44OTctNS43NDcgMi40NjJhOS40IDkuNCAwIDAgMCAzLjQzNiAyLjIzNiIgb3BhY2l0eT0iLjY1Ii8+Cgk8cGF0aCBmaWxsPSJ1cmwoI2YpIiBkPSJNNS4xNDggMjEuODc3YTQuNSA0LjUgMCAwIDAgMy4xMS0xLjMzOCAzLjUzIDMuNTMgMCAwIDAgLjkyLTIuMzIzIDEuMSAxLjEgMCAwIDAtLjMyOC0uNzQgMy40OCAzLjQ4IDAgMCAwLTMuMzU3LS44MjhjLTIuMTUuNjMzLTMuMzQgMi4zNi00LjM2NSA0LjQ4NGE5LjMgOS4zIDAgMCAwIDQuMDIuNzQ1IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjZSkiIGQ9Ik04LjI2NyAyNS4wMTlhNC41IDQuNSAwIDAgMCAyLjM2NC0yLjQzOGMuMjkyLS44MS4yOC0xLjctLjAzNi0yLjVhMS4wOCAxLjA4IDAgMCAwLS41ODYtLjU1OCAzLjQ5IDMuNDkgMCAwIDAtMy40MTcuNTI2Yy0xLjc0IDEuNDEtMi4xOCAzLjQ2LTIuMzI1IDUuODIxYTkuMyA5LjMgMCAwIDAgNC0uODUxIiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjZCkiIGQ9Ik0xMi4zNDUgMjYuNzJhNC41MyA0LjUzIDAgMCAwIDEuMjU0LTMuMTU3IDMuNTMgMy41MyAwIDAgMC0uOTg3LTIuMjk2IDEuMDggMS4wOCAwIDAgMC0uNzUyLS4yOSAzLjQ5IDMuNDkgMCAwIDAtMi45NTIgMS44Yy0xLjA3IDEuOTctLjY5NyA0LjA0LjA3IDYuMjdhOS4zIDkuMyAwIDAgMCAzLjM2Ny0yLjMyNyIgb3BhY2l0eT0iLjY1Ii8+Cgk8cGF0aCBmaWxsPSJ1cmwoI2MpIiBkPSJNMTYuNzY0IDI2LjcyNGMuNDI3LTEuMS40MTItMi4zMi0uMDQxLTMuNGEzLjUyIDMuNTIgMCAwIDAtMS43ODUtMS43NDMgMS4wOCAxLjA4IDAgMCAwLS44MDYuMDJjLS41NTQuMjUtMS4wMy42MzktMS4zOTIgMS4xM3MtLjU4NCAxLjA3LS42NTQgMS42N2MtLjIzNCAyLjI0Ljg5NSA0IDIuNDU1IDUuNzY3YTkuMzUgOS4zNSAwIDAgMCAyLjIyMy0zLjQ0NCIgb3BhY2l0eT0iLjY1Ii8+Cgk8cGF0aCBmaWxsPSJ1cmwoI2IpIiBkPSJNMjAuODQgMjUuMDMxYy0uMDIyLTEuMTgtLjUtMi4zLTEuMzMyLTMuMTI1YTMuNSAzLjUgMCAwIDAtMi4zMTQtLjkyNCAxLjA3IDEuMDcgMCAwIDAtLjczNi4zMyAzLjUxIDMuNTEgMCAwIDAtLjgyMSAzLjM3MmMuNjMgMi4xNiAyLjM1IDMuMzUgNC40NjQgNC4zODRhOS40IDkuNCAwIDAgMCAuNzM5LTQuMDM3IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjYSkiIGQ9Ik0yMy45NjYgMjEuODk3YTQuNSA0LjUgMCAwIDAtMi40MjEtMi4zNzUgMy41IDMuNSAwIDAgMC0yLjQ4OS4wMzcgMS4wOCAxLjA4IDAgMCAwLS41NTUuNTg2IDMuNTEgMy41MSAwIDAgMCAuNTI1IDMuNDMyYzEuNDEgMS43NSAzLjQ1IDIuMTkgNS43OTUgMi4zMzVhOS40IDkuNCAwIDAgMC0uODU1LTQuMDE1IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjbykiIGQ9Ik0yNS42NTkgMTcuODAxYTQuNDggNC40OCAwIDAgMC0zLjE0Mi0xLjI2M2MtLjg1Ny4wNC0xLjY3LjM5MS0yLjI4NS45OWExLjEgMS4xIDAgMCAwLS4yODkuNzU2IDMuNTIgMy41MiAwIDAgMCAxLjc5MiAyLjk3YzEuOTYgMS4wOCA0LjAyLjcwNCA2LjI0NC0uMDdhOS40IDkuNCAwIDAgMC0yLjMyLTMuMzgzIiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjbikiIGQ9Ik0yNS42NjMgMTMuMzY1YTQuNDggNC40OCAwIDAgMC0zLjM4Ny4wNDEgMy41MiAzLjUyIDAgMCAwLTEuNzM0IDEuNzkzYy0uMDk4LjI2My0uMDkuNTUzLjAyMS44MWEzLjQ5IDMuNDkgMCAwIDAgMi43ODYgMi4wNTZjMi4yMy4yMzQgMy45OC0uOSA1Ljc0Ni0yLjQ2M2E5LjMgOS4zIDAgMCAwLTMuNDMyLTIuMjM3IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjbSkiIGQ9Ik0yMy45NzcgOS4yNjZhNC41IDQuNSAwIDAgMC0zLjEwOSAxLjMzOCAzLjUzIDMuNTMgMCAwIDAtLjkyIDIuMzI1Yy4wMTEuMjguMTI5LjU0NS4zMy43NGEzLjQ4IDMuNDggMCAwIDAgMy4zNTcuODI4YzIuMTUtLjYzMyAzLjM0LTIuMzYgNC4zNjQtNC40ODVhOS4zIDkuMyAwIDAgMC00LjAyMi0uNzQ2IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjbCkiIGQ9Ik0yMC44NTggNi4xMjdhNC41MiA0LjUyIDAgMCAwLTIuMzY0IDIuNDMyYy0uMjkyLjgxLS4yNzkgMS43LjAzNiAyLjUuMTE2LjI1Ni4zMjYuNDU2LjU4Ny41NTlhMy40OSAzLjQ5IDAgMCAwIDMuNDE3LS41MjdjMS43NC0xLjQxIDIuMTgtMy40NiAyLjMyNC01LjgyYTkuMyA5LjMgMCAwIDAtNCAuODU2IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjaykiIGQ9Ik0xNi43OCA0LjQyNmE0LjU1IDQuNTUgMCAwIDAtMS4yNTcgMy4xNTdjLjAzOC44Ni4zODggMS42OC45ODUgMi4yOTYuMjA0LjE5LjQ3NC4yOTUuNzUzLjI5YTMuNDkgMy40OSAwIDAgMCAyLjk1Ny0xLjhjMS4wNy0xLjk3LjY5Ni00LjA0LS4wNy02LjI3MmE5LjMgOS4zIDAgMCAwLTMuMzY4IDIuMzI5IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjaikiIGQ9Ik0xMi4zNjQgNC40MjJhNC41NSA0LjU1IDAgMCAwIC4wNDEgMy40MDEgMy41IDMuNSAwIDAgMCAxLjc4NSAxLjc0MWMuMjYuMDk4LjU1LjA5LjgwNS0uMDJhMy41NCAzLjU0IDAgMCAwIDEuMzkzLTEuMTNjLjM2LS40OS41ODQtMS4wNy42NTQtMS42Ny4yMzUtMi4yNC0uODk1LTQtMi40NTUtNS43NjdhOS4zNSA5LjM1IDAgMCAwLTIuMjIzIDMuNDQ1IiBvcGFjaXR5PSIuNjUiLz4KCTxkZWZzPgoJCTxsaW5lYXJHcmFkaWVudCBpZD0icCIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIiIHkyPSIxLjAwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwQTAwQjIiLz4KCQkJPHN0b3Agb2Zmc2V0PSIuNSIgc3RvcC1jb2xvcj0icmVkIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGRkMwMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iLTIuMzUiIHgyPSIyOS4zMTIiIHkxPSIzMC4zMjEiIHkyPSIxLjAwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwQTAwQjIiLz4KCQkJPHN0b3Agb2Zmc2V0PSIuNSIgc3RvcC1jb2xvcj0icmVkIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGRkMwMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iLTIuMzUiIHgyPSIyOS4zMTIiIHkxPSIzMC4zMiIgeTI9IjEuMDA0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzBBMDBCMiIvPgoJCQk8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSJyZWQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZGQzAwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItMi4zNSIgeDI9IjI5LjMxMiIgeTE9IjMwLjMyIiB5Mj0iMS4wMDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMEEwMEIyIi8+CgkJCTxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9InJlZCIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZDMDAiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIiIHkyPSIxLjAwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwQTAwQjIiLz4KCQkJPHN0b3Agb2Zmc2V0PSIuNSIgc3RvcC1jb2xvcj0icmVkIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGRkMwMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iLTIuMzUiIHgyPSIyOS4zMTIiIHkxPSIzMC4zMiIgeTI9IjEuMDA0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzBBMDBCMiIvPgoJCQk8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSJyZWQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZGQzAwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSItMi4zNSIgeDI9IjI5LjMxMiIgeTE9IjMwLjMyIiB5Mj0iMS4wMDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMEEwMEIyIi8+CgkJCTxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9InJlZCIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZDMDAiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIxIiB5Mj0iMS4wMDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMEEwMEIyIi8+CgkJCTxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9InJlZCIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZDMDAiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIiIHkyPSIxLjAwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwQTAwQjIiLz4KCQkJPHN0b3Agb2Zmc2V0PSIuNSIgc3RvcC1jb2xvcj0icmVkIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGRkMwMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iLTIuMzUiIHgyPSIyOS4zMTIiIHkxPSIzMC4zMiIgeTI9IjEuMDA0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzBBMDBCMiIvPgoJCQk8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSJyZWQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZGQzAwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9Im8iIHgxPSItMi4zNSIgeDI9IjI5LjMxMiIgeTE9IjMwLjMyIiB5Mj0iMS4wMDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMEEwMEIyIi8+CgkJCTxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9InJlZCIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZDMDAiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0ibiIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIiIHkyPSIxLjAwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwQTAwQjIiLz4KCQkJPHN0b3Agb2Zmc2V0PSIuNSIgc3RvcC1jb2xvcj0icmVkIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGRkMwMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJtIiB4MT0iLTIuMzUiIHgyPSIyOS4zMTIiIHkxPSIzMC4zMiIgeTI9IjEuMDA0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzBBMDBCMiIvPgoJCQk8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSJyZWQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZGQzAwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSItMi4zNSIgeDI9IjI5LjMxMiIgeTE9IjMwLjMyIiB5Mj0iMS4wMDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMEEwMEIyIi8+CgkJCTxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9InJlZCIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZDMDAiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIxIiB5Mj0iMS4wMDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMEEwMEIyIi8+CgkJCTxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9InJlZCIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZDMDAiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIiIHkyPSIxLjAwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwQTAwQjIiLz4KCQkJPHN0b3Agb2Zmc2V0PSIuNSIgc3RvcC1jb2xvcj0icmVkIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGRkMwMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+Cgk8L2RlZnM+Cjwvc3ZnPgo=";
            poweredImage.alt = 'Powered by MediaWiki';
            poweredImage.width = 132; poweredImage.height = 46;
            poweredLink.replaceChildren(poweredImage);
        }
    }
});

});

/* Staff content classification: persisted as dedicated hidden categories. */
(function () {
    'use strict';
    if (mw.config.get('wgNamespaceNumber') !== 0 || mw.config.get('wgAction') !== 'view') { return; }
    var heading = document.getElementById('firstHeading');
    if (!heading || document.getElementById('gd-content-status')) { return; }
    var states = [
        {key: 'pending', label: 'community content (undeveloped/unreviewed)', category: 'Wiki content status - pending review'},
        {key: 'reviewed', label: 'community content', category: 'Wiki content status - reviewed community'},
        {key: 'base', label: 'base content', category: 'Wiki content status - base'}
    ];
    var categories = mw.config.get('wgCategories') || [];
    var selected = states.filter(function (state) { return categories.indexOf(state.category) !== -1; })[0];
    if (!selected) {
        selected = categories.some(function (name) { return /\(base content\)$/i.test(name); }) ? states[2] : states[0];
    }
    var staff = (mw.config.get('wgUserGroups') || []).some(function (group) {
        return ['sysop', 'bureaucrat'].indexOf(group) !== -1;
    });
    var badge = document.createElement(staff ? 'button' : 'span');
    badge.id = 'gd-content-status';
    badge.className = 'gd-content-status';
    badge.textContent = selected.label;
    badge.dataset.status = selected.key;
    if (staff) {
        badge.type = 'button';
        badge.setAttribute('aria-haspopup', 'dialog');
        badge.setAttribute('aria-expanded', 'false');
        badge.title = 'Change content classification';
    }
    heading.appendChild(badge);
    document.documentElement.classList.add('gd-content-status-ready');
    // Non-staff badges have no click handler or interactive controls.
    if (!staff) { return; }
    var panel;
    badge.addEventListener('click', function () {
        if (panel) { close(); return; }
        panel = document.createElement('div');
        panel.className = 'gd-content-status-menu';
        panel.setAttribute('role', 'dialog');
        panel.setAttribute('aria-label', 'Content classification');
        var title = document.createElement('strong');
        title.textContent = 'Content classification';
        panel.appendChild(title);
        states.forEach(function (state) {
            var button = document.createElement('button');
            button.type = 'button';
            button.textContent = state.label;
            button.disabled = state.key === selected.key;
            button.addEventListener('click', function () { save(state); });
            panel.appendChild(button);
        });
        var cancel = document.createElement('button');
        cancel.type = 'button'; cancel.textContent = 'Cancel';
        cancel.addEventListener('click', close); panel.appendChild(cancel);
        document.body.appendChild(panel);
        var rect = badge.getBoundingClientRect();
        panel.style.left = Math.max(8, Math.min(rect.left, window.innerWidth - panel.offsetWidth - 8)) + 'px';
        panel.style.top = Math.max(8, Math.min(rect.bottom + 8, window.innerHeight - panel.offsetHeight - 8)) + 'px';
        badge.setAttribute('aria-expanded', 'true');
        panel.addEventListener('keydown', function (event) { if (event.key === 'Escape') { close(); } });
        cancel.focus();
    });
    function close() {
        if (panel) { panel.remove(); panel = null; }
        badge.setAttribute('aria-expanded', 'false'); badge.focus();
    }
    function applyBadge(state) {
        selected = state; badge.textContent = state.label; badge.dataset.status = state.key;
    }
    function replaceStatusCategory(text, state) {
        return text.replace(/\[\[\s*Category\s*:\s*Wiki[ _]content[ _]status[ _]-[ _](?:pending[ _]review|reviewed[ _]community|base)\s*(?:\|[^\]]*)?\]\]/gi, '').replace(/\s+$/, '') + '\n[[Category:' + state.category + ']]\n';
    }
    var publishedState = selected;
    mw.hook('ve.activationComplete').add(function () { publishedState = selected; });
    mw.hook('ve.deactivationComplete').add(function () {
        applyBadge(publishedState); close();
    });
    function save(state) {
        var editorActive = document.documentElement.classList.contains('ve-active');
        var target = window.ve && ve.init && ve.init.target;
        var surface = editorActive && target && target.getSurface && target.getSurface();
        var textbox = document.getElementById('wpTextbox1');
        if (editorActive || textbox) {
            try {
                if (surface && surface.getMode() === 'visual') {
                    var model = surface.getModel();
                    var fragment = model.getFragment();
                    var items = model.getDocument().getMetaList().getItemsInGroup('mwCategory').slice();
                    items.forEach(function (item) {
                        var category = item.getAttribute('category').replace(/_/g, ' ').replace(/^Category:/i, '');
                        if (states.some(function (entry) { return entry.category === category; })) {
                            fragment.removeMeta(item);
                        }
                    });
                    fragment.insertMeta({type: 'mwCategory', attributes: {category: 'Category:' + state.category, sortkey: ''}});
                } else if (surface && surface.getMode() === 'source') {
                    var sourceModel = surface.getModel();
                    var text = sourceModel.getDocument().data.getText(true);
                    sourceModel.getFragment().selectAll().insertContent(replaceStatusCategory(text, state));
                } else if (textbox) {
                    textbox.value = replaceStatusCategory(textbox.value, state);
                    textbox.dispatchEvent(new Event('input', {bubbles: true}));
                    textbox.dispatchEvent(new Event('change', {bubbles: true}));
                } else {
                    throw new Error('Editor is not ready');
                }
                applyBadge(state); close();
                mw.notify('Classification changed in this draft. Save changes to publish it.');
            } catch (error) {
                mw.notify('Could not change classification in this draft. No changes were published.', {type: 'error'});
            }
            return;
        }
        var currentPanel = panel;
        Array.prototype.forEach.call(currentPanel.querySelectorAll('button'), function (button) { button.disabled = true; });
        var status = document.createElement('p'); status.setAttribute('role', 'status');
        status.textContent = 'Saving...'; currentPanel.appendChild(status);
        mw.loader.using('mediawiki.api').then(function () {
            var api = new mw.Api();
            return api.get({action: 'query', prop: 'revisions', rvprop: 'ids|timestamp|content', rvslots: 'main',
                titles: mw.config.get('wgPageName'), curtimestamp: 1, formatversion: 2}).then(function (data) {
                var page = data.query.pages[0];
                if (page.missing || !page.revisions) { throw new Error('Page could not be read.'); }
                var revision = page.revisions[0];
                var text = revision.slots.main.content;
                text = text.replace(/\[\[\s*Category\s*:\s*Wiki[ _]content[ _]status[ _]-[ _](?:pending[ _]review|reviewed[ _]community|base)\s*(?:\|[^\]]*)?\]\]/gi, '');
                text = text.replace(/\s+$/, '') + '\n[[Category:' + state.category + ']]\n';
                return api.postWithEditToken({action: 'edit', title: page.title, text: text,
                    baserevid: revision.revid, basetimestamp: revision.timestamp, starttimestamp: data.curtimestamp,
                    nocreate: 1, assertuser: mw.config.get('wgUserName'), watchlist: 'nochange',
                    summary: 'Set content classification: ' + state.label}).then(function () {
                        selected = state; badge.textContent = state.label; badge.dataset.status = state.key;
                        close(); mw.notify('Content classification saved.');
                    });
            });
        }).catch(function () {
            if (panel !== currentPanel) { return; }
            status.textContent = 'Could not save. Reload the page and try again.';
            Array.prototype.forEach.call(currentPanel.querySelectorAll('button'), function (button) {
                button.disabled = button.textContent === selected.label;
            });
        });
    }
}());

/* Expanded Wiki Wraith browser-tab icon. */
(function () {
    document.querySelectorAll('link[rel="icon"], link[rel="shortcut icon"]').forEach(function (link) { link.remove(); });
    var icon = document.createElement('link');
    icon.rel = 'icon';
    icon.type = 'image/x-icon';
    icon.href = "https://geometrydashwiki.com/images/7/74/ExpandedWiki.ico";
    document.head.appendChild(icon);
}());
/* Keep Togglebox click targets attached to their wrapped headings. */
mw.hook('wikipage.content').add(function ($content) {
    mw.loader.using('jquery.makeCollapsible').then(function () {
        $content.find('.tabber.mw-collapsible').each(function () {
            var $box = $(this);
            $box.makeCollapsible();
            var $heading = $box.children('.mw-heading').first();
            var $toggle = $box.children('.mw-collapsible-toggle').first();
            if ($heading.length && $toggle.length) { $heading.append($toggle); }
        });
    });
});

/* Multiple-file uploads on Special:Upload. */
(function () {
    'use strict';
    if (mw.config.get('wgCanonicalSpecialPageName') !== 'Upload') { return; }
    mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () {
        $(function () {
            var source = document.getElementById('wpUploadFile');
            var form = source && source.closest('form');
            if (!form || document.getElementById('expanded-multiple-upload')) { return; }
            if (new URLSearchParams(location.search).has('wpForReUpload')) { return; }
            var sourceRow = source.closest('tr') || source.parentElement;
            var toggle = document.createElement(sourceRow.tagName === 'TR' ? 'tr' : 'div');
            toggle.id = 'expanded-multiple-upload';
            var label = document.createElement(sourceRow.tagName === 'TR' ? 'td' : 'span');
            label.textContent = 'Upload multiple files: ';
            var controls = document.createElement(sourceRow.tagName === 'TR' ? 'td' : 'span');
            toggle.append(label, controls);
            ['Yes', 'No'].forEach(function (name) {
                var item = document.createElement('label');
                var radio = document.createElement('input');
                radio.type = 'radio'; radio.name = 'expandedMultiple'; radio.value = name;
                radio.checked = name === 'No';
                item.append(radio, document.createTextNode(' ' + name + ' '));
                controls.appendChild(item);
            });
            sourceRow.before(toggle);
            var multi = document.createElement('input');
            multi.type = 'file'; multi.multiple = true; multi.hidden = true;
            multi.setAttribute('aria-label', 'Source filenames');
            source.after(multi);
            var destination = document.getElementById('wpDestFile');
            var destinationRow = destination && (destination.closest('tr') || destination.parentElement);
            var nativeSubmit = form.querySelector('[name="wpUpload"]');
            if (!nativeSubmit) { toggle.remove(); multi.remove(); return; }
            var button = nativeSubmit.cloneNode(true);
            button.id = 'expanded-upload-files'; button.removeAttribute('name');
            if (button.tagName === 'INPUT') { button.value = 'Upload files'; }
            else { button.textContent = 'Upload files'; }
            function setVisible(element, visible) {
                element.hidden = !visible;
                element.style.setProperty('display', visible ? '' : 'none', 'important');
            }
            setVisible(button, false);
            nativeSubmit.after(button);
            var results = document.createElement('div');
            results.setAttribute('aria-live', 'polite'); form.after(results);
            var busy = false;
            controls.addEventListener('change', function () {
                var enabled = controls.querySelector('input:checked').value === 'Yes';
                setVisible(source, !enabled); setVisible(multi, enabled);
                if (destinationRow) { setVisible(destinationRow, !enabled); }
                setVisible(nativeSubmit, !enabled); setVisible(button, enabled);
            });
            form.addEventListener('submit', function (event) {
                if (controls.querySelector('input:checked').value === 'Yes') {
                    event.preventDefault(); button.click();
                }
            });
            window.addEventListener('beforeunload', function (event) {
                if (busy) { event.preventDefault(); event.returnValue = ''; }
            });
            button.addEventListener('click', async function (event) {
                event.preventDefault();
                if (busy) { return; }
                var files = Array.from(multi.files);
                if (!files.length) { mw.notify('Choose at least one file.', {type: 'error'}); return; }
                var license = document.getElementById('wpLicense');
                var option = license && license.options[license.selectedIndex];
                if (!option || !option.value || option.value === '-') {
                    mw.notify('Choose a license before uploading.', {type: 'error'}); return;
                }
                var licenseText = option.title;
                if (!licenseText || licenseText.indexOf('{{') < 0) {
                    if (!/^[\w :.-]+$/.test(option.value)) {
                        mw.notify('Could not read the selected license.', {type: 'error'}); return;
                    }
                    licenseText = '{{' + option.value + '}}';
                }
                var description = document.getElementById('wpUploadDescription');
                var text = (description ? description.value : '') + '\n\n== Licensing ==\n' + licenseText;
                var watch = document.getElementById('wpWatchthis');
                var ignore = document.getElementById('wpIgnoreWarning');
                var params = {text: text, watchlist: watch && watch.checked ? 'watch' : 'nochange',
                    assertuser: mw.config.get('wgUserName')};
                if (ignore && ignore.checked) { params.ignorewarnings = 1; }
                busy = true; button.disabled = true;
                var inputs = Array.from(form.querySelectorAll('input, select, textarea, button'));
                var disabled = inputs.map(function (el) { return el.disabled; });
                inputs.forEach(function (el) { el.disabled = true; });
                results.replaceChildren();
                var status = document.createElement('p'); results.appendChild(status);
                var list = document.createElement('ul'); results.appendChild(list);
                var ready = 0, failed = 0;
                var api = new mw.Api();
                try {
                    for (var i = 0; i < files.length; i++) {
                        var file = files[i];
                        status.textContent = 'Uploading ' + (i + 1) + '/' + files.length + ': ' + file.name;
                        var row = document.createElement('li');
                        row.textContent = file.name + ': uploading…'; list.appendChild(row);
                        try {
                            var data = await new Promise(function (resolve, reject) {
                                api.upload(file, Object.assign({}, params, {filename: file.name}))
                                    .done(resolve).fail(function (code, details) {
                                        reject({code: code, details: details});
                                    });
                            });
                            var upload = data.upload;
                            if (!upload || upload.result !== 'Success') {
                                throw {code: 'upload-warning', details: data};
                            }
                            row.replaceChildren(document.createTextNode('Uploaded: '));
                            var link = document.createElement('a');
                            link.href = mw.util.getUrl('File:' + upload.filename);
                            link.textContent = upload.filename; row.appendChild(link); ready++;
                        } catch (error) {
                            failed++;
                            var details = error.details || {};
                            var warnings = details.upload && details.upload.warnings;
                            var message = details.error && details.error.info;
                            row.textContent = file.name + ': Failed — ' +
                                (warnings ? JSON.stringify(warnings) : message || error.code || 'Upload failed.');
                        }
                    }
                    status.textContent = 'Upload complete: ' + ready + ' uploaded, ' + failed + ' failed.';
                } finally {
                    inputs.forEach(function (el, index) { el.disabled = disabled[index]; });
                    busy = false; button.disabled = false;
                }
            });
        });
    });
}());
/* Use native browser audio controls in infoboxes. */
(function () {
    function nativeInfoboxAudio() {
        document.querySelectorAll('.portable-infobox td[data-source="audio"], .portable-infobox td[data-source="fullaudio"], .expanded-ve-infobox div[data-source="audio"] > .pi-data-value, .expanded-ve-infobox div[data-source="fullaudio"] > .pi-data-value').forEach(function (cell) {
            if (cell.querySelector('audio.expanded-native-audio')) { return; }
            var original = cell.querySelector('audio');
            if (!original) { return; }
            var sources = Array.prototype.slice.call(original.querySelectorAll('source'));
            if (!original.getAttribute('src') && !sources.length) { return; }
            var audio = document.createElement('audio');
            audio.className = 'expanded-native-audio';
            audio.controls = true;
            audio.preload = 'metadata';
            audio.setAttribute('aria-label', (cell.getAttribute('data-source') || cell.parentElement.getAttribute('data-source')) === 'fullaudio' ? 'Full audio' : 'Audio');
            if (original.getAttribute('src')) { audio.src = original.getAttribute('src'); }
            sources.forEach(function (source) {
                var copy = document.createElement('source');
                copy.src = source.getAttribute('src');
                if (source.getAttribute('type')) { copy.type = source.getAttribute('type'); }
                audio.appendChild(copy);
            });
            original.pause();
            cell.replaceChildren(audio);
        });
    }
    mw.hook('wikipage.content').add(nativeInfoboxAudio);
    $(function () {
        nativeInfoboxAudio();
        var content = document.getElementById('mw-content-text');
        if (content) {
            new MutationObserver(nativeInfoboxAudio).observe(content, { childList: true, subtree: true });
        }
    });
}());
if (mw.config.get('wgPageName') === 'Main_Page' && mw.config.get('wgAction') === 'view') {
  var mainPageHeading = document.getElementById('firstHeading');
  if (mainPageHeading) { mainPageHeading.style.setProperty('display', 'none', 'important'); }
}

/* Header shortcut to the built-in draft recovery page, and accurate article totals. */
$(function () {
    var item = mw.util.addPortletLink('p-personal', mw.util.getUrl('Special:EditRecovery'),
        '\u2692', 'pt-expanded-edit-recovery', 'Edit recovery: restore unsaved source edits');
    if (item) {
        item.hidden = true;
        item.style.setProperty('display', 'none', 'important');
        item.parentNode.insertBefore(item, item.parentNode.firstChild);
        item.querySelector('a').setAttribute('aria-label', 'Edit recovery');
        function placeRecovery() {
            var controls = document.querySelector('#p-personal .gd-header-controls');
            if (controls && item.parentNode !== controls) { controls.insertBefore(item, controls.firstChild); }
        }
        var headerObserver = new MutationObserver(placeRecovery);
        headerObserver.observe(document.querySelector('#p-personal'), {childList: true, subtree: true});
        placeRecovery();
        if (window.indexedDB && indexedDB.databases) {
            indexedDB.databases().then(function (databases) {
                var name = mw.config.get('wgDBname') + '_editRecovery';
                if (!databases.some(function (db) { return db.name === name; })) { return; }
                var request = indexedDB.open(name);
                request.onsuccess = function () {
                    var db = request.result;
                    if (!db.objectStoreNames.contains('unsaved-page-data')) { db.close(); return; }
                    var read = db.transaction('unsaved-page-data', 'readonly').objectStore('unsaved-page-data').getAll();
                    read.onsuccess = function () {
                        var count = read.result.filter(function (draft) { return draft.expiry > Date.now() / 1000; }).length;
                        if (count) {
                            item.hidden = false;
                            item.style.removeProperty('display');
                            item.classList.add('expanded-recovery-pending');
                            item.querySelector('a').textContent = '\u26a0 \u2692';
                            item.querySelector('a').title = count + ' unsaved edit(s) available for recovery';
                        }
                        db.close();
                    };
                    read.onerror = function () { db.close(); };
                };
            }).catch(function () {});
        }
    }
    var counter = document.querySelector('.expanded-article-count a');
    if (!counter) { return; }
    mw.loader.using('mediawiki.api').then(function () {
        var api = new mw.Api(), count = 0;
        function next(continuation) {
            return api.get(Object.assign({action: 'query', list: 'allpages', apnamespace: 0,
                apfilterredir: 'nonredirects', aplimit: 'max', formatversion: 2}, continuation || {}))
                .then(function (data) {
                    count += data.query.allpages.length;
                    if (data.continue) { return next(data.continue); }
                    counter.textContent = count.toLocaleString();
                    counter.title = 'Non-redirect article pages in the main namespace';
                });
        }
        next().catch(function () {});
    });
});

/* Public account information on user pages; labels support English, Spanish and Russian. */
$(function () {
    if (mw.config.get('wgNamespaceNumber') !== 2 || mw.config.get('wgTitle').indexOf('/') !== -1) { return; }
    var target = document.querySelector('#mw-content-text');
    if (!target || document.querySelector('.expanded-user-info')) { return; }
    var language = (mw.config.get('wgUserLanguage') || 'en').split('-')[0];
    var labels = {
        en: ['Member of groups', 'Number of edits', 'Registration time'],
        es: ['Miembro de los grupos', 'Número de ediciones', 'Fecha de registro'],
        ru: ['Группы участника', 'Количество правок', 'Дата регистрации']
    };
    var text = labels[language] || labels.en;
    mw.loader.using('mediawiki.api').then(function () {
        var api = new mw.Api();
        return api.get({action: 'query', list: 'users', ususers: mw.config.get('wgTitle'),
            usprop: 'groups|implicitgroups|registration|editcount', formatversion: 2}).then(function (data) {
            var user = data.query.users[0];
            if (user.missing || user.invalid || !user.userid) { return; }
            var groups = [...new Set((user.groups || []).concat(user.implicitgroups || []))].filter(function (g) { return g !== '*'; });
            return api.get({action: 'query', meta: 'allmessages', ammessages: groups.map(function (g) {return 'group-' + g;}).join('|'),
                amlang: mw.config.get('wgUserLanguage') || 'en', formatversion: 2}).then(function (messages) {
                var groupMessages = {}; messages.query.allmessages.forEach(function (m) { groupMessages[m.name] = m; });
                var names = groups.map(function (g) { var message = groupMessages['group-' + g]; return message && !message.missing ? message.content : g; });
                var card = document.createElement('div'); card.className = 'expanded-user-info';
                function line(label, value) {
                    var row = document.createElement('p'), heading = document.createElement('strong');
                    heading.textContent = label + ': '; row.appendChild(heading); row.appendChild(document.createTextNode(value)); card.appendChild(row);
                }
                var groupText = typeof Intl.ListFormat === 'function' ? new Intl.ListFormat(language, {type: 'conjunction'}).format(names) : names.join(', ');
                line(text[0], groupText);
                var row = document.createElement('p'), heading = document.createElement('strong'), link = document.createElement('a');
                heading.textContent = text[1] + ': '; link.href = mw.util.getUrl('Special:Contributions/' + user.name);
                link.textContent = Number(user.editcount || 0).toLocaleString(language); row.appendChild(heading); row.appendChild(link); card.appendChild(row);
                if (user.registration) {
                    line(text[2], new Intl.DateTimeFormat(language, {year:'numeric', month:'short', day:'numeric', hour:'numeric', minute:'2-digit',timeZone:'UTC',timeZoneName:'short'}).format(new Date(user.registration)));
                }
                target.insertBefore(card, target.firstChild);
            });
        });
    }).catch(function () {});
});
/* Load template UI colours with the editor script while site.styles refreshes. */
(function () {
    if (document.getElementById("gd-ve-template-theme")) return;
    var style = document.createElement("style");
    style.id = "gd-ve-template-theme";
    style.textContent = "\n/* VisualEditor template contexts, insertion, editing and parameter help. */\nhtml.ve-active .oo-ui-popupWidget:has(.ve-ui-mwTransclusionContextItem) .oo-ui-popupWidget-popup {\n background:#98562f; color:#fff; border:3px solid #fff; border-radius:12px;\n box-shadow:inset 0 0 0 2px #171717,0 0 0 2px #171717,0 4px 12px #0006;\n}\nhtml.ve-active .oo-ui-popupWidget:has(.ve-ui-mwTransclusionContextItem) .oo-ui-popupWidget-body,\nhtml.ve-active .ve-ui-mwTransclusionContextItem { background:#98562f; color:#fff; border-radius:9px; }\nhtml.ve-active .ve-ui-mwTransclusionContextItem .ve-ui-linearContextItem-head { background:#b17d60; color:#fff; padding:10px 12px; border-radius:9px 9px 0 0; }\nhtml.ve-active .ve-ui-mwTransclusionContextItem .ve-ui-linearContextItem-body { padding:10px 12px; color:#fff; }\nhtml.ve-active .ve-ui-mwTransclusionContextItem a { color:#23eeee; }\nhtml.ve-active .ve-ui-mwTransclusionContextItem .oo-ui-labelElement-label { color:#fff; }\nhtml.ve-active .ve-ui-mwTransclusionContextItem .oo-ui-iconElement-icon { background-color:#fff; }\nhtml.ve-active .oo-ui-popupWidget:has(.ve-ui-mwTransclusionContextItem) .oo-ui-popupWidget-anchor:before { border-bottom-color:#fff; border-top-color:#fff; }\nhtml.ve-active .oo-ui-popupWidget:has(.ve-ui-mwTransclusionContextItem) .oo-ui-popupWidget-anchor:after { border-bottom-color:#b17d60; border-top-color:#98562f; }\nhtml.ve-active .oo-ui-window:has(> .oo-ui-window-frame > .ve-ui-mwTemplateDialog) > .oo-ui-window-frame {\n border:3px solid #fff; border-radius:14px; overflow:hidden; box-sizing:border-box;\n box-shadow:0 0 0 3px #171717,0 10px 35px #0008;\n}\nhtml.ve-active .ve-ui-mwTemplateDialog,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-window-body,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-window-foot,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-panelLayout,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-bookletLayout-stackLayout,\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTwoPaneTransclusionDialogLayout-stackLayout {\n background:#98562f; color:#fff; font-family:\"Nunito\",Arial,sans-serif;\n}\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-window-head,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-processDialog-navigation { background:#b17d60; color:#fff; border-color:#c99972; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-processDialog-title { color:#fff; font-family:Pusab,\"Nunito\",Arial,sans-serif; text-shadow:1px 1px #111,-1px -1px #111; }\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTwoPaneTransclusionDialogLayout-outlinePanel,\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTwoPaneTransclusionDialogLayout-sidebar-container,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-menuLayout-menu { background:#7c4327; color:#fff; border-color:#c99972; }\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTransclusionOutlineTemplateWidget,\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTransclusionOutlineParameterWidget { background:transparent; color:#fff; border-color:#b77f58; }\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTransclusionOutlineParameterWidget:hover { background:#98562f; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-optionWidget-selected { background-color:#a56b47; color:#fff; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-labelElement-label,\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwParameterPage-label,\nhtml.ve-active .ve-ui-mwTemplateDialog h2,\nhtml.ve-active .ve-ui-mwTemplateDialog h3 { color:#fff; }\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwParameterPage-undocumentedLabel,\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTemplatePage-description { color:#ffe38b; }\nhtml.ve-active .ve-ui-mwTemplateDialog a { color:#20eeee; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-inputWidget-input { background:#713d24 !important; color:#fff !important; border:1px solid #c99972 !important; border-radius:6px; box-shadow:none; font-family:\"Nunito\",Arial,sans-serif; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-inputWidget-input::placeholder { color:#dfc6b8 !important; opacity:1; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-inputWidget-input:focus { border-color:#ffcc00 !important; outline:2px solid #ffcc00; outline-offset:1px; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-iconElement-icon,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-indicatorElement-indicator { background-color:#fff; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-checkboxInputWidget input + span { border-color:#fff; background:#713d24; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-checkboxInputWidget input:checked + span { background:#86c914; border-color:#a6e334; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button,\nhtml.ve-active .ve-ui-mwTransclusionContextItem .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {\n background:#12d9df !important; color:#fff !important; border:2px solid #fff !important; border-radius:8px;\n box-shadow:inset 0 0 0 1px #171717,0 0 0 1px #171717; padding:.35rem .8rem;\n}\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-buttonElement-framed .oo-ui-labelElement-label,\nhtml.ve-active .ve-ui-mwTransclusionContextItem .oo-ui-buttonElement-framed .oo-ui-labelElement-label { color:#fff; font-family:Pusab,\"Nunito\",Arial,sans-serif; text-shadow:1px 1px #111,-1px -1px #111; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button { background:#93dc17 !important; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-processDialog-actions-safe .oo-ui-buttonElement-button { background:#12d9df !important; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-widget-disabled > .oo-ui-buttonElement-button { background:#947560 !important; opacity:.65; cursor:default; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-buttonElement-button:focus-visible,\nhtml.ve-active .ve-ui-mwTransclusionContextItem .oo-ui-buttonElement-button:focus-visible { outline:3px solid #ffcc00; outline-offset:3px; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-messageWidget { background:#7c4327; border-color:#c99972; color:#fff; }\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwFloatingHelpElement .oo-ui-popupWidget-popup,\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwFloatingHelpElement .oo-ui-popupWidget-body { background:#98562f; color:#fff; border-color:#c99972; }\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwFloatingHelpElement > .oo-ui-buttonElement > .oo-ui-buttonElement-button { background:#12d9df; color:#fff; border-color:#fff; }\n";
    document.head.appendChild(style);
}());
/* Captioned profile gallery tabs */
(function () {
    'use strict';
    var style = document.createElement('style');
    style.id = 'expanded-profile-gallery-style';
    style.textContent = "#bodyContent .portable-infobox .expanded-profile-gallery {width:100%;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs {display:flex;margin:1rem;border-radius:2rem;overflow:hidden;background:#ca946c;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs button {flex:1;min-width:0;padding:.5rem .7rem;border:0;background:transparent;color:white;font:inherit;font-weight:bold;cursor:pointer;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs button[aria-selected=\"true\"] {background:#d3a582;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs button:focus-visible {outline:2px solid white;outline-offset:-3px;}\n#bodyContent .portable-infobox .expanded-profile-gallery-panel[hidden] {display:none!important;}\n#bodyContent .portable-infobox .expanded-profile-gallery-panel img {display:block;width:100%;height:auto;max-width:100%;border-radius:0;}";
    document.head.appendChild(style);
    var serial = 0;
    function enhance(root) {
        (root || document).querySelectorAll('.portable-infobox .pi-image .gallery').forEach(function (gallery) {
            if (gallery.dataset.profileTabs) return;
            var boxes = Array.from(gallery.querySelectorAll('.gallerybox'));
            if (boxes.length < 2) return;
            gallery.dataset.profileTabs = '1';
            var wrap = document.createElement('div');
            wrap.className = 'expanded-profile-gallery';
            var tabs = document.createElement('div');
            tabs.className = 'expanded-profile-gallery-tabs';
            tabs.setAttribute('role', 'tablist');
            tabs.setAttribute('aria-label', 'Profile images');
            wrap.appendChild(tabs);
            var buttons = [], panels = [];
            function select(index, focus) {
                buttons.forEach(function (button, i) {
                    button.setAttribute('aria-selected', String(i === index));
                    button.tabIndex = i === index ? 0 : -1;
                    panels[i].hidden = i !== index;
                });
                if (focus) buttons[index].focus();
            }
            boxes.forEach(function (box, i) {
                var id = 'expanded-profile-image-' + (++serial);
                var caption = box.querySelector('.gallerytext');
                var button = document.createElement('button');
                button.type = 'button'; button.id = id + '-tab';
                button.textContent = caption && caption.textContent.trim() || 'Image ' + (i + 1);
                button.setAttribute('role', 'tab'); button.setAttribute('aria-controls', id);
                var panel = document.createElement('div');
                panel.id = id; panel.className = 'expanded-profile-gallery-panel';
                panel.setAttribute('role', 'tabpanel'); panel.setAttribute('aria-labelledby', button.id);
                var thumb = box.querySelector('.thumb');
                if (thumb) while (thumb.firstChild) panel.appendChild(thumb.firstChild);
                var image = panel.querySelector('img');
                var link = panel.querySelector('a.mw-file-description');
                if (image && link) {
                    var path = new URL(link.href, location.href).pathname;
                    var file = decodeURIComponent(path).match(/\/File:(.+)$/);
                    if (file) {
                        image.removeAttribute('srcset');
                        image.src = mw.util.getUrl('Special:Redirect/file/' + file[1]);
                    }
                }
                button.addEventListener('click', function () { select(i, false); });
                button.addEventListener('keydown', function (event) {
                    var next;
                    if (event.key === 'ArrowRight') next = (i + 1) % boxes.length;
                    if (event.key === 'ArrowLeft') next = (i + boxes.length - 1) % boxes.length;
                    if (event.key === 'Home') next = 0;
                    if (event.key === 'End') next = boxes.length - 1;
                    if (next !== undefined) { event.preventDefault(); select(next, true); }
                });
                buttons.push(button); panels.push(panel); tabs.appendChild(button); wrap.appendChild(panel);
            });
            select(0, false); gallery.replaceWith(wrap);
        });
    }
    mw.loader.using('mediawiki.util').then(function () {
        enhance(document);
        mw.hook('wikipage.content').add(function (content) { enhance(content[0] || content); });
    });
}());
/* Keep modern gallery styles in sync with site controls. */
(function(){var s=document.createElement("style");s.id="expanded-gallery-consistency";s.textContent="/* Consistent gallery cards across current and legacy MediaWiki gallery markup. */\n#bodyContent .gallery .gallerybox {flex-direction:column;box-sizing:border-box;min-width:0;}\n#bodyContent .gallery .gallerybox > .thumb {display:flex;align-items:center;justify-content:center;flex:1 1 auto;width:100%!important;height:auto!important;border:0;background:none;}\n#bodyContent .gallery .gallerybox > .thumb > span,\n#bodyContent .gallery .gallerybox > .thumb > a {display:block;width:100%;}\n#bodyContent .gallery .gallerybox > .thumb img {width:100%;height:auto;max-width:100%;object-fit:contain;}\n#bodyContent .gallery .gallerybox > .gallerytext,\n#bodyContent .gallery .gallerybox > .gallerytextwrapper .gallerytext {display:block;flex:0 0 auto;width:auto;margin:1rem 0 0;padding:0 1rem;border:0;outline:0;box-shadow:none;border-radius:var(--custom-border-radius-small);line-height:inherit;text-align:center;font-size:.8rem;color:var(--wiki-content-text-color);background:var(--wiki-content-background-color--secondary);}\n#bodyContent .gallery .gallerybox > .gallerytextwrapper {position:static;display:block!important;flex:0 0 auto;width:100%!important;height:auto;max-height:none;margin:0;padding:0;background:none;}\n#bodyContent .gallery .gallerybox > .gallerytext:empty,\n#bodyContent .gallery .gallerybox > .gallerytextwrapper:has(> .gallerytext:empty) {display:none!important;}\n#bodyContent figure[typeof~=\"mw:File/Thumb\"]:has(> figcaption:empty),\n#bodyContent figure[typeof~=\"mw:File/Frame\"]:has(> figcaption:empty) {padding:0;border:0;outline:0;box-shadow:none;background:transparent;}\n#bodyContent figure > figcaption:empty {display:none!important;}\n#bodyContent .thumbinner:has(> .thumbcaption:empty) {padding:0;border:0;outline:0;box-shadow:none;background:transparent;}\n#bodyContent .thumbcaption:empty {display:none!important;}\n#bodyContent figure:has(> figcaption:empty) > a::after {display:none!important;content:none!important;}\n#bodyContent figure:has(> figcaption:empty) img {background:transparent;border:0;border-radius:0;outline:0;box-shadow:none;}\n";document.head.appendChild(s);}());
/* VisualEditor toolbar layout and find panel repair. */
(function(){var s=document.createElement("style");s.id="expanded-editor-toolbar-fix";s.textContent="\n/* Editor toolbar dialogs must span the toolbar, not shrink as flex items. */\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar > .oo-ui-toolbar-bar > .oo-ui-windowManager {flex:0 0 100%!important;width:100%!important;min-width:0;max-width:100%;box-sizing:border-box;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog {width:100%!important;max-width:100%;box-sizing:border-box;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar > .oo-ui-toolbar-bar {background:#98562f;color:#fff;border:2px solid #fff;border-radius:10px;box-shadow:0 0 0 2px #171717;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-tool-link,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-popupToolGroup-handle {color:#fff;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-iconElement-icon,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-indicatorElement-indicator {background-color:transparent!important;filter:brightness(0) invert(1);}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-tool-link:hover,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-popupToolGroup-handle:hover {background:#b17d60;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-popupToolGroup-tools {background:#98562f;color:#fff;border-color:#c99972;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-window-frame,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-window-body {background:#98562f;color:#fff;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-inputWidget-input {background:#713d24;color:#fff;border:1px solid #c99972;border-radius:5px;font-family:Nunito,Arial,sans-serif;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {background:#93dc17;color:#fff;border:2px solid #fff;border-radius:7px;box-shadow:inset 0 0 0 1px #171717;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-widget-disabled .oo-ui-buttonElement-button {background:#947560;opacity:.65;}\n\nhtml.ve-active body.skin-vector-legacy .ve-ui-surface {display:block!important;width:100%!important;min-width:0;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-surface > .ve-ce-surface {width:100%!important;min-width:0;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar.ve-ui-toolbar-floating {top:var(--wikigg-header-scroll-height,64px)!important;}\n\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {background:#b17d60;color:#fff;border-color:#c99972;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-buttonElement-active .oo-ui-buttonElement-button {background:#c27b35;}\n";document.head.appendChild(s);}());