]> source.dussan.org Git - jquery-ui.git/commitdiff
Tests: Update jQuery Migrate from 3.4.1 to 3.5.2, simplify Migrate setup
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Tue, 30 Jul 2024 15:53:47 +0000 (17:53 +0200)
committerGitHub <noreply@github.com>
Tue, 30 Jul 2024 15:53:47 +0000 (17:53 +0200)
Apart from updating jQuery Migrate, the setup is now changed so that exact
Migrate versions are only references when fetching npm packages; other than
that, they're represented as `jquery-migrate-1.x` & `jquery-migrate-3.x`. This
will allow smaller changes when updating jQuery Migrate in the future.

Closes gh-2273

Gruntfile.js
bower.json
external/jquery-migrate-1.4.1/LICENSE.txt [deleted file]
external/jquery-migrate-1.4.1/jquery-migrate.js [deleted file]
external/jquery-migrate-1.x/LICENSE.txt [new file with mode: 0644]
external/jquery-migrate-1.x/jquery-migrate.js [new file with mode: 0644]
external/jquery-migrate-3.4.1/LICENSE.txt [deleted file]
external/jquery-migrate-3.4.1/jquery-migrate.js [deleted file]
external/jquery-migrate-3.x/LICENSE.txt [new file with mode: 0644]
external/jquery-migrate-3.x/jquery-migrate.js [new file with mode: 0644]
tests/lib/bootstrap.js

index 05e83c9613aa0df41f4359b7396b704da689d673..334e4bb1ae1137c803574393ab563e8835bf130e 100644 (file)
@@ -316,13 +316,13 @@ grunt.initConfig( {
                                "jquery-3.7.1/jquery.js": "jquery-3.7.1/dist/jquery.js",
                                "jquery-3.7.1/LICENSE.txt": "jquery-3.7.1/LICENSE.txt",
 
-                               "jquery-migrate-1.4.1/jquery-migrate.js":
-                                       "jquery-migrate-1.4.1/dist/jquery-migrate.js",
-                               "jquery-migrate-1.4.1/LICENSE.txt": "jquery-migrate-1.4.1/LICENSE.txt",
+                               "jquery-migrate-1.x/jquery-migrate.js":
+                                       "jquery-migrate-1.x/dist/jquery-migrate.js",
+                               "jquery-migrate-1.x/LICENSE.txt": "jquery-migrate-1.x/LICENSE.txt",
 
-                               "jquery-migrate-3.4.1/jquery-migrate.js":
-                                       "jquery-migrate-3.4.1/dist/jquery-migrate.js",
-                               "jquery-migrate-3.4.1/LICENSE.txt": "jquery-migrate-3.4.1/LICENSE.txt"
+                               "jquery-migrate-3.x/jquery-migrate.js":
+                                       "jquery-migrate-3.x/dist/jquery-migrate.js",
+                               "jquery-migrate-3.x/LICENSE.txt": "jquery-migrate-3.x/LICENSE.txt"
                        }
                }
        },
index 1efb14ee2f639eab1845049b16ad49f48b487a3e..eec454dea058b5f6ba880625030cb5a007a10942 100644 (file)
@@ -38,7 +38,7 @@
                "jquery-3.6.4": "jquery#3.6.4",
                "jquery-3.7.0": "jquery#3.7.0",
                "jquery-3.7.1": "jquery#3.7.1",
-               "jquery-migrate-1.4.1": "https://registry.npmjs.org/jquery-migrate/-/jquery-migrate-1.4.1.tgz",
-               "jquery-migrate-3.4.1": "https://registry.npmjs.org/jquery-migrate/-/jquery-migrate-3.4.1.tgz"
+               "jquery-migrate-1.x": "https://registry.npmjs.org/jquery-migrate/-/jquery-migrate-1.4.1.tgz",
+               "jquery-migrate-3.x": "https://registry.npmjs.org/jquery-migrate/-/jquery-migrate-3.5.2.tgz"
        }
 }
diff --git a/external/jquery-migrate-1.4.1/LICENSE.txt b/external/jquery-migrate-1.4.1/LICENSE.txt
deleted file mode 100644 (file)
index 9dfa071..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-Copyright jQuery Foundation and other contributors, https://jquery.org/
-
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery-migrate
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
diff --git a/external/jquery-migrate-1.4.1/jquery-migrate.js b/external/jquery-migrate-1.4.1/jquery-migrate.js
deleted file mode 100644 (file)
index 89437eb..0000000
+++ /dev/null
@@ -1,752 +0,0 @@
-/*!
- * jQuery Migrate - v1.4.1 - 2016-05-19
- * Copyright jQuery Foundation and other contributors
- */
-(function( jQuery, window, undefined ) {
-// See http://bugs.jquery.com/ticket/13335
-// "use strict";
-
-
-jQuery.migrateVersion = "1.4.1";
-
-
-var warnedAbout = {};
-
-// List of warnings already given; public read only
-jQuery.migrateWarnings = [];
-
-// Set to true to prevent console output; migrateWarnings still maintained
-// jQuery.migrateMute = false;
-
-// Show a message on the console so devs know we're active
-if ( window.console && window.console.log ) {
-       window.console.log( "JQMIGRATE: Migrate is installed" +
-               ( jQuery.migrateMute ? "" : " with logging active" ) +
-               ", version " + jQuery.migrateVersion );
-}
-
-// Set to false to disable traces that appear with warnings
-if ( jQuery.migrateTrace === undefined ) {
-       jQuery.migrateTrace = true;
-}
-
-// Forget any warnings we've already given; public
-jQuery.migrateReset = function() {
-       warnedAbout = {};
-       jQuery.migrateWarnings.length = 0;
-};
-
-function migrateWarn( msg) {
-       var console = window.console;
-       if ( !warnedAbout[ msg ] ) {
-               warnedAbout[ msg ] = true;
-               jQuery.migrateWarnings.push( msg );
-               if ( console && console.warn && !jQuery.migrateMute ) {
-                       console.warn( "JQMIGRATE: " + msg );
-                       if ( jQuery.migrateTrace && console.trace ) {
-                               console.trace();
-                       }
-               }
-       }
-}
-
-function migrateWarnProp( obj, prop, value, msg ) {
-       if ( Object.defineProperty ) {
-               // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
-               // allow property to be overwritten in case some other plugin wants it
-               try {
-                       Object.defineProperty( obj, prop, {
-                               configurable: true,
-                               enumerable: true,
-                               get: function() {
-                                       migrateWarn( msg );
-                                       return value;
-                               },
-                               set: function( newValue ) {
-                                       migrateWarn( msg );
-                                       value = newValue;
-                               }
-                       });
-                       return;
-               } catch( err ) {
-                       // IE8 is a dope about Object.defineProperty, can't warn there
-               }
-       }
-
-       // Non-ES5 (or broken) browser; just set the property
-       jQuery._definePropertyBroken = true;
-       obj[ prop ] = value;
-}
-
-if ( document.compatMode === "BackCompat" ) {
-       // jQuery has never supported or tested Quirks Mode
-       migrateWarn( "jQuery is not compatible with Quirks Mode" );
-}
-
-
-var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
-       oldAttr = jQuery.attr,
-       valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
-               function() { return null; },
-       valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
-               function() { return undefined; },
-       rnoType = /^(?:input|button)$/i,
-       rnoAttrNodeType = /^[238]$/,
-       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
-       ruseDefault = /^(?:checked|selected)$/i;
-
-// jQuery.attrFn
-migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
-
-jQuery.attr = function( elem, name, value, pass ) {
-       var lowerName = name.toLowerCase(),
-               nType = elem && elem.nodeType;
-
-       if ( pass ) {
-               // Since pass is used internally, we only warn for new jQuery
-               // versions where there isn't a pass arg in the formal params
-               if ( oldAttr.length < 4 ) {
-                       migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
-               }
-               if ( elem && !rnoAttrNodeType.test( nType ) &&
-                       (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
-                       return jQuery( elem )[ name ]( value );
-               }
-       }
-
-       // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
-       // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
-       if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
-               migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
-       }
-
-       // Restore boolHook for boolean property/attribute synchronization
-       if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
-               jQuery.attrHooks[ lowerName ] = {
-                       get: function( elem, name ) {
-                               // Align boolean attributes with corresponding properties
-                               // Fall back to attribute presence where some booleans are not supported
-                               var attrNode,
-                                       property = jQuery.prop( elem, name );
-                               return property === true || typeof property !== "boolean" &&
-                                       ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
-
-                                       name.toLowerCase() :
-                                       undefined;
-                       },
-                       set: function( elem, value, name ) {
-                               var propName;
-                               if ( value === false ) {
-                                       // Remove boolean attributes when set to false
-                                       jQuery.removeAttr( elem, name );
-                               } else {
-                                       // value is true since we know at this point it's type boolean and not false
-                                       // Set boolean attributes to the same name and set the DOM property
-                                       propName = jQuery.propFix[ name ] || name;
-                                       if ( propName in elem ) {
-                                               // Only set the IDL specifically if it already exists on the element
-                                               elem[ propName ] = true;
-                                       }
-
-                                       elem.setAttribute( name, name.toLowerCase() );
-                               }
-                               return name;
-                       }
-               };
-
-               // Warn only for attributes that can remain distinct from their properties post-1.9
-               if ( ruseDefault.test( lowerName ) ) {
-                       migrateWarn( "jQuery.fn.attr('" + lowerName + "') might use property instead of attribute" );
-               }
-       }
-
-       return oldAttr.call( jQuery, elem, name, value );
-};
-
-// attrHooks: value
-jQuery.attrHooks.value = {
-       get: function( elem, name ) {
-               var nodeName = ( elem.nodeName || "" ).toLowerCase();
-               if ( nodeName === "button" ) {
-                       return valueAttrGet.apply( this, arguments );
-               }
-               if ( nodeName !== "input" && nodeName !== "option" ) {
-                       migrateWarn("jQuery.fn.attr('value') no longer gets properties");
-               }
-               return name in elem ?
-                       elem.value :
-                       null;
-       },
-       set: function( elem, value ) {
-               var nodeName = ( elem.nodeName || "" ).toLowerCase();
-               if ( nodeName === "button" ) {
-                       return valueAttrSet.apply( this, arguments );
-               }
-               if ( nodeName !== "input" && nodeName !== "option" ) {
-                       migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
-               }
-               // Does not return so that setAttribute is also used
-               elem.value = value;
-       }
-};
-
-
-var matched, browser,
-       oldInit = jQuery.fn.init,
-       oldFind = jQuery.find,
-       oldParseJSON = jQuery.parseJSON,
-       rspaceAngle = /^\s*</,
-       rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
-       rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
-       // Note: XSS check is done below after string is trimmed
-       rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
-
-// $(html) "looks like html" rule change
-jQuery.fn.init = function( selector, context, rootjQuery ) {
-       var match, ret;
-
-       if ( selector && typeof selector === "string" ) {
-               if ( !jQuery.isPlainObject( context ) &&
-                               (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
-
-                       // This is an HTML string according to the "old" rules; is it still?
-                       if ( !rspaceAngle.test( selector ) ) {
-                               migrateWarn("$(html) HTML strings must start with '<' character");
-                       }
-                       if ( match[ 3 ] ) {
-                               migrateWarn("$(html) HTML text after last tag is ignored");
-                       }
-
-                       // Consistently reject any HTML-like string starting with a hash (gh-9521)
-                       // Note that this may break jQuery 1.6.x code that otherwise would work.
-                       if ( match[ 0 ].charAt( 0 ) === "#" ) {
-                               migrateWarn("HTML string cannot start with a '#' character");
-                               jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
-                       }
-
-                       // Now process using loose rules; let pre-1.8 play too
-                       // Is this a jQuery context? parseHTML expects a DOM element (#178)
-                       if ( context && context.context && context.context.nodeType ) {
-                               context = context.context;
-                       }
-
-                       if ( jQuery.parseHTML ) {
-                               return oldInit.call( this,
-                                               jQuery.parseHTML( match[ 2 ], context && context.ownerDocument ||
-                                                       context || document, true ), context, rootjQuery );
-                       }
-               }
-       }
-
-       ret = oldInit.apply( this, arguments );
-
-       // Fill in selector and context properties so .live() works
-       if ( selector && selector.selector !== undefined ) {
-               // A jQuery object, copy its properties
-               ret.selector = selector.selector;
-               ret.context = selector.context;
-
-       } else {
-               ret.selector = typeof selector === "string" ? selector : "";
-               if ( selector ) {
-                       ret.context = selector.nodeType? selector : context || document;
-               }
-       }
-
-       return ret;
-};
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.find = function( selector ) {
-       var args = Array.prototype.slice.call( arguments );
-
-       // Support: PhantomJS 1.x
-       // String#match fails to match when used with a //g RegExp, only on some strings
-       if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
-
-               // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
-               // First see if qS thinks it's a valid selector, if so avoid a false positive
-               try {
-                       document.querySelector( selector );
-               } catch ( err1 ) {
-
-                       // Didn't *look* valid to qSA, warn and try quoting what we think is the value
-                       selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) {
-                               return "[" + attr + op + "\"" + value + "\"]";
-                       } );
-
-                       // If the regexp *may* have created an invalid selector, don't update it
-                       // Note that there may be false alarms if selector uses jQuery extensions
-                       try {
-                               document.querySelector( selector );
-                               migrateWarn( "Attribute selector with '#' must be quoted: " + args[ 0 ] );
-                               args[ 0 ] = selector;
-                       } catch ( err2 ) {
-                               migrateWarn( "Attribute selector with '#' was not fixed: " + args[ 0 ] );
-                       }
-               }
-       }
-
-       return oldFind.apply( this, args );
-};
-
-// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
-var findProp;
-for ( findProp in oldFind ) {
-       if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
-               jQuery.find[ findProp ] = oldFind[ findProp ];
-       }
-}
-
-// Let $.parseJSON(falsy_value) return null
-jQuery.parseJSON = function( json ) {
-       if ( !json ) {
-               migrateWarn("jQuery.parseJSON requires a valid JSON string");
-               return null;
-       }
-       return oldParseJSON.apply( this, arguments );
-};
-
-jQuery.uaMatch = function( ua ) {
-       ua = ua.toLowerCase();
-
-       var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
-               /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
-               /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
-               /(msie) ([\w.]+)/.exec( ua ) ||
-               ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
-               [];
-
-       return {
-               browser: match[ 1 ] || "",
-               version: match[ 2 ] || "0"
-       };
-};
-
-// Don't clobber any existing jQuery.browser in case it's different
-if ( !jQuery.browser ) {
-       matched = jQuery.uaMatch( navigator.userAgent );
-       browser = {};
-
-       if ( matched.browser ) {
-               browser[ matched.browser ] = true;
-               browser.version = matched.version;
-       }
-
-       // Chrome is Webkit, but Webkit is also Safari.
-       if ( browser.chrome ) {
-               browser.webkit = true;
-       } else if ( browser.webkit ) {
-               browser.safari = true;
-       }
-
-       jQuery.browser = browser;
-}
-
-// Warn if the code tries to get jQuery.browser
-migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
-
-// jQuery.boxModel deprecated in 1.3, jQuery.support.boxModel deprecated in 1.7
-jQuery.boxModel = jQuery.support.boxModel = (document.compatMode === "CSS1Compat");
-migrateWarnProp( jQuery, "boxModel", jQuery.boxModel, "jQuery.boxModel is deprecated" );
-migrateWarnProp( jQuery.support, "boxModel", jQuery.support.boxModel, "jQuery.support.boxModel is deprecated" );
-
-jQuery.sub = function() {
-       function jQuerySub( selector, context ) {
-               return new jQuerySub.fn.init( selector, context );
-       }
-       jQuery.extend( true, jQuerySub, this );
-       jQuerySub.superclass = this;
-       jQuerySub.fn = jQuerySub.prototype = this();
-       jQuerySub.fn.constructor = jQuerySub;
-       jQuerySub.sub = this.sub;
-       jQuerySub.fn.init = function init( selector, context ) {
-               var instance = jQuery.fn.init.call( this, selector, context, rootjQuerySub );
-               return instance instanceof jQuerySub ?
-                       instance :
-                       jQuerySub( instance );
-       };
-       jQuerySub.fn.init.prototype = jQuerySub.fn;
-       var rootjQuerySub = jQuerySub(document);
-       migrateWarn( "jQuery.sub() is deprecated" );
-       return jQuerySub;
-};
-
-// The number of elements contained in the matched element set
-jQuery.fn.size = function() {
-       migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" );
-       return this.length;
-};
-
-
-var internalSwapCall = false;
-
-// If this version of jQuery has .swap(), don't false-alarm on internal uses
-if ( jQuery.swap ) {
-       jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) {
-               var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get;
-
-               if ( oldHook ) {
-                       jQuery.cssHooks[ name ].get = function() {
-                               var ret;
-
-                               internalSwapCall = true;
-                               ret = oldHook.apply( this, arguments );
-                               internalSwapCall = false;
-                               return ret;
-                       };
-               }
-       });
-}
-
-jQuery.swap = function( elem, options, callback, args ) {
-       var ret, name,
-               old = {};
-
-       if ( !internalSwapCall ) {
-               migrateWarn( "jQuery.swap() is undocumented and deprecated" );
-       }
-
-       // Remember the old values, and insert the new ones
-       for ( name in options ) {
-               old[ name ] = elem.style[ name ];
-               elem.style[ name ] = options[ name ];
-       }
-
-       ret = callback.apply( elem, args || [] );
-
-       // Revert the old values
-       for ( name in options ) {
-               elem.style[ name ] = old[ name ];
-       }
-
-       return ret;
-};
-
-
-// Ensure that $.ajax gets the new parseJSON defined in core.js
-jQuery.ajaxSetup({
-       converters: {
-               "text json": jQuery.parseJSON
-       }
-});
-
-
-var oldFnData = jQuery.fn.data;
-
-jQuery.fn.data = function( name ) {
-       var ret, evt,
-               elem = this[0];
-
-       // Handles 1.7 which has this behavior and 1.8 which doesn't
-       if ( elem && name === "events" && arguments.length === 1 ) {
-               ret = jQuery.data( elem, name );
-               evt = jQuery._data( elem, name );
-               if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
-                       migrateWarn("Use of jQuery.fn.data('events') is deprecated");
-                       return evt;
-               }
-       }
-       return oldFnData.apply( this, arguments );
-};
-
-
-var rscriptType = /\/(java|ecma)script/i;
-
-// Since jQuery.clean is used internally on older versions, we only shim if it's missing
-if ( !jQuery.clean ) {
-       jQuery.clean = function( elems, context, fragment, scripts ) {
-               // Set context per 1.8 logic
-               context = context || document;
-               context = !context.nodeType && context[0] || context;
-               context = context.ownerDocument || context;
-
-               migrateWarn("jQuery.clean() is deprecated");
-
-               var i, elem, handleScript, jsTags,
-                       ret = [];
-
-               jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
-
-               // Complex logic lifted directly from jQuery 1.8
-               if ( fragment ) {
-                       // Special handling of each script element
-                       handleScript = function( elem ) {
-                               // Check if we consider it executable
-                               if ( !elem.type || rscriptType.test( elem.type ) ) {
-                                       // Detach the script and store it in the scripts array (if provided) or the fragment
-                                       // Return truthy to indicate that it has been handled
-                                       return scripts ?
-                                               scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
-                                               fragment.appendChild( elem );
-                               }
-                       };
-
-                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
-                               // Check if we're done after handling an executable script
-                               if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
-                                       // Append to fragment and handle embedded scripts
-                                       fragment.appendChild( elem );
-                                       if ( typeof elem.getElementsByTagName !== "undefined" ) {
-                                               // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
-                                               jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
-
-                                               // Splice the scripts into ret after their former ancestor and advance our index beyond them
-                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
-                                               i += jsTags.length;
-                                       }
-                               }
-                       }
-               }
-
-               return ret;
-       };
-}
-
-var eventAdd = jQuery.event.add,
-       eventRemove = jQuery.event.remove,
-       eventTrigger = jQuery.event.trigger,
-       oldToggle = jQuery.fn.toggle,
-       oldLive = jQuery.fn.live,
-       oldDie = jQuery.fn.die,
-       oldLoad = jQuery.fn.load,
-       ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
-       rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
-       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
-       hoverHack = function( events ) {
-               if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
-                       return events;
-               }
-               if ( rhoverHack.test( events ) ) {
-                       migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
-               }
-               return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
-       };
-
-// Event props removed in 1.9, put them back if needed; no practical way to warn them
-if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
-       jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
-}
-
-// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
-if ( jQuery.event.dispatch ) {
-       migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
-}
-
-// Support for 'hover' pseudo-event and ajax event warnings
-jQuery.event.add = function( elem, types, handler, data, selector ){
-       if ( elem !== document && rajaxEvent.test( types ) ) {
-               migrateWarn( "AJAX events should be attached to document: " + types );
-       }
-       eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
-};
-jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
-       eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
-};
-
-jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
-
-       jQuery.fn[ name ] = function() {
-               var args = Array.prototype.slice.call( arguments, 0 );
-
-               // If this is an ajax load() the first arg should be the string URL;
-               // technically this could also be the "Anything" arg of the event .load()
-               // which just goes to show why this dumb signature has been deprecated!
-               // jQuery custom builds that exclude the Ajax module justifiably die here.
-               if ( name === "load" && typeof args[ 0 ] === "string" ) {
-                       return oldLoad.apply( this, args );
-               }
-
-               migrateWarn( "jQuery.fn." + name + "() is deprecated" );
-
-               args.splice( 0, 0, name );
-               if ( arguments.length ) {
-                       return this.bind.apply( this, args );
-               }
-
-               // Use .triggerHandler here because:
-               // - load and unload events don't need to bubble, only applied to window or image
-               // - error event should not bubble to window, although it does pre-1.7
-               // See http://bugs.jquery.com/ticket/11820
-               this.triggerHandler.apply( this, args );
-               return this;
-       };
-
-});
-
-jQuery.fn.toggle = function( fn, fn2 ) {
-
-       // Don't mess with animation or css toggles
-       if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
-               return oldToggle.apply( this, arguments );
-       }
-       migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
-
-       // Save reference to arguments for access in closure
-       var args = arguments,
-               guid = fn.guid || jQuery.guid++,
-               i = 0,
-               toggler = function( event ) {
-                       // Figure out which function to execute
-                       var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
-                       jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
-                       // Make sure that clicks stop
-                       event.preventDefault();
-
-                       // and execute the function
-                       return args[ lastToggle ].apply( this, arguments ) || false;
-               };
-
-       // link all the functions, so any of them can unbind this click handler
-       toggler.guid = guid;
-       while ( i < args.length ) {
-               args[ i++ ].guid = guid;
-       }
-
-       return this.click( toggler );
-};
-
-jQuery.fn.live = function( types, data, fn ) {
-       migrateWarn("jQuery.fn.live() is deprecated");
-       if ( oldLive ) {
-               return oldLive.apply( this, arguments );
-       }
-       jQuery( this.context ).on( types, this.selector, data, fn );
-       return this;
-};
-
-jQuery.fn.die = function( types, fn ) {
-       migrateWarn("jQuery.fn.die() is deprecated");
-       if ( oldDie ) {
-               return oldDie.apply( this, arguments );
-       }
-       jQuery( this.context ).off( types, this.selector || "**", fn );
-       return this;
-};
-
-// Turn global events into document-triggered events
-jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
-       if ( !elem && !rajaxEvent.test( event ) ) {
-               migrateWarn( "Global events are undocumented and deprecated" );
-       }
-       return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
-};
-jQuery.each( ajaxEvents.split("|"),
-       function( _, name ) {
-               jQuery.event.special[ name ] = {
-                       setup: function() {
-                               var elem = this;
-
-                               // The document needs no shimming; must be !== for oldIE
-                               if ( elem !== document ) {
-                                       jQuery.event.add( document, name + "." + jQuery.guid, function() {
-                                               jQuery.event.trigger( name, Array.prototype.slice.call( arguments, 1 ), elem, true );
-                                       });
-                                       jQuery._data( this, name, jQuery.guid++ );
-                               }
-                               return false;
-                       },
-                       teardown: function() {
-                               if ( this !== document ) {
-                                       jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
-                               }
-                               return false;
-                       }
-               };
-       }
-);
-
-jQuery.event.special.ready = {
-       setup: function() {
-               if ( this === document ) {
-                       migrateWarn( "'ready' event is deprecated" );
-               }
-       }
-};
-
-var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack,
-       oldFnFind = jQuery.fn.find;
-
-jQuery.fn.andSelf = function() {
-       migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
-       return oldSelf.apply( this, arguments );
-};
-
-jQuery.fn.find = function( selector ) {
-       var ret = oldFnFind.apply( this, arguments );
-       ret.context = this.context;
-       ret.selector = this.selector ? this.selector + " " + selector : selector;
-       return ret;
-};
-
-
-// jQuery 1.6 did not support Callbacks, do not warn there
-if ( jQuery.Callbacks ) {
-
-       var oldDeferred = jQuery.Deferred,
-               tuples = [
-                       // action, add listener, callbacks, .then handlers, final state
-                       [ "resolve", "done", jQuery.Callbacks("once memory"),
-                               jQuery.Callbacks("once memory"), "resolved" ],
-                       [ "reject", "fail", jQuery.Callbacks("once memory"),
-                               jQuery.Callbacks("once memory"), "rejected" ],
-                       [ "notify", "progress", jQuery.Callbacks("memory"),
-                               jQuery.Callbacks("memory") ]
-               ];
-
-       jQuery.Deferred = function( func ) {
-               var deferred = oldDeferred(),
-                       promise = deferred.promise();
-
-               deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
-                       var fns = arguments;
-
-                       migrateWarn( "deferred.pipe() is deprecated" );
-
-                       return jQuery.Deferred(function( newDefer ) {
-                               jQuery.each( tuples, function( i, tuple ) {
-                                       var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
-                                       // deferred.done(function() { bind to newDefer or newDefer.resolve })
-                                       // deferred.fail(function() { bind to newDefer or newDefer.reject })
-                                       // deferred.progress(function() { bind to newDefer or newDefer.notify })
-                                       deferred[ tuple[1] ](function() {
-                                               var returned = fn && fn.apply( this, arguments );
-                                               if ( returned && jQuery.isFunction( returned.promise ) ) {
-                                                       returned.promise()
-                                                               .done( newDefer.resolve )
-                                                               .fail( newDefer.reject )
-                                                               .progress( newDefer.notify );
-                                               } else {
-                                                       newDefer[ tuple[ 0 ] + "With" ](
-                                                               this === promise ? newDefer.promise() : this,
-                                                               fn ? [ returned ] : arguments
-                                                       );
-                                               }
-                                       });
-                               });
-                               fns = null;
-                       }).promise();
-
-               };
-
-               deferred.isResolved = function() {
-                       migrateWarn( "deferred.isResolved is deprecated" );
-                       return deferred.state() === "resolved";
-               };
-
-               deferred.isRejected = function() {
-                       migrateWarn( "deferred.isRejected is deprecated" );
-                       return deferred.state() === "rejected";
-               };
-
-               if ( func ) {
-                       func.call( deferred, deferred );
-               }
-
-               return deferred;
-       };
-
-}
-
-})( jQuery, window );
diff --git a/external/jquery-migrate-1.x/LICENSE.txt b/external/jquery-migrate-1.x/LICENSE.txt
new file mode 100644 (file)
index 0000000..9dfa071
--- /dev/null
@@ -0,0 +1,36 @@
+Copyright jQuery Foundation and other contributors, https://jquery.org/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/jquery-migrate
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
diff --git a/external/jquery-migrate-1.x/jquery-migrate.js b/external/jquery-migrate-1.x/jquery-migrate.js
new file mode 100644 (file)
index 0000000..89437eb
--- /dev/null
@@ -0,0 +1,752 @@
+/*!
+ * jQuery Migrate - v1.4.1 - 2016-05-19
+ * Copyright jQuery Foundation and other contributors
+ */
+(function( jQuery, window, undefined ) {
+// See http://bugs.jquery.com/ticket/13335
+// "use strict";
+
+
+jQuery.migrateVersion = "1.4.1";
+
+
+var warnedAbout = {};
+
+// List of warnings already given; public read only
+jQuery.migrateWarnings = [];
+
+// Set to true to prevent console output; migrateWarnings still maintained
+// jQuery.migrateMute = false;
+
+// Show a message on the console so devs know we're active
+if ( window.console && window.console.log ) {
+       window.console.log( "JQMIGRATE: Migrate is installed" +
+               ( jQuery.migrateMute ? "" : " with logging active" ) +
+               ", version " + jQuery.migrateVersion );
+}
+
+// Set to false to disable traces that appear with warnings
+if ( jQuery.migrateTrace === undefined ) {
+       jQuery.migrateTrace = true;
+}
+
+// Forget any warnings we've already given; public
+jQuery.migrateReset = function() {
+       warnedAbout = {};
+       jQuery.migrateWarnings.length = 0;
+};
+
+function migrateWarn( msg) {
+       var console = window.console;
+       if ( !warnedAbout[ msg ] ) {
+               warnedAbout[ msg ] = true;
+               jQuery.migrateWarnings.push( msg );
+               if ( console && console.warn && !jQuery.migrateMute ) {
+                       console.warn( "JQMIGRATE: " + msg );
+                       if ( jQuery.migrateTrace && console.trace ) {
+                               console.trace();
+                       }
+               }
+       }
+}
+
+function migrateWarnProp( obj, prop, value, msg ) {
+       if ( Object.defineProperty ) {
+               // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
+               // allow property to be overwritten in case some other plugin wants it
+               try {
+                       Object.defineProperty( obj, prop, {
+                               configurable: true,
+                               enumerable: true,
+                               get: function() {
+                                       migrateWarn( msg );
+                                       return value;
+                               },
+                               set: function( newValue ) {
+                                       migrateWarn( msg );
+                                       value = newValue;
+                               }
+                       });
+                       return;
+               } catch( err ) {
+                       // IE8 is a dope about Object.defineProperty, can't warn there
+               }
+       }
+
+       // Non-ES5 (or broken) browser; just set the property
+       jQuery._definePropertyBroken = true;
+       obj[ prop ] = value;
+}
+
+if ( document.compatMode === "BackCompat" ) {
+       // jQuery has never supported or tested Quirks Mode
+       migrateWarn( "jQuery is not compatible with Quirks Mode" );
+}
+
+
+var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
+       oldAttr = jQuery.attr,
+       valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
+               function() { return null; },
+       valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
+               function() { return undefined; },
+       rnoType = /^(?:input|button)$/i,
+       rnoAttrNodeType = /^[238]$/,
+       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+       ruseDefault = /^(?:checked|selected)$/i;
+
+// jQuery.attrFn
+migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
+
+jQuery.attr = function( elem, name, value, pass ) {
+       var lowerName = name.toLowerCase(),
+               nType = elem && elem.nodeType;
+
+       if ( pass ) {
+               // Since pass is used internally, we only warn for new jQuery
+               // versions where there isn't a pass arg in the formal params
+               if ( oldAttr.length < 4 ) {
+                       migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
+               }
+               if ( elem && !rnoAttrNodeType.test( nType ) &&
+                       (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
+                       return jQuery( elem )[ name ]( value );
+               }
+       }
+
+       // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
+       // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
+       if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
+               migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
+       }
+
+       // Restore boolHook for boolean property/attribute synchronization
+       if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
+               jQuery.attrHooks[ lowerName ] = {
+                       get: function( elem, name ) {
+                               // Align boolean attributes with corresponding properties
+                               // Fall back to attribute presence where some booleans are not supported
+                               var attrNode,
+                                       property = jQuery.prop( elem, name );
+                               return property === true || typeof property !== "boolean" &&
+                                       ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+
+                                       name.toLowerCase() :
+                                       undefined;
+                       },
+                       set: function( elem, value, name ) {
+                               var propName;
+                               if ( value === false ) {
+                                       // Remove boolean attributes when set to false
+                                       jQuery.removeAttr( elem, name );
+                               } else {
+                                       // value is true since we know at this point it's type boolean and not false
+                                       // Set boolean attributes to the same name and set the DOM property
+                                       propName = jQuery.propFix[ name ] || name;
+                                       if ( propName in elem ) {
+                                               // Only set the IDL specifically if it already exists on the element
+                                               elem[ propName ] = true;
+                                       }
+
+                                       elem.setAttribute( name, name.toLowerCase() );
+                               }
+                               return name;
+                       }
+               };
+
+               // Warn only for attributes that can remain distinct from their properties post-1.9
+               if ( ruseDefault.test( lowerName ) ) {
+                       migrateWarn( "jQuery.fn.attr('" + lowerName + "') might use property instead of attribute" );
+               }
+       }
+
+       return oldAttr.call( jQuery, elem, name, value );
+};
+
+// attrHooks: value
+jQuery.attrHooks.value = {
+       get: function( elem, name ) {
+               var nodeName = ( elem.nodeName || "" ).toLowerCase();
+               if ( nodeName === "button" ) {
+                       return valueAttrGet.apply( this, arguments );
+               }
+               if ( nodeName !== "input" && nodeName !== "option" ) {
+                       migrateWarn("jQuery.fn.attr('value') no longer gets properties");
+               }
+               return name in elem ?
+                       elem.value :
+                       null;
+       },
+       set: function( elem, value ) {
+               var nodeName = ( elem.nodeName || "" ).toLowerCase();
+               if ( nodeName === "button" ) {
+                       return valueAttrSet.apply( this, arguments );
+               }
+               if ( nodeName !== "input" && nodeName !== "option" ) {
+                       migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
+               }
+               // Does not return so that setAttribute is also used
+               elem.value = value;
+       }
+};
+
+
+var matched, browser,
+       oldInit = jQuery.fn.init,
+       oldFind = jQuery.find,
+       oldParseJSON = jQuery.parseJSON,
+       rspaceAngle = /^\s*</,
+       rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
+       rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
+       // Note: XSS check is done below after string is trimmed
+       rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
+
+// $(html) "looks like html" rule change
+jQuery.fn.init = function( selector, context, rootjQuery ) {
+       var match, ret;
+
+       if ( selector && typeof selector === "string" ) {
+               if ( !jQuery.isPlainObject( context ) &&
+                               (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
+
+                       // This is an HTML string according to the "old" rules; is it still?
+                       if ( !rspaceAngle.test( selector ) ) {
+                               migrateWarn("$(html) HTML strings must start with '<' character");
+                       }
+                       if ( match[ 3 ] ) {
+                               migrateWarn("$(html) HTML text after last tag is ignored");
+                       }
+
+                       // Consistently reject any HTML-like string starting with a hash (gh-9521)
+                       // Note that this may break jQuery 1.6.x code that otherwise would work.
+                       if ( match[ 0 ].charAt( 0 ) === "#" ) {
+                               migrateWarn("HTML string cannot start with a '#' character");
+                               jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
+                       }
+
+                       // Now process using loose rules; let pre-1.8 play too
+                       // Is this a jQuery context? parseHTML expects a DOM element (#178)
+                       if ( context && context.context && context.context.nodeType ) {
+                               context = context.context;
+                       }
+
+                       if ( jQuery.parseHTML ) {
+                               return oldInit.call( this,
+                                               jQuery.parseHTML( match[ 2 ], context && context.ownerDocument ||
+                                                       context || document, true ), context, rootjQuery );
+                       }
+               }
+       }
+
+       ret = oldInit.apply( this, arguments );
+
+       // Fill in selector and context properties so .live() works
+       if ( selector && selector.selector !== undefined ) {
+               // A jQuery object, copy its properties
+               ret.selector = selector.selector;
+               ret.context = selector.context;
+
+       } else {
+               ret.selector = typeof selector === "string" ? selector : "";
+               if ( selector ) {
+                       ret.context = selector.nodeType? selector : context || document;
+               }
+       }
+
+       return ret;
+};
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.find = function( selector ) {
+       var args = Array.prototype.slice.call( arguments );
+
+       // Support: PhantomJS 1.x
+       // String#match fails to match when used with a //g RegExp, only on some strings
+       if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
+
+               // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
+               // First see if qS thinks it's a valid selector, if so avoid a false positive
+               try {
+                       document.querySelector( selector );
+               } catch ( err1 ) {
+
+                       // Didn't *look* valid to qSA, warn and try quoting what we think is the value
+                       selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) {
+                               return "[" + attr + op + "\"" + value + "\"]";
+                       } );
+
+                       // If the regexp *may* have created an invalid selector, don't update it
+                       // Note that there may be false alarms if selector uses jQuery extensions
+                       try {
+                               document.querySelector( selector );
+                               migrateWarn( "Attribute selector with '#' must be quoted: " + args[ 0 ] );
+                               args[ 0 ] = selector;
+                       } catch ( err2 ) {
+                               migrateWarn( "Attribute selector with '#' was not fixed: " + args[ 0 ] );
+                       }
+               }
+       }
+
+       return oldFind.apply( this, args );
+};
+
+// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
+var findProp;
+for ( findProp in oldFind ) {
+       if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
+               jQuery.find[ findProp ] = oldFind[ findProp ];
+       }
+}
+
+// Let $.parseJSON(falsy_value) return null
+jQuery.parseJSON = function( json ) {
+       if ( !json ) {
+               migrateWarn("jQuery.parseJSON requires a valid JSON string");
+               return null;
+       }
+       return oldParseJSON.apply( this, arguments );
+};
+
+jQuery.uaMatch = function( ua ) {
+       ua = ua.toLowerCase();
+
+       var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+               /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+               /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+               /(msie) ([\w.]+)/.exec( ua ) ||
+               ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+               [];
+
+       return {
+               browser: match[ 1 ] || "",
+               version: match[ 2 ] || "0"
+       };
+};
+
+// Don't clobber any existing jQuery.browser in case it's different
+if ( !jQuery.browser ) {
+       matched = jQuery.uaMatch( navigator.userAgent );
+       browser = {};
+
+       if ( matched.browser ) {
+               browser[ matched.browser ] = true;
+               browser.version = matched.version;
+       }
+
+       // Chrome is Webkit, but Webkit is also Safari.
+       if ( browser.chrome ) {
+               browser.webkit = true;
+       } else if ( browser.webkit ) {
+               browser.safari = true;
+       }
+
+       jQuery.browser = browser;
+}
+
+// Warn if the code tries to get jQuery.browser
+migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
+
+// jQuery.boxModel deprecated in 1.3, jQuery.support.boxModel deprecated in 1.7
+jQuery.boxModel = jQuery.support.boxModel = (document.compatMode === "CSS1Compat");
+migrateWarnProp( jQuery, "boxModel", jQuery.boxModel, "jQuery.boxModel is deprecated" );
+migrateWarnProp( jQuery.support, "boxModel", jQuery.support.boxModel, "jQuery.support.boxModel is deprecated" );
+
+jQuery.sub = function() {
+       function jQuerySub( selector, context ) {
+               return new jQuerySub.fn.init( selector, context );
+       }
+       jQuery.extend( true, jQuerySub, this );
+       jQuerySub.superclass = this;
+       jQuerySub.fn = jQuerySub.prototype = this();
+       jQuerySub.fn.constructor = jQuerySub;
+       jQuerySub.sub = this.sub;
+       jQuerySub.fn.init = function init( selector, context ) {
+               var instance = jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+               return instance instanceof jQuerySub ?
+                       instance :
+                       jQuerySub( instance );
+       };
+       jQuerySub.fn.init.prototype = jQuerySub.fn;
+       var rootjQuerySub = jQuerySub(document);
+       migrateWarn( "jQuery.sub() is deprecated" );
+       return jQuerySub;
+};
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+       migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" );
+       return this.length;
+};
+
+
+var internalSwapCall = false;
+
+// If this version of jQuery has .swap(), don't false-alarm on internal uses
+if ( jQuery.swap ) {
+       jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) {
+               var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get;
+
+               if ( oldHook ) {
+                       jQuery.cssHooks[ name ].get = function() {
+                               var ret;
+
+                               internalSwapCall = true;
+                               ret = oldHook.apply( this, arguments );
+                               internalSwapCall = false;
+                               return ret;
+                       };
+               }
+       });
+}
+
+jQuery.swap = function( elem, options, callback, args ) {
+       var ret, name,
+               old = {};
+
+       if ( !internalSwapCall ) {
+               migrateWarn( "jQuery.swap() is undocumented and deprecated" );
+       }
+
+       // Remember the old values, and insert the new ones
+       for ( name in options ) {
+               old[ name ] = elem.style[ name ];
+               elem.style[ name ] = options[ name ];
+       }
+
+       ret = callback.apply( elem, args || [] );
+
+       // Revert the old values
+       for ( name in options ) {
+               elem.style[ name ] = old[ name ];
+       }
+
+       return ret;
+};
+
+
+// Ensure that $.ajax gets the new parseJSON defined in core.js
+jQuery.ajaxSetup({
+       converters: {
+               "text json": jQuery.parseJSON
+       }
+});
+
+
+var oldFnData = jQuery.fn.data;
+
+jQuery.fn.data = function( name ) {
+       var ret, evt,
+               elem = this[0];
+
+       // Handles 1.7 which has this behavior and 1.8 which doesn't
+       if ( elem && name === "events" && arguments.length === 1 ) {
+               ret = jQuery.data( elem, name );
+               evt = jQuery._data( elem, name );
+               if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
+                       migrateWarn("Use of jQuery.fn.data('events') is deprecated");
+                       return evt;
+               }
+       }
+       return oldFnData.apply( this, arguments );
+};
+
+
+var rscriptType = /\/(java|ecma)script/i;
+
+// Since jQuery.clean is used internally on older versions, we only shim if it's missing
+if ( !jQuery.clean ) {
+       jQuery.clean = function( elems, context, fragment, scripts ) {
+               // Set context per 1.8 logic
+               context = context || document;
+               context = !context.nodeType && context[0] || context;
+               context = context.ownerDocument || context;
+
+               migrateWarn("jQuery.clean() is deprecated");
+
+               var i, elem, handleScript, jsTags,
+                       ret = [];
+
+               jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
+
+               // Complex logic lifted directly from jQuery 1.8
+               if ( fragment ) {
+                       // Special handling of each script element
+                       handleScript = function( elem ) {
+                               // Check if we consider it executable
+                               if ( !elem.type || rscriptType.test( elem.type ) ) {
+                                       // Detach the script and store it in the scripts array (if provided) or the fragment
+                                       // Return truthy to indicate that it has been handled
+                                       return scripts ?
+                                               scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+                                               fragment.appendChild( elem );
+                               }
+                       };
+
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               // Check if we're done after handling an executable script
+                               if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+                                       // Append to fragment and handle embedded scripts
+                                       fragment.appendChild( elem );
+                                       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                               // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+                                               jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+                                               // Splice the scripts into ret after their former ancestor and advance our index beyond them
+                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+                                               i += jsTags.length;
+                                       }
+                               }
+                       }
+               }
+
+               return ret;
+       };
+}
+
+var eventAdd = jQuery.event.add,
+       eventRemove = jQuery.event.remove,
+       eventTrigger = jQuery.event.trigger,
+       oldToggle = jQuery.fn.toggle,
+       oldLive = jQuery.fn.live,
+       oldDie = jQuery.fn.die,
+       oldLoad = jQuery.fn.load,
+       ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
+       rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
+       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+       hoverHack = function( events ) {
+               if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
+                       return events;
+               }
+               if ( rhoverHack.test( events ) ) {
+                       migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
+               }
+               return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+       };
+
+// Event props removed in 1.9, put them back if needed; no practical way to warn them
+if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
+       jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
+}
+
+// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
+if ( jQuery.event.dispatch ) {
+       migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
+}
+
+// Support for 'hover' pseudo-event and ajax event warnings
+jQuery.event.add = function( elem, types, handler, data, selector ){
+       if ( elem !== document && rajaxEvent.test( types ) ) {
+               migrateWarn( "AJAX events should be attached to document: " + types );
+       }
+       eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
+};
+jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
+       eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
+};
+
+jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
+
+       jQuery.fn[ name ] = function() {
+               var args = Array.prototype.slice.call( arguments, 0 );
+
+               // If this is an ajax load() the first arg should be the string URL;
+               // technically this could also be the "Anything" arg of the event .load()
+               // which just goes to show why this dumb signature has been deprecated!
+               // jQuery custom builds that exclude the Ajax module justifiably die here.
+               if ( name === "load" && typeof args[ 0 ] === "string" ) {
+                       return oldLoad.apply( this, args );
+               }
+
+               migrateWarn( "jQuery.fn." + name + "() is deprecated" );
+
+               args.splice( 0, 0, name );
+               if ( arguments.length ) {
+                       return this.bind.apply( this, args );
+               }
+
+               // Use .triggerHandler here because:
+               // - load and unload events don't need to bubble, only applied to window or image
+               // - error event should not bubble to window, although it does pre-1.7
+               // See http://bugs.jquery.com/ticket/11820
+               this.triggerHandler.apply( this, args );
+               return this;
+       };
+
+});
+
+jQuery.fn.toggle = function( fn, fn2 ) {
+
+       // Don't mess with animation or css toggles
+       if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
+               return oldToggle.apply( this, arguments );
+       }
+       migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
+
+       // Save reference to arguments for access in closure
+       var args = arguments,
+               guid = fn.guid || jQuery.guid++,
+               i = 0,
+               toggler = function( event ) {
+                       // Figure out which function to execute
+                       var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+                       jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+                       // Make sure that clicks stop
+                       event.preventDefault();
+
+                       // and execute the function
+                       return args[ lastToggle ].apply( this, arguments ) || false;
+               };
+
+       // link all the functions, so any of them can unbind this click handler
+       toggler.guid = guid;
+       while ( i < args.length ) {
+               args[ i++ ].guid = guid;
+       }
+
+       return this.click( toggler );
+};
+
+jQuery.fn.live = function( types, data, fn ) {
+       migrateWarn("jQuery.fn.live() is deprecated");
+       if ( oldLive ) {
+               return oldLive.apply( this, arguments );
+       }
+       jQuery( this.context ).on( types, this.selector, data, fn );
+       return this;
+};
+
+jQuery.fn.die = function( types, fn ) {
+       migrateWarn("jQuery.fn.die() is deprecated");
+       if ( oldDie ) {
+               return oldDie.apply( this, arguments );
+       }
+       jQuery( this.context ).off( types, this.selector || "**", fn );
+       return this;
+};
+
+// Turn global events into document-triggered events
+jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
+       if ( !elem && !rajaxEvent.test( event ) ) {
+               migrateWarn( "Global events are undocumented and deprecated" );
+       }
+       return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
+};
+jQuery.each( ajaxEvents.split("|"),
+       function( _, name ) {
+               jQuery.event.special[ name ] = {
+                       setup: function() {
+                               var elem = this;
+
+                               // The document needs no shimming; must be !== for oldIE
+                               if ( elem !== document ) {
+                                       jQuery.event.add( document, name + "." + jQuery.guid, function() {
+                                               jQuery.event.trigger( name, Array.prototype.slice.call( arguments, 1 ), elem, true );
+                                       });
+                                       jQuery._data( this, name, jQuery.guid++ );
+                               }
+                               return false;
+                       },
+                       teardown: function() {
+                               if ( this !== document ) {
+                                       jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
+                               }
+                               return false;
+                       }
+               };
+       }
+);
+
+jQuery.event.special.ready = {
+       setup: function() {
+               if ( this === document ) {
+                       migrateWarn( "'ready' event is deprecated" );
+               }
+       }
+};
+
+var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack,
+       oldFnFind = jQuery.fn.find;
+
+jQuery.fn.andSelf = function() {
+       migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
+       return oldSelf.apply( this, arguments );
+};
+
+jQuery.fn.find = function( selector ) {
+       var ret = oldFnFind.apply( this, arguments );
+       ret.context = this.context;
+       ret.selector = this.selector ? this.selector + " " + selector : selector;
+       return ret;
+};
+
+
+// jQuery 1.6 did not support Callbacks, do not warn there
+if ( jQuery.Callbacks ) {
+
+       var oldDeferred = jQuery.Deferred,
+               tuples = [
+                       // action, add listener, callbacks, .then handlers, final state
+                       [ "resolve", "done", jQuery.Callbacks("once memory"),
+                               jQuery.Callbacks("once memory"), "resolved" ],
+                       [ "reject", "fail", jQuery.Callbacks("once memory"),
+                               jQuery.Callbacks("once memory"), "rejected" ],
+                       [ "notify", "progress", jQuery.Callbacks("memory"),
+                               jQuery.Callbacks("memory") ]
+               ];
+
+       jQuery.Deferred = function( func ) {
+               var deferred = oldDeferred(),
+                       promise = deferred.promise();
+
+               deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
+                       var fns = arguments;
+
+                       migrateWarn( "deferred.pipe() is deprecated" );
+
+                       return jQuery.Deferred(function( newDefer ) {
+                               jQuery.each( tuples, function( i, tuple ) {
+                                       var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+                                       // deferred.done(function() { bind to newDefer or newDefer.resolve })
+                                       // deferred.fail(function() { bind to newDefer or newDefer.reject })
+                                       // deferred.progress(function() { bind to newDefer or newDefer.notify })
+                                       deferred[ tuple[1] ](function() {
+                                               var returned = fn && fn.apply( this, arguments );
+                                               if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                       returned.promise()
+                                                               .done( newDefer.resolve )
+                                                               .fail( newDefer.reject )
+                                                               .progress( newDefer.notify );
+                                               } else {
+                                                       newDefer[ tuple[ 0 ] + "With" ](
+                                                               this === promise ? newDefer.promise() : this,
+                                                               fn ? [ returned ] : arguments
+                                                       );
+                                               }
+                                       });
+                               });
+                               fns = null;
+                       }).promise();
+
+               };
+
+               deferred.isResolved = function() {
+                       migrateWarn( "deferred.isResolved is deprecated" );
+                       return deferred.state() === "resolved";
+               };
+
+               deferred.isRejected = function() {
+                       migrateWarn( "deferred.isRejected is deprecated" );
+                       return deferred.state() === "rejected";
+               };
+
+               if ( func ) {
+                       func.call( deferred, deferred );
+               }
+
+               return deferred;
+       };
+
+}
+
+})( jQuery, window );
diff --git a/external/jquery-migrate-3.4.1/LICENSE.txt b/external/jquery-migrate-3.4.1/LICENSE.txt
deleted file mode 100644 (file)
index c0f86cb..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-Copyright OpenJS Foundation and other contributors, https://openjsf.org/
-
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery-migrate
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
diff --git a/external/jquery-migrate-3.4.1/jquery-migrate.js b/external/jquery-migrate-3.4.1/jquery-migrate.js
deleted file mode 100644 (file)
index 5ef505e..0000000
+++ /dev/null
@@ -1,1018 +0,0 @@
-/*!
- * jQuery Migrate - v3.4.1 - 2023-02-23T15:31Z
- * Copyright OpenJS Foundation and other contributors
- */
-( function( factory ) {
-       "use strict";
-
-       if ( typeof define === "function" && define.amd ) {
-
-               // AMD. Register as an anonymous module.
-               define( [ "jquery" ], function( jQuery ) {
-                       return factory( jQuery, window );
-               } );
-       } else if ( typeof module === "object" && module.exports ) {
-
-               // Node/CommonJS
-               // eslint-disable-next-line no-undef
-               module.exports = factory( require( "jquery" ), window );
-       } else {
-
-               // Browser globals
-               factory( jQuery, window );
-       }
-} )( function( jQuery, window ) {
-"use strict";
-
-jQuery.migrateVersion = "3.4.1";
-
-// Returns 0 if v1 == v2, -1 if v1 < v2, 1 if v1 > v2
-function compareVersions( v1, v2 ) {
-       var i,
-               rVersionParts = /^(\d+)\.(\d+)\.(\d+)/,
-               v1p = rVersionParts.exec( v1 ) || [ ],
-               v2p = rVersionParts.exec( v2 ) || [ ];
-
-       for ( i = 1; i <= 3; i++ ) {
-               if ( +v1p[ i ] > +v2p[ i ] ) {
-                       return 1;
-               }
-               if ( +v1p[ i ] < +v2p[ i ] ) {
-                       return -1;
-               }
-       }
-       return 0;
-}
-
-function jQueryVersionSince( version ) {
-       return compareVersions( jQuery.fn.jquery, version ) >= 0;
-}
-
-// A map from disabled patch codes to `true`. This should really
-// be a `Set` but those are unsupported in IE.
-var disabledPatches = Object.create( null );
-
-// Don't apply patches for specified codes. Helpful for code bases
-// where some Migrate warnings have been addressed and it's desirable
-// to avoid needless patches or false positives.
-jQuery.migrateDisablePatches = function() {
-       var i;
-       for ( i = 0; i < arguments.length; i++ ) {
-               disabledPatches[ arguments[ i ] ] = true;
-       }
-};
-
-// Allow enabling patches disabled via `jQuery.migrateDisablePatches`.
-// Helpful if you want to disable a patch only for some code that won't
-// be updated soon to be able to focus on other warnings - and enable it
-// immediately after such a call:
-// ```js
-// jQuery.migrateDisablePatches( "workaroundA" );
-// elem.pluginViolatingWarningA( "pluginMethod" );
-// jQuery.migrateEnablePatches( "workaroundA" );
-// ```
-jQuery.migrateEnablePatches = function() {
-       var i;
-       for ( i = 0; i < arguments.length; i++ ) {
-               delete disabledPatches[ arguments[ i ] ];
-       }
-};
-
-jQuery.migrateIsPatchEnabled = function( patchCode ) {
-       return !disabledPatches[ patchCode ];
-};
-
-( function() {
-
-       // Support: IE9 only
-       // IE9 only creates console object when dev tools are first opened
-       // IE9 console is a host object, callable but doesn't have .apply()
-       if ( !window.console || !window.console.log ) {
-               return;
-       }
-
-       // Need jQuery 3.x-4.x and no older Migrate loaded
-       if ( !jQuery || !jQueryVersionSince( "3.0.0" ) ||
-                       jQueryVersionSince( "5.0.0" ) ) {
-               window.console.log( "JQMIGRATE: jQuery 3.x-4.x REQUIRED" );
-       }
-       if ( jQuery.migrateWarnings ) {
-               window.console.log( "JQMIGRATE: Migrate plugin loaded multiple times" );
-       }
-
-       // Show a message on the console so devs know we're active
-       window.console.log( "JQMIGRATE: Migrate is installed" +
-               ( jQuery.migrateMute ? "" : " with logging active" ) +
-               ", version " + jQuery.migrateVersion );
-
-} )();
-
-var warnedAbout = {};
-
-// By default each warning is only reported once.
-jQuery.migrateDeduplicateWarnings = true;
-
-// List of warnings already given; public read only
-jQuery.migrateWarnings = [];
-
-// Set to false to disable traces that appear with warnings
-if ( jQuery.migrateTrace === undefined ) {
-       jQuery.migrateTrace = true;
-}
-
-// Forget any warnings we've already given; public
-jQuery.migrateReset = function() {
-       warnedAbout = {};
-       jQuery.migrateWarnings.length = 0;
-};
-
-function migrateWarn( code, msg ) {
-       var console = window.console;
-       if ( jQuery.migrateIsPatchEnabled( code ) &&
-               ( !jQuery.migrateDeduplicateWarnings || !warnedAbout[ msg ] ) ) {
-               warnedAbout[ msg ] = true;
-               jQuery.migrateWarnings.push( msg + " [" + code + "]" );
-               if ( console && console.warn && !jQuery.migrateMute ) {
-                       console.warn( "JQMIGRATE: " + msg );
-                       if ( jQuery.migrateTrace && console.trace ) {
-                               console.trace();
-                       }
-               }
-       }
-}
-
-function migrateWarnProp( obj, prop, value, code, msg ) {
-       Object.defineProperty( obj, prop, {
-               configurable: true,
-               enumerable: true,
-               get: function() {
-                       migrateWarn( code, msg );
-                       return value;
-               },
-               set: function( newValue ) {
-                       migrateWarn( code, msg );
-                       value = newValue;
-               }
-       } );
-}
-
-function migrateWarnFuncInternal( obj, prop, newFunc, code, msg ) {
-       var finalFunc,
-               origFunc = obj[ prop ];
-
-       obj[ prop ] = function() {
-
-               // If `msg` not provided, do not warn; more sophisticated warnings
-               // logic is most likely embedded in `newFunc`, in that case here
-               // we just care about the logic choosing the proper implementation
-               // based on whether the patch is disabled or not.
-               if ( msg ) {
-                       migrateWarn( code, msg );
-               }
-
-               // Since patches can be disabled & enabled dynamically, we
-               // need to decide which implementation to run on each invocation.
-               finalFunc = jQuery.migrateIsPatchEnabled( code ) ?
-                       newFunc :
-
-                       // The function may not have existed originally so we need a fallback.
-                       ( origFunc || jQuery.noop );
-
-               return finalFunc.apply( this, arguments );
-       };
-}
-
-function migratePatchAndWarnFunc( obj, prop, newFunc, code, msg ) {
-       if ( !msg ) {
-               throw new Error( "No warning message provided" );
-       }
-       return migrateWarnFuncInternal( obj, prop, newFunc, code, msg );
-}
-
-function migratePatchFunc( obj, prop, newFunc, code ) {
-       return migrateWarnFuncInternal( obj, prop, newFunc, code );
-}
-
-if ( window.document.compatMode === "BackCompat" ) {
-
-       // jQuery has never supported or tested Quirks Mode
-       migrateWarn( "quirks", "jQuery is not compatible with Quirks Mode" );
-}
-
-var findProp,
-       class2type = {},
-       oldInit = jQuery.fn.init,
-       oldFind = jQuery.find,
-
-       rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
-       rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
-
-       // Require that the "whitespace run" starts from a non-whitespace
-       // to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
-       rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
-
-migratePatchFunc( jQuery.fn, "init", function( arg1 ) {
-       var args = Array.prototype.slice.call( arguments );
-
-       if ( jQuery.migrateIsPatchEnabled( "selector-empty-id" ) &&
-               typeof arg1 === "string" && arg1 === "#" ) {
-
-               // JQuery( "#" ) is a bogus ID selector, but it returned an empty set
-               // before jQuery 3.0
-               migrateWarn( "selector-empty-id", "jQuery( '#' ) is not a valid selector" );
-               args[ 0 ] = [];
-       }
-
-       return oldInit.apply( this, args );
-}, "selector-empty-id" );
-
-// This is already done in Core but the above patch will lose this assignment
-// so we need to redo it. It doesn't matter whether the patch is enabled or not
-// as the method is always going to be a Migrate-created wrapper.
-jQuery.fn.init.prototype = jQuery.fn;
-
-migratePatchFunc( jQuery, "find", function( selector ) {
-       var args = Array.prototype.slice.call( arguments );
-
-       // Support: PhantomJS 1.x
-       // String#match fails to match when used with a //g RegExp, only on some strings
-       if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
-
-               // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
-               // First see if qS thinks it's a valid selector, if so avoid a false positive
-               try {
-                       window.document.querySelector( selector );
-               } catch ( err1 ) {
-
-                       // Didn't *look* valid to qSA, warn and try quoting what we think is the value
-                       selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) {
-                               return "[" + attr + op + "\"" + value + "\"]";
-                       } );
-
-                       // If the regexp *may* have created an invalid selector, don't update it
-                       // Note that there may be false alarms if selector uses jQuery extensions
-                       try {
-                               window.document.querySelector( selector );
-                               migrateWarn( "selector-hash",
-                                       "Attribute selector with '#' must be quoted: " + args[ 0 ] );
-                               args[ 0 ] = selector;
-                       } catch ( err2 ) {
-                               migrateWarn( "selector-hash",
-                                       "Attribute selector with '#' was not fixed: " + args[ 0 ] );
-                       }
-               }
-       }
-
-       return oldFind.apply( this, args );
-}, "selector-hash" );
-
-// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
-for ( findProp in oldFind ) {
-       if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
-               jQuery.find[ findProp ] = oldFind[ findProp ];
-       }
-}
-
-// The number of elements contained in the matched element set
-migratePatchAndWarnFunc( jQuery.fn, "size", function() {
-       return this.length;
-}, "size",
-"jQuery.fn.size() is deprecated and removed; use the .length property" );
-
-migratePatchAndWarnFunc( jQuery, "parseJSON", function() {
-       return JSON.parse.apply( null, arguments );
-}, "parseJSON",
-"jQuery.parseJSON is deprecated; use JSON.parse" );
-
-migratePatchAndWarnFunc( jQuery, "holdReady", jQuery.holdReady,
-       "holdReady", "jQuery.holdReady is deprecated" );
-
-migratePatchAndWarnFunc( jQuery, "unique", jQuery.uniqueSort,
-       "unique", "jQuery.unique is deprecated; use jQuery.uniqueSort" );
-
-// Now jQuery.expr.pseudos is the standard incantation
-migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos, "expr-pre-pseudos",
-       "jQuery.expr.filters is deprecated; use jQuery.expr.pseudos" );
-migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos, "expr-pre-pseudos",
-       "jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos" );
-
-// Prior to jQuery 3.1.1 there were internal refs so we don't warn there
-if ( jQueryVersionSince( "3.1.1" ) ) {
-       migratePatchAndWarnFunc( jQuery, "trim", function( text ) {
-               return text == null ?
-                       "" :
-                       ( text + "" ).replace( rtrim, "$1" );
-       }, "trim",
-       "jQuery.trim is deprecated; use String.prototype.trim" );
-}
-
-// Prior to jQuery 3.2 there were internal refs so we don't warn there
-if ( jQueryVersionSince( "3.2.0" ) ) {
-       migratePatchAndWarnFunc( jQuery, "nodeName", function( elem, name ) {
-               return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-       }, "nodeName",
-       "jQuery.nodeName is deprecated" );
-
-       migratePatchAndWarnFunc( jQuery, "isArray", Array.isArray, "isArray",
-               "jQuery.isArray is deprecated; use Array.isArray"
-       );
-}
-
-if ( jQueryVersionSince( "3.3.0" ) ) {
-
-       migratePatchAndWarnFunc( jQuery, "isNumeric", function( obj ) {
-
-                       // As of jQuery 3.0, isNumeric is limited to
-                       // strings and numbers (primitives or objects)
-                       // that can be coerced to finite numbers (gh-2662)
-                       var type = typeof obj;
-                       return ( type === "number" || type === "string" ) &&
-
-                               // parseFloat NaNs numeric-cast false positives ("")
-                               // ...but misinterprets leading-number strings, e.g. hex literals ("0x...")
-                               // subtraction forces infinities to NaN
-                               !isNaN( obj - parseFloat( obj ) );
-               }, "isNumeric",
-               "jQuery.isNumeric() is deprecated"
-       );
-
-       // Populate the class2type map
-       jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".
-               split( " " ),
-       function( _, name ) {
-               class2type[ "[object " + name + "]" ] = name.toLowerCase();
-       } );
-
-       migratePatchAndWarnFunc( jQuery, "type", function( obj ) {
-               if ( obj == null ) {
-                       return obj + "";
-               }
-
-               // Support: Android <=2.3 only (functionish RegExp)
-               return typeof obj === "object" || typeof obj === "function" ?
-                       class2type[ Object.prototype.toString.call( obj ) ] || "object" :
-                       typeof obj;
-       }, "type",
-       "jQuery.type is deprecated" );
-
-       migratePatchAndWarnFunc( jQuery, "isFunction",
-               function( obj ) {
-                       return typeof obj === "function";
-               }, "isFunction",
-               "jQuery.isFunction() is deprecated" );
-
-       migratePatchAndWarnFunc( jQuery, "isWindow",
-               function( obj ) {
-                       return obj != null && obj === obj.window;
-               }, "isWindow",
-               "jQuery.isWindow() is deprecated"
-       );
-}
-
-// Support jQuery slim which excludes the ajax module
-if ( jQuery.ajax ) {
-
-var oldAjax = jQuery.ajax,
-       rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-migratePatchFunc( jQuery, "ajax", function() {
-       var jQXHR = oldAjax.apply( this, arguments );
-
-       // Be sure we got a jQXHR (e.g., not sync)
-       if ( jQXHR.promise ) {
-               migratePatchAndWarnFunc( jQXHR, "success", jQXHR.done, "jqXHR-methods",
-                       "jQXHR.success is deprecated and removed" );
-               migratePatchAndWarnFunc( jQXHR, "error", jQXHR.fail, "jqXHR-methods",
-                       "jQXHR.error is deprecated and removed" );
-               migratePatchAndWarnFunc( jQXHR, "complete", jQXHR.always, "jqXHR-methods",
-                       "jQXHR.complete is deprecated and removed" );
-       }
-
-       return jQXHR;
-}, "jqXHR-methods" );
-
-// Only trigger the logic in jQuery <4 as the JSON-to-JSONP auto-promotion
-// behavior is gone in jQuery 4.0 and as it has security implications, we don't
-// want to restore the legacy behavior.
-if ( !jQueryVersionSince( "4.0.0" ) ) {
-
-       // Register this prefilter before the jQuery one. Otherwise, a promoted
-       // request is transformed into one with the script dataType and we can't
-       // catch it anymore.
-       jQuery.ajaxPrefilter( "+json", function( s ) {
-
-               // Warn if JSON-to-JSONP auto-promotion happens.
-               if ( s.jsonp !== false && ( rjsonp.test( s.url ) ||
-                               typeof s.data === "string" &&
-                               ( s.contentType || "" )
-                                       .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
-                               rjsonp.test( s.data )
-               ) ) {
-                       migrateWarn( "jsonp-promotion", "JSON-to-JSONP auto-promotion is deprecated" );
-               }
-       } );
-}
-
-}
-
-var oldRemoveAttr = jQuery.fn.removeAttr,
-       oldToggleClass = jQuery.fn.toggleClass,
-       rmatchNonSpace = /\S+/g;
-
-migratePatchFunc( jQuery.fn, "removeAttr", function( name ) {
-       var self = this,
-               patchNeeded = false;
-
-       jQuery.each( name.match( rmatchNonSpace ), function( _i, attr ) {
-               if ( jQuery.expr.match.bool.test( attr ) ) {
-
-                       // Only warn if at least a single node had the property set to
-                       // something else than `false`. Otherwise, this Migrate patch
-                       // doesn't influence the behavior and there's no need to set or warn.
-                       self.each( function() {
-                               if ( jQuery( this ).prop( attr ) !== false ) {
-                                       patchNeeded = true;
-                                       return false;
-                               }
-                       } );
-               }
-
-               if ( patchNeeded ) {
-                       migrateWarn( "removeAttr-bool",
-                               "jQuery.fn.removeAttr no longer sets boolean properties: " + attr );
-                       self.prop( attr, false );
-               }
-       } );
-
-       return oldRemoveAttr.apply( this, arguments );
-}, "removeAttr-bool" );
-
-migratePatchFunc( jQuery.fn, "toggleClass", function( state ) {
-
-       // Only deprecating no-args or single boolean arg
-       if ( state !== undefined && typeof state !== "boolean" ) {
-
-               return oldToggleClass.apply( this, arguments );
-       }
-
-       migrateWarn( "toggleClass-bool", "jQuery.fn.toggleClass( boolean ) is deprecated" );
-
-       // Toggle entire class name of each element
-       return this.each( function() {
-               var className = this.getAttribute && this.getAttribute( "class" ) || "";
-
-               if ( className ) {
-                       jQuery.data( this, "__className__", className );
-               }
-
-               // If the element has a class name or if we're passed `false`,
-               // then remove the whole classname (if there was one, the above saved it).
-               // Otherwise bring back whatever was previously saved (if anything),
-               // falling back to the empty string if nothing was stored.
-               if ( this.setAttribute ) {
-                       this.setAttribute( "class",
-                               className || state === false ?
-                               "" :
-                               jQuery.data( this, "__className__" ) || ""
-                       );
-               }
-       } );
-}, "toggleClass-bool" );
-
-function camelCase( string ) {
-       return string.replace( /-([a-z])/g, function( _, letter ) {
-               return letter.toUpperCase();
-       } );
-}
-
-var origFnCss, internalCssNumber,
-       internalSwapCall = false,
-       ralphaStart = /^[a-z]/,
-
-       // The regex visualized:
-       //
-       //                         /----------\
-       //                        |            |    /-------\
-       //                        |  / Top  \  |   |         |
-       //         /--- Border ---+-| Right  |-+---+- Width -+---\
-       //        |                 | Bottom |                    |
-       //        |                  \ Left /                     |
-       //        |                                               |
-       //        |                              /----------\     |
-       //        |          /-------------\    |            |    |- END
-       //        |         |               |   |  / Top  \  |    |
-       //        |         |  / Margin  \  |   | | Right  | |    |
-       //        |---------+-|           |-+---+-| Bottom |-+----|
-       //        |            \ Padding /         \ Left /       |
-       // BEGIN -|                                               |
-       //        |                /---------\                    |
-       //        |               |           |                   |
-       //        |               |  / Min \  |    / Width  \     |
-       //         \--------------+-|       |-+---|          |---/
-       //                           \ Max /       \ Height /
-       rautoPx = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/;
-
-// If this version of jQuery has .swap(), don't false-alarm on internal uses
-if ( jQuery.swap ) {
-       jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) {
-               var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get;
-
-               if ( oldHook ) {
-                       jQuery.cssHooks[ name ].get = function() {
-                               var ret;
-
-                               internalSwapCall = true;
-                               ret = oldHook.apply( this, arguments );
-                               internalSwapCall = false;
-                               return ret;
-                       };
-               }
-       } );
-}
-
-migratePatchFunc( jQuery, "swap", function( elem, options, callback, args ) {
-       var ret, name,
-               old = {};
-
-       if ( !internalSwapCall ) {
-               migrateWarn( "swap", "jQuery.swap() is undocumented and deprecated" );
-       }
-
-       // Remember the old values, and insert the new ones
-       for ( name in options ) {
-               old[ name ] = elem.style[ name ];
-               elem.style[ name ] = options[ name ];
-       }
-
-       ret = callback.apply( elem, args || [] );
-
-       // Revert the old values
-       for ( name in options ) {
-               elem.style[ name ] = old[ name ];
-       }
-
-       return ret;
-}, "swap" );
-
-if ( jQueryVersionSince( "3.4.0" ) && typeof Proxy !== "undefined" ) {
-       jQuery.cssProps = new Proxy( jQuery.cssProps || {}, {
-               set: function() {
-                       migrateWarn( "cssProps", "jQuery.cssProps is deprecated" );
-                       return Reflect.set.apply( this, arguments );
-               }
-       } );
-}
-
-// In jQuery >=4 where jQuery.cssNumber is missing fill it with the latest 3.x version:
-// https://github.com/jquery/jquery/blob/3.6.0/src/css.js#L212-L233
-// This way, number values for the CSS properties below won't start triggering
-// Migrate warnings when jQuery gets updated to >=4.0.0 (gh-438).
-if ( jQueryVersionSince( "4.0.0" ) ) {
-
-       // We need to keep this as a local variable as we need it internally
-       // in a `jQuery.fn.css` patch and this usage shouldn't warn.
-       internalCssNumber = {
-               animationIterationCount: true,
-               columnCount: true,
-               fillOpacity: true,
-               flexGrow: true,
-               flexShrink: true,
-               fontWeight: true,
-               gridArea: true,
-               gridColumn: true,
-               gridColumnEnd: true,
-               gridColumnStart: true,
-               gridRow: true,
-               gridRowEnd: true,
-               gridRowStart: true,
-               lineHeight: true,
-               opacity: true,
-               order: true,
-               orphans: true,
-               widows: true,
-               zIndex: true,
-               zoom: true
-       };
-
-       if ( typeof Proxy !== "undefined" ) {
-               jQuery.cssNumber = new Proxy( internalCssNumber, {
-                       get: function() {
-                               migrateWarn( "css-number", "jQuery.cssNumber is deprecated" );
-                               return Reflect.get.apply( this, arguments );
-                       },
-                       set: function() {
-                               migrateWarn( "css-number", "jQuery.cssNumber is deprecated" );
-                               return Reflect.set.apply( this, arguments );
-                       }
-               } );
-       } else {
-
-               // Support: IE 9-11+
-               // IE doesn't support proxies, but we still want to restore the legacy
-               // jQuery.cssNumber there.
-               jQuery.cssNumber = internalCssNumber;
-       }
-} else {
-
-       // Make `internalCssNumber` defined for jQuery <4 as well as it's needed
-       // in the `jQuery.fn.css` patch below.
-       internalCssNumber = jQuery.cssNumber;
-}
-
-function isAutoPx( prop ) {
-
-       // The first test is used to ensure that:
-       // 1. The prop starts with a lowercase letter (as we uppercase it for the second regex).
-       // 2. The prop is not empty.
-       return ralphaStart.test( prop ) &&
-               rautoPx.test( prop[ 0 ].toUpperCase() + prop.slice( 1 ) );
-}
-
-origFnCss = jQuery.fn.css;
-
-migratePatchFunc( jQuery.fn, "css", function( name, value ) {
-       var camelName,
-               origThis = this;
-
-       if ( name && typeof name === "object" && !Array.isArray( name ) ) {
-               jQuery.each( name, function( n, v ) {
-                       jQuery.fn.css.call( origThis, n, v );
-               } );
-               return this;
-       }
-
-       if ( typeof value === "number" ) {
-               camelName = camelCase( name );
-
-               // Use `internalCssNumber` to avoid triggering our warnings in this
-               // internal check.
-               if ( !isAutoPx( camelName ) && !internalCssNumber[ camelName ] ) {
-                       migrateWarn( "css-number",
-                               "Number-typed values are deprecated for jQuery.fn.css( \"" +
-                               name + "\", value )" );
-               }
-       }
-
-       return origFnCss.apply( this, arguments );
-}, "css-number" );
-
-var origData = jQuery.data;
-
-migratePatchFunc( jQuery, "data", function( elem, name, value ) {
-       var curData, sameKeys, key;
-
-       // Name can be an object, and each entry in the object is meant to be set as data
-       if ( name && typeof name === "object" && arguments.length === 2 ) {
-
-               curData = jQuery.hasData( elem ) && origData.call( this, elem );
-               sameKeys = {};
-               for ( key in name ) {
-                       if ( key !== camelCase( key ) ) {
-                               migrateWarn( "data-camelCase",
-                                       "jQuery.data() always sets/gets camelCased names: " + key );
-                               curData[ key ] = name[ key ];
-                       } else {
-                               sameKeys[ key ] = name[ key ];
-                       }
-               }
-
-               origData.call( this, elem, sameKeys );
-
-               return name;
-       }
-
-       // If the name is transformed, look for the un-transformed name in the data object
-       if ( name && typeof name === "string" && name !== camelCase( name ) ) {
-
-               curData = jQuery.hasData( elem ) && origData.call( this, elem );
-               if ( curData && name in curData ) {
-                       migrateWarn( "data-camelCase",
-                               "jQuery.data() always sets/gets camelCased names: " + name );
-                       if ( arguments.length > 2 ) {
-                               curData[ name ] = value;
-                       }
-                       return curData[ name ];
-               }
-       }
-
-       return origData.apply( this, arguments );
-}, "data-camelCase" );
-
-// Support jQuery slim which excludes the effects module
-if ( jQuery.fx ) {
-
-var intervalValue, intervalMsg,
-       oldTweenRun = jQuery.Tween.prototype.run,
-       linearEasing = function( pct ) {
-               return pct;
-       };
-
-migratePatchFunc( jQuery.Tween.prototype, "run", function( ) {
-       if ( jQuery.easing[ this.easing ].length > 1 ) {
-               migrateWarn(
-                       "easing-one-arg",
-                       "'jQuery.easing." + this.easing.toString() + "' should use only one argument"
-               );
-
-               jQuery.easing[ this.easing ] = linearEasing;
-       }
-
-       oldTweenRun.apply( this, arguments );
-}, "easing-one-arg" );
-
-intervalValue = jQuery.fx.interval;
-intervalMsg = "jQuery.fx.interval is deprecated";
-
-// Support: IE9, Android <=4.4
-// Avoid false positives on browsers that lack rAF
-// Don't warn if document is hidden, jQuery uses setTimeout (#292)
-if ( window.requestAnimationFrame ) {
-       Object.defineProperty( jQuery.fx, "interval", {
-               configurable: true,
-               enumerable: true,
-               get: function() {
-                       if ( !window.document.hidden ) {
-                               migrateWarn( "fx-interval", intervalMsg );
-                       }
-
-                       // Only fallback to the default if patch is enabled
-                       if ( !jQuery.migrateIsPatchEnabled( "fx-interval" ) ) {
-                               return intervalValue;
-                       }
-                       return intervalValue === undefined ? 13 : intervalValue;
-               },
-               set: function( newValue ) {
-                       migrateWarn( "fx-interval", intervalMsg );
-                       intervalValue = newValue;
-               }
-       } );
-}
-
-}
-
-var oldLoad = jQuery.fn.load,
-       oldEventAdd = jQuery.event.add,
-       originalFix = jQuery.event.fix;
-
-jQuery.event.props = [];
-jQuery.event.fixHooks = {};
-
-migrateWarnProp( jQuery.event.props, "concat", jQuery.event.props.concat,
-       "event-old-patch",
-       "jQuery.event.props.concat() is deprecated and removed" );
-
-migratePatchFunc( jQuery.event, "fix", function( originalEvent ) {
-       var event,
-               type = originalEvent.type,
-               fixHook = this.fixHooks[ type ],
-               props = jQuery.event.props;
-
-       if ( props.length ) {
-               migrateWarn( "event-old-patch",
-                       "jQuery.event.props are deprecated and removed: " + props.join() );
-               while ( props.length ) {
-                       jQuery.event.addProp( props.pop() );
-               }
-       }
-
-       if ( fixHook && !fixHook._migrated_ ) {
-               fixHook._migrated_ = true;
-               migrateWarn( "event-old-patch",
-                       "jQuery.event.fixHooks are deprecated and removed: " + type );
-               if ( ( props = fixHook.props ) && props.length ) {
-                       while ( props.length ) {
-                               jQuery.event.addProp( props.pop() );
-                       }
-               }
-       }
-
-       event = originalFix.call( this, originalEvent );
-
-       return fixHook && fixHook.filter ?
-               fixHook.filter( event, originalEvent ) :
-               event;
-}, "event-old-patch" );
-
-migratePatchFunc( jQuery.event, "add", function( elem, types ) {
-
-       // This misses the multiple-types case but that seems awfully rare
-       if ( elem === window && types === "load" && window.document.readyState === "complete" ) {
-               migrateWarn( "load-after-event",
-                       "jQuery(window).on('load'...) called after load event occurred" );
-       }
-       return oldEventAdd.apply( this, arguments );
-}, "load-after-event" );
-
-jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
-
-       migratePatchFunc( jQuery.fn, name, function() {
-               var args = Array.prototype.slice.call( arguments, 0 );
-
-               // If this is an ajax load() the first arg should be the string URL;
-               // technically this could also be the "Anything" arg of the event .load()
-               // which just goes to show why this dumb signature has been deprecated!
-               // jQuery custom builds that exclude the Ajax module justifiably die here.
-               if ( name === "load" && typeof args[ 0 ] === "string" ) {
-                       return oldLoad.apply( this, args );
-               }
-
-               migrateWarn( "shorthand-removed-v3",
-                       "jQuery.fn." + name + "() is deprecated" );
-
-               args.splice( 0, 0, name );
-               if ( arguments.length ) {
-                       return this.on.apply( this, args );
-               }
-
-               // Use .triggerHandler here because:
-               // - load and unload events don't need to bubble, only applied to window or image
-               // - error event should not bubble to window, although it does pre-1.7
-               // See http://bugs.jquery.com/ticket/11820
-               this.triggerHandler.apply( this, args );
-               return this;
-       }, "shorthand-removed-v3" );
-
-} );
-
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
-       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-       "change select submit keydown keypress keyup contextmenu" ).split( " " ),
-       function( _i, name ) {
-
-       // Handle event binding
-       migratePatchAndWarnFunc( jQuery.fn, name, function( data, fn ) {
-               return arguments.length > 0 ?
-                       this.on( name, null, data, fn ) :
-                       this.trigger( name );
-               },
-               "shorthand-deprecated-v3",
-               "jQuery.fn." + name + "() event shorthand is deprecated" );
-} );
-
-// Trigger "ready" event only once, on document ready
-jQuery( function() {
-       jQuery( window.document ).triggerHandler( "ready" );
-} );
-
-jQuery.event.special.ready = {
-       setup: function() {
-               if ( this === window.document ) {
-                       migrateWarn( "ready-event", "'ready' event is deprecated" );
-               }
-       }
-};
-
-migratePatchAndWarnFunc( jQuery.fn, "bind", function( types, data, fn ) {
-       return this.on( types, null, data, fn );
-}, "pre-on-methods", "jQuery.fn.bind() is deprecated" );
-migratePatchAndWarnFunc( jQuery.fn, "unbind", function( types, fn ) {
-       return this.off( types, null, fn );
-}, "pre-on-methods", "jQuery.fn.unbind() is deprecated" );
-migratePatchAndWarnFunc( jQuery.fn, "delegate", function( selector, types, data, fn ) {
-       return this.on( types, selector, data, fn );
-}, "pre-on-methods", "jQuery.fn.delegate() is deprecated" );
-migratePatchAndWarnFunc( jQuery.fn, "undelegate", function( selector, types, fn ) {
-       return arguments.length === 1 ?
-               this.off( selector, "**" ) :
-               this.off( types, selector || "**", fn );
-}, "pre-on-methods", "jQuery.fn.undelegate() is deprecated" );
-migratePatchAndWarnFunc( jQuery.fn, "hover", function( fnOver, fnOut ) {
-       return this.on( "mouseenter", fnOver ).on( "mouseleave", fnOut || fnOver );
-}, "pre-on-methods", "jQuery.fn.hover() is deprecated" );
-
-var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
-       makeMarkup = function( html ) {
-               var doc = window.document.implementation.createHTMLDocument( "" );
-               doc.body.innerHTML = html;
-               return doc.body && doc.body.innerHTML;
-       },
-       warnIfChanged = function( html ) {
-               var changed = html.replace( rxhtmlTag, "<$1></$2>" );
-               if ( changed !== html && makeMarkup( html ) !== makeMarkup( changed ) ) {
-                       migrateWarn( "self-closed-tags",
-                               "HTML tags must be properly nested and closed: " + html );
-               }
-       };
-
-/**
- * Deprecated, please use `jQuery.migrateDisablePatches( "self-closed-tags" )` instead.
- * @deprecated
- */
-jQuery.UNSAFE_restoreLegacyHtmlPrefilter = function() {
-       jQuery.migrateEnablePatches( "self-closed-tags" );
-};
-
-migratePatchFunc( jQuery, "htmlPrefilter", function( html ) {
-       warnIfChanged( html );
-       return html.replace( rxhtmlTag, "<$1></$2>" );
-}, "self-closed-tags" );
-
-// This patch needs to be disabled by default as it re-introduces
-// security issues (CVE-2020-11022, CVE-2020-11023).
-jQuery.migrateDisablePatches( "self-closed-tags" );
-
-var origOffset = jQuery.fn.offset;
-
-migratePatchFunc( jQuery.fn, "offset", function() {
-       var elem = this[ 0 ];
-
-       if ( elem && ( !elem.nodeType || !elem.getBoundingClientRect ) ) {
-               migrateWarn( "offset-valid-elem", "jQuery.fn.offset() requires a valid DOM element" );
-               return arguments.length ? this : undefined;
-       }
-
-       return origOffset.apply( this, arguments );
-}, "offset-valid-elem" );
-
-// Support jQuery slim which excludes the ajax module
-// The jQuery.param patch is about respecting `jQuery.ajaxSettings.traditional`
-// so it doesn't make sense for the slim build.
-if ( jQuery.ajax ) {
-
-var origParam = jQuery.param;
-
-migratePatchFunc( jQuery, "param", function( data, traditional ) {
-       var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
-
-       if ( traditional === undefined && ajaxTraditional ) {
-
-               migrateWarn( "param-ajax-traditional",
-                       "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" );
-               traditional = ajaxTraditional;
-       }
-
-       return origParam.call( this, data, traditional );
-}, "param-ajax-traditional" );
-
-}
-
-migratePatchAndWarnFunc( jQuery.fn, "andSelf", jQuery.fn.addBack, "andSelf",
-       "jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()" );
-
-// Support jQuery slim which excludes the deferred module in jQuery 4.0+
-if ( jQuery.Deferred ) {
-
-var oldDeferred = jQuery.Deferred,
-       tuples = [
-
-               // Action, add listener, callbacks, .then handlers, final state
-               [ "resolve", "done", jQuery.Callbacks( "once memory" ),
-                       jQuery.Callbacks( "once memory" ), "resolved" ],
-               [ "reject", "fail", jQuery.Callbacks( "once memory" ),
-                       jQuery.Callbacks( "once memory" ), "rejected" ],
-               [ "notify", "progress", jQuery.Callbacks( "memory" ),
-                       jQuery.Callbacks( "memory" ) ]
-       ];
-
-migratePatchFunc( jQuery, "Deferred", function( func ) {
-       var deferred = oldDeferred(),
-               promise = deferred.promise();
-
-       function newDeferredPipe( /* fnDone, fnFail, fnProgress */ ) {
-               var fns = arguments;
-
-               return jQuery.Deferred( function( newDefer ) {
-                       jQuery.each( tuples, function( i, tuple ) {
-                               var fn = typeof fns[ i ] === "function" && fns[ i ];
-
-                               // Deferred.done(function() { bind to newDefer or newDefer.resolve })
-                               // deferred.fail(function() { bind to newDefer or newDefer.reject })
-                               // deferred.progress(function() { bind to newDefer or newDefer.notify })
-                               deferred[ tuple[ 1 ] ]( function() {
-                                       var returned = fn && fn.apply( this, arguments );
-                                       if ( returned && typeof returned.promise === "function" ) {
-                                               returned.promise()
-                                                       .done( newDefer.resolve )
-                                                       .fail( newDefer.reject )
-                                                       .progress( newDefer.notify );
-                                       } else {
-                                               newDefer[ tuple[ 0 ] + "With" ](
-                                                       this === promise ? newDefer.promise() : this,
-                                                       fn ? [ returned ] : arguments
-                                               );
-                                       }
-                               } );
-                       } );
-                       fns = null;
-               } ).promise();
-       }
-
-       migratePatchAndWarnFunc( deferred, "pipe", newDeferredPipe, "deferred-pipe",
-               "deferred.pipe() is deprecated" );
-       migratePatchAndWarnFunc( promise, "pipe", newDeferredPipe, "deferred-pipe",
-               "deferred.pipe() is deprecated" );
-
-       if ( func ) {
-               func.call( deferred, deferred );
-       }
-
-       return deferred;
-}, "deferred-pipe" );
-
-// Preserve handler of uncaught exceptions in promise chains
-jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook;
-
-}
-
-return jQuery;
-} );
diff --git a/external/jquery-migrate-3.x/LICENSE.txt b/external/jquery-migrate-3.x/LICENSE.txt
new file mode 100644 (file)
index 0000000..c0f86cb
--- /dev/null
@@ -0,0 +1,36 @@
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/jquery-migrate
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
diff --git a/external/jquery-migrate-3.x/jquery-migrate.js b/external/jquery-migrate-3.x/jquery-migrate.js
new file mode 100644 (file)
index 0000000..edc32de
--- /dev/null
@@ -0,0 +1,1031 @@
+/*!
+ * jQuery Migrate - v3.5.2 - 2024-07-17T22:31Z
+ * Copyright OpenJS Foundation and other contributors
+ */
+( function( factory ) {
+       "use strict";
+
+       if ( typeof define === "function" && define.amd ) {
+
+               // AMD. Register as an anonymous module.
+               define( [ "jquery" ], function( jQuery ) {
+                       return factory( jQuery, window );
+               } );
+       } else if ( typeof module === "object" && module.exports ) {
+
+               // Node/CommonJS
+               // eslint-disable-next-line no-undef
+               module.exports = factory( require( "jquery" ), window );
+       } else {
+
+               // Browser globals
+               factory( jQuery, window );
+       }
+} )( function( jQuery, window ) {
+"use strict";
+
+jQuery.migrateVersion = "3.5.2";
+
+// Returns 0 if v1 == v2, -1 if v1 < v2, 1 if v1 > v2
+function compareVersions( v1, v2 ) {
+       var i,
+               rVersionParts = /^(\d+)\.(\d+)\.(\d+)/,
+               v1p = rVersionParts.exec( v1 ) || [ ],
+               v2p = rVersionParts.exec( v2 ) || [ ];
+
+       for ( i = 1; i <= 3; i++ ) {
+               if ( +v1p[ i ] > +v2p[ i ] ) {
+                       return 1;
+               }
+               if ( +v1p[ i ] < +v2p[ i ] ) {
+                       return -1;
+               }
+       }
+       return 0;
+}
+
+function jQueryVersionSince( version ) {
+       return compareVersions( jQuery.fn.jquery, version ) >= 0;
+}
+
+// A map from disabled patch codes to `true`. This should really
+// be a `Set` but those are unsupported in IE.
+var disabledPatches = Object.create( null );
+
+// Don't apply patches for specified codes. Helpful for code bases
+// where some Migrate warnings have been addressed and it's desirable
+// to avoid needless patches or false positives.
+jQuery.migrateDisablePatches = function() {
+       var i;
+       for ( i = 0; i < arguments.length; i++ ) {
+               disabledPatches[ arguments[ i ] ] = true;
+       }
+};
+
+// Allow enabling patches disabled via `jQuery.migrateDisablePatches`.
+// Helpful if you want to disable a patch only for some code that won't
+// be updated soon to be able to focus on other warnings - and enable it
+// immediately after such a call:
+// ```js
+// jQuery.migrateDisablePatches( "workaroundA" );
+// elem.pluginViolatingWarningA( "pluginMethod" );
+// jQuery.migrateEnablePatches( "workaroundA" );
+// ```
+jQuery.migrateEnablePatches = function() {
+       var i;
+       for ( i = 0; i < arguments.length; i++ ) {
+               delete disabledPatches[ arguments[ i ] ];
+       }
+};
+
+jQuery.migrateIsPatchEnabled = function( patchCode ) {
+       return !disabledPatches[ patchCode ];
+};
+
+( function() {
+
+// Support: IE9 only
+// IE9 only creates console object when dev tools are first opened
+// IE9 console is a host object, callable but doesn't have .apply()
+if ( !window.console || !window.console.log ) {
+       return;
+}
+
+// Need jQuery 3.x-4.x and no older Migrate loaded
+if ( !jQuery || !jQueryVersionSince( "3.0.0" ) ||
+               jQueryVersionSince( "5.0.0" ) ) {
+       window.console.log( "JQMIGRATE: jQuery 3.x-4.x REQUIRED" );
+}
+if ( jQuery.migrateWarnings ) {
+       window.console.log( "JQMIGRATE: Migrate plugin loaded multiple times" );
+}
+
+// Show a message on the console so devs know we're active
+window.console.log( "JQMIGRATE: Migrate is installed" +
+       ( jQuery.migrateMute ? "" : " with logging active" ) +
+       ", version " + jQuery.migrateVersion );
+
+} )();
+
+var warnedAbout = {};
+
+// By default each warning is only reported once.
+jQuery.migrateDeduplicateWarnings = true;
+
+// List of warnings already given; public read only
+jQuery.migrateWarnings = [];
+
+// Set to false to disable traces that appear with warnings
+if ( jQuery.migrateTrace === undefined ) {
+       jQuery.migrateTrace = true;
+}
+
+// Forget any warnings we've already given; public
+jQuery.migrateReset = function() {
+       warnedAbout = {};
+       jQuery.migrateWarnings.length = 0;
+};
+
+function migrateWarn( code, msg ) {
+       var console = window.console;
+       if ( jQuery.migrateIsPatchEnabled( code ) &&
+               ( !jQuery.migrateDeduplicateWarnings || !warnedAbout[ msg ] ) ) {
+               warnedAbout[ msg ] = true;
+               jQuery.migrateWarnings.push( msg + " [" + code + "]" );
+               if ( console && console.warn && !jQuery.migrateMute ) {
+                       console.warn( "JQMIGRATE: " + msg );
+                       if ( jQuery.migrateTrace && console.trace ) {
+                               console.trace();
+                       }
+               }
+       }
+}
+
+function migrateWarnProp( obj, prop, value, code, msg ) {
+       Object.defineProperty( obj, prop, {
+               configurable: true,
+               enumerable: true,
+               get: function() {
+                       migrateWarn( code, msg );
+                       return value;
+               },
+               set: function( newValue ) {
+                       migrateWarn( code, msg );
+                       value = newValue;
+               }
+       } );
+}
+
+function migrateWarnFuncInternal( obj, prop, newFunc, code, msg ) {
+       var finalFunc,
+               origFunc = obj[ prop ];
+
+       obj[ prop ] = function() {
+
+               // If `msg` not provided, do not warn; more sophisticated warnings
+               // logic is most likely embedded in `newFunc`, in that case here
+               // we just care about the logic choosing the proper implementation
+               // based on whether the patch is disabled or not.
+               if ( msg ) {
+                       migrateWarn( code, msg );
+               }
+
+               // Since patches can be disabled & enabled dynamically, we
+               // need to decide which implementation to run on each invocation.
+               finalFunc = jQuery.migrateIsPatchEnabled( code ) ?
+                       newFunc :
+
+                       // The function may not have existed originally so we need a fallback.
+                       ( origFunc || jQuery.noop );
+
+               return finalFunc.apply( this, arguments );
+       };
+}
+
+function migratePatchAndWarnFunc( obj, prop, newFunc, code, msg ) {
+       if ( !msg ) {
+               throw new Error( "No warning message provided" );
+       }
+       return migrateWarnFuncInternal( obj, prop, newFunc, code, msg );
+}
+
+function migratePatchFunc( obj, prop, newFunc, code ) {
+       return migrateWarnFuncInternal( obj, prop, newFunc, code );
+}
+
+if ( window.document.compatMode === "BackCompat" ) {
+
+       // jQuery has never supported or tested Quirks Mode
+       migrateWarn( "quirks", "jQuery is not compatible with Quirks Mode" );
+}
+
+var findProp,
+       class2type = {},
+       oldInit = jQuery.fn.init,
+       oldFind = jQuery.find,
+
+       rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
+       rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
+
+       // Require that the "whitespace run" starts from a non-whitespace
+       // to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
+       rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
+
+migratePatchFunc( jQuery.fn, "init", function( arg1 ) {
+       var args = Array.prototype.slice.call( arguments );
+
+       if ( jQuery.migrateIsPatchEnabled( "selector-empty-id" ) &&
+               typeof arg1 === "string" && arg1 === "#" ) {
+
+               // JQuery( "#" ) is a bogus ID selector, but it returned an empty set
+               // before jQuery 3.0
+               migrateWarn( "selector-empty-id", "jQuery( '#' ) is not a valid selector" );
+               args[ 0 ] = [];
+       }
+
+       return oldInit.apply( this, args );
+}, "selector-empty-id" );
+
+// This is already done in Core but the above patch will lose this assignment
+// so we need to redo it. It doesn't matter whether the patch is enabled or not
+// as the method is always going to be a Migrate-created wrapper.
+jQuery.fn.init.prototype = jQuery.fn;
+
+migratePatchFunc( jQuery, "find", function( selector ) {
+       var args = Array.prototype.slice.call( arguments );
+
+       // Support: PhantomJS 1.x
+       // String#match fails to match when used with a //g RegExp, only on some strings
+       if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
+
+               // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
+               // First see if qS thinks it's a valid selector, if so avoid a false positive
+               try {
+                       window.document.querySelector( selector );
+               } catch ( err1 ) {
+
+                       // Didn't *look* valid to qSA, warn and try quoting what we think is the value
+                       selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) {
+                               return "[" + attr + op + "\"" + value + "\"]";
+                       } );
+
+                       // If the regexp *may* have created an invalid selector, don't update it
+                       // Note that there may be false alarms if selector uses jQuery extensions
+                       try {
+                               window.document.querySelector( selector );
+                               migrateWarn( "selector-hash",
+                                       "Attribute selector with '#' must be quoted: " + args[ 0 ] );
+                               args[ 0 ] = selector;
+                       } catch ( err2 ) {
+                               migrateWarn( "selector-hash",
+                                       "Attribute selector with '#' was not fixed: " + args[ 0 ] );
+                       }
+               }
+       }
+
+       return oldFind.apply( this, args );
+}, "selector-hash" );
+
+// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
+for ( findProp in oldFind ) {
+       if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
+               jQuery.find[ findProp ] = oldFind[ findProp ];
+       }
+}
+
+// The number of elements contained in the matched element set
+migratePatchAndWarnFunc( jQuery.fn, "size", function() {
+       return this.length;
+}, "size",
+"jQuery.fn.size() is deprecated and removed; use the .length property" );
+
+migratePatchAndWarnFunc( jQuery, "parseJSON", function() {
+       return JSON.parse.apply( null, arguments );
+}, "parseJSON",
+"jQuery.parseJSON is deprecated; use JSON.parse" );
+
+migratePatchAndWarnFunc( jQuery, "holdReady", jQuery.holdReady,
+       "holdReady", "jQuery.holdReady is deprecated" );
+
+migratePatchAndWarnFunc( jQuery, "unique", jQuery.uniqueSort,
+       "unique", "jQuery.unique is deprecated; use jQuery.uniqueSort" );
+
+// Now jQuery.expr.pseudos is the standard incantation
+migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos, "expr-pre-pseudos",
+       "jQuery.expr.filters is deprecated; use jQuery.expr.pseudos" );
+migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos, "expr-pre-pseudos",
+       "jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos" );
+
+// Prior to jQuery 3.1.1 there were internal refs so we don't warn there
+if ( jQueryVersionSince( "3.1.1" ) ) {
+       migratePatchAndWarnFunc( jQuery, "trim", function( text ) {
+               return text == null ?
+                       "" :
+                       ( text + "" ).replace( rtrim, "$1" );
+       }, "trim",
+       "jQuery.trim is deprecated; use String.prototype.trim" );
+}
+
+// Prior to jQuery 3.2 there were internal refs so we don't warn there
+if ( jQueryVersionSince( "3.2.0" ) ) {
+       migratePatchAndWarnFunc( jQuery, "nodeName", function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+       }, "nodeName",
+       "jQuery.nodeName is deprecated" );
+
+       migratePatchAndWarnFunc( jQuery, "isArray", Array.isArray, "isArray",
+               "jQuery.isArray is deprecated; use Array.isArray"
+       );
+}
+
+if ( jQueryVersionSince( "3.3.0" ) ) {
+
+       migratePatchAndWarnFunc( jQuery, "isNumeric",
+               function( obj ) {
+
+                       // As of jQuery 3.0, isNumeric is limited to
+                       // strings and numbers (primitives or objects)
+                       // that can be coerced to finite numbers (gh-2662)
+                       var type = typeof obj;
+                       return ( type === "number" || type === "string" ) &&
+
+                               // parseFloat NaNs numeric-cast false positives ("")
+                               // ...but misinterprets leading-number strings, e.g. hex literals ("0x...")
+                               // subtraction forces infinities to NaN
+                               !isNaN( obj - parseFloat( obj ) );
+               }, "isNumeric",
+               "jQuery.isNumeric() is deprecated"
+       );
+
+       // Populate the class2type map
+       jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".
+               split( " " ),
+       function( _, name ) {
+               class2type[ "[object " + name + "]" ] = name.toLowerCase();
+       } );
+
+       migratePatchAndWarnFunc( jQuery, "type", function( obj ) {
+               if ( obj == null ) {
+                       return obj + "";
+               }
+
+               // Support: Android <=2.3 only (functionish RegExp)
+               return typeof obj === "object" || typeof obj === "function" ?
+                       class2type[ Object.prototype.toString.call( obj ) ] || "object" :
+                       typeof obj;
+       }, "type",
+       "jQuery.type is deprecated" );
+
+       migratePatchAndWarnFunc( jQuery, "isFunction",
+               function( obj ) {
+                       return typeof obj === "function";
+               }, "isFunction",
+               "jQuery.isFunction() is deprecated" );
+
+       migratePatchAndWarnFunc( jQuery, "isWindow",
+               function( obj ) {
+                       return obj != null && obj === obj.window;
+               }, "isWindow",
+               "jQuery.isWindow() is deprecated"
+       );
+}
+
+// Support jQuery slim which excludes the ajax module
+if ( jQuery.ajax ) {
+
+var oldAjax = jQuery.ajax,
+       rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+migratePatchFunc( jQuery, "ajax", function() {
+       var jQXHR = oldAjax.apply( this, arguments );
+
+       // Be sure we got a jQXHR (e.g., not sync)
+       if ( jQXHR.promise ) {
+               migratePatchAndWarnFunc( jQXHR, "success", jQXHR.done, "jqXHR-methods",
+                       "jQXHR.success is deprecated and removed" );
+               migratePatchAndWarnFunc( jQXHR, "error", jQXHR.fail, "jqXHR-methods",
+                       "jQXHR.error is deprecated and removed" );
+               migratePatchAndWarnFunc( jQXHR, "complete", jQXHR.always, "jqXHR-methods",
+                       "jQXHR.complete is deprecated and removed" );
+       }
+
+       return jQXHR;
+}, "jqXHR-methods" );
+
+// Only trigger the logic in jQuery <4 as the JSON-to-JSONP auto-promotion
+// behavior is gone in jQuery 4.0 and as it has security implications, we don't
+// want to restore the legacy behavior.
+if ( !jQueryVersionSince( "4.0.0" ) ) {
+
+       // Register this prefilter before the jQuery one. Otherwise, a promoted
+       // request is transformed into one with the script dataType and we can't
+       // catch it anymore.
+       jQuery.ajaxPrefilter( "+json", function( s ) {
+
+               // Warn if JSON-to-JSONP auto-promotion happens.
+               if ( s.jsonp !== false && ( rjsonp.test( s.url ) ||
+                               typeof s.data === "string" &&
+                               ( s.contentType || "" )
+                                       .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
+                               rjsonp.test( s.data )
+               ) ) {
+                       migrateWarn( "jsonp-promotion", "JSON-to-JSONP auto-promotion is deprecated" );
+               }
+       } );
+}
+
+}
+
+var oldRemoveAttr = jQuery.fn.removeAttr,
+       oldToggleClass = jQuery.fn.toggleClass,
+       rbooleans = /^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$/i,
+       rmatchNonSpace = /\S+/g;
+
+migratePatchFunc( jQuery.fn, "removeAttr", function( name ) {
+       var self = this,
+               patchNeeded = false;
+
+       jQuery.each( name.match( rmatchNonSpace ), function( _i, attr ) {
+               if ( rbooleans.test( attr ) ) {
+
+                       // Only warn if at least a single node had the property set to
+                       // something else than `false`. Otherwise, this Migrate patch
+                       // doesn't influence the behavior and there's no need to set or warn.
+                       self.each( function() {
+                               if ( jQuery( this ).prop( attr ) !== false ) {
+                                       patchNeeded = true;
+                                       return false;
+                               }
+                       } );
+               }
+
+               if ( patchNeeded ) {
+                       migrateWarn( "removeAttr-bool",
+                               "jQuery.fn.removeAttr no longer sets boolean properties: " + attr );
+                       self.prop( attr, false );
+               }
+       } );
+
+       return oldRemoveAttr.apply( this, arguments );
+}, "removeAttr-bool" );
+
+migratePatchFunc( jQuery.fn, "toggleClass", function( state ) {
+
+       // Only deprecating no-args or single boolean arg
+       if ( state !== undefined && typeof state !== "boolean" ) {
+
+               return oldToggleClass.apply( this, arguments );
+       }
+
+       migrateWarn( "toggleClass-bool", "jQuery.fn.toggleClass( boolean ) is deprecated" );
+
+       // Toggle entire class name of each element
+       return this.each( function() {
+               var className = this.getAttribute && this.getAttribute( "class" ) || "";
+
+               if ( className ) {
+                       jQuery.data( this, "__className__", className );
+               }
+
+               // If the element has a class name or if we're passed `false`,
+               // then remove the whole classname (if there was one, the above saved it).
+               // Otherwise bring back whatever was previously saved (if anything),
+               // falling back to the empty string if nothing was stored.
+               if ( this.setAttribute ) {
+                       this.setAttribute( "class",
+                               className || state === false ?
+                                       "" :
+                                       jQuery.data( this, "__className__" ) || ""
+                       );
+               }
+       } );
+}, "toggleClass-bool" );
+
+function camelCase( string ) {
+       return string.replace( /-([a-z])/g, function( _, letter ) {
+               return letter.toUpperCase();
+       } );
+}
+
+var origFnCss, internalCssNumber,
+       internalSwapCall = false,
+       ralphaStart = /^[a-z]/,
+
+       // The regex visualized:
+       //
+       //                         /----------\
+       //                        |            |    /-------\
+       //                        |  / Top  \  |   |         |
+       //         /--- Border ---+-| Right  |-+---+- Width -+---\
+       //        |                 | Bottom |                    |
+       //        |                  \ Left /                     |
+       //        |                                               |
+       //        |                              /----------\     |
+       //        |          /-------------\    |            |    |- END
+       //        |         |               |   |  / Top  \  |    |
+       //        |         |  / Margin  \  |   | | Right  | |    |
+       //        |---------+-|           |-+---+-| Bottom |-+----|
+       //        |            \ Padding /         \ Left /       |
+       // BEGIN -|                                               |
+       //        |                /---------\                    |
+       //        |               |           |                   |
+       //        |               |  / Min \  |    / Width  \     |
+       //         \--------------+-|       |-+---|          |---/
+       //                           \ Max /       \ Height /
+       rautoPx = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/;
+
+// If this version of jQuery has .swap(), don't false-alarm on internal uses
+if ( jQuery.swap ) {
+       jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) {
+               var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get;
+
+               if ( oldHook ) {
+                       jQuery.cssHooks[ name ].get = function() {
+                               var ret;
+
+                               internalSwapCall = true;
+                               ret = oldHook.apply( this, arguments );
+                               internalSwapCall = false;
+                               return ret;
+                       };
+               }
+       } );
+}
+
+migratePatchFunc( jQuery, "swap", function( elem, options, callback, args ) {
+       var ret, name,
+               old = {};
+
+       if ( !internalSwapCall ) {
+               migrateWarn( "swap", "jQuery.swap() is undocumented and deprecated" );
+       }
+
+       // Remember the old values, and insert the new ones
+       for ( name in options ) {
+               old[ name ] = elem.style[ name ];
+               elem.style[ name ] = options[ name ];
+       }
+
+       ret = callback.apply( elem, args || [] );
+
+       // Revert the old values
+       for ( name in options ) {
+               elem.style[ name ] = old[ name ];
+       }
+
+       return ret;
+}, "swap" );
+
+if ( jQueryVersionSince( "3.4.0" ) && typeof Proxy !== "undefined" ) {
+       jQuery.cssProps = new Proxy( jQuery.cssProps || {}, {
+               set: function() {
+                       migrateWarn( "cssProps", "jQuery.cssProps is deprecated" );
+                       return Reflect.set.apply( this, arguments );
+               }
+       } );
+}
+
+// In jQuery >=4 where jQuery.cssNumber is missing fill it with the latest 3.x version:
+// https://github.com/jquery/jquery/blob/3.7.1/src/css.js#L216-L246
+// This way, number values for the CSS properties below won't start triggering
+// Migrate warnings when jQuery gets updated to >=4.0.0 (gh-438).
+if ( jQueryVersionSince( "4.0.0" ) ) {
+
+       // We need to keep this as a local variable as we need it internally
+       // in a `jQuery.fn.css` patch and this usage shouldn't warn.
+       internalCssNumber = {
+               animationIterationCount: true,
+               aspectRatio: true,
+               borderImageSlice: true,
+               columnCount: true,
+               flexGrow: true,
+               flexShrink: true,
+               fontWeight: true,
+               gridArea: true,
+               gridColumn: true,
+               gridColumnEnd: true,
+               gridColumnStart: true,
+               gridRow: true,
+               gridRowEnd: true,
+               gridRowStart: true,
+               lineHeight: true,
+               opacity: true,
+               order: true,
+               orphans: true,
+               scale: true,
+               widows: true,
+               zIndex: true,
+               zoom: true,
+
+               // SVG-related
+               fillOpacity: true,
+               floodOpacity: true,
+               stopOpacity: true,
+               strokeMiterlimit: true,
+               strokeOpacity: true
+       };
+
+       if ( typeof Proxy !== "undefined" ) {
+               jQuery.cssNumber = new Proxy( internalCssNumber, {
+                       get: function() {
+                               migrateWarn( "css-number", "jQuery.cssNumber is deprecated" );
+                               return Reflect.get.apply( this, arguments );
+                       },
+                       set: function() {
+                               migrateWarn( "css-number", "jQuery.cssNumber is deprecated" );
+                               return Reflect.set.apply( this, arguments );
+                       }
+               } );
+       } else {
+
+               // Support: IE 9-11+
+               // IE doesn't support proxies, but we still want to restore the legacy
+               // jQuery.cssNumber there.
+               jQuery.cssNumber = internalCssNumber;
+       }
+} else {
+
+       // Make `internalCssNumber` defined for jQuery <4 as well as it's needed
+       // in the `jQuery.fn.css` patch below.
+       internalCssNumber = jQuery.cssNumber;
+}
+
+function isAutoPx( prop ) {
+
+       // The first test is used to ensure that:
+       // 1. The prop starts with a lowercase letter (as we uppercase it for the second regex).
+       // 2. The prop is not empty.
+       return ralphaStart.test( prop ) &&
+               rautoPx.test( prop[ 0 ].toUpperCase() + prop.slice( 1 ) );
+}
+
+origFnCss = jQuery.fn.css;
+
+migratePatchFunc( jQuery.fn, "css", function( name, value ) {
+       var camelName,
+               origThis = this;
+
+       if ( name && typeof name === "object" && !Array.isArray( name ) ) {
+               jQuery.each( name, function( n, v ) {
+                       jQuery.fn.css.call( origThis, n, v );
+               } );
+               return this;
+       }
+
+       if ( typeof value === "number" ) {
+               camelName = camelCase( name );
+
+               // Use `internalCssNumber` to avoid triggering our warnings in this
+               // internal check.
+               if ( !isAutoPx( camelName ) && !internalCssNumber[ camelName ] ) {
+                       migrateWarn( "css-number",
+                               "Number-typed values are deprecated for jQuery.fn.css( \"" +
+                               name + "\", value )" );
+               }
+       }
+
+       return origFnCss.apply( this, arguments );
+}, "css-number" );
+
+var origData = jQuery.data;
+
+migratePatchFunc( jQuery, "data", function( elem, name, value ) {
+       var curData, sameKeys, key;
+
+       // Name can be an object, and each entry in the object is meant to be set as data
+       if ( name && typeof name === "object" && arguments.length === 2 ) {
+
+               curData = jQuery.hasData( elem ) && origData.call( this, elem );
+               sameKeys = {};
+               for ( key in name ) {
+                       if ( key !== camelCase( key ) ) {
+                               migrateWarn( "data-camelCase",
+                                       "jQuery.data() always sets/gets camelCased names: " + key );
+                               curData[ key ] = name[ key ];
+                       } else {
+                               sameKeys[ key ] = name[ key ];
+                       }
+               }
+
+               origData.call( this, elem, sameKeys );
+
+               return name;
+       }
+
+       // If the name is transformed, look for the un-transformed name in the data object
+       if ( name && typeof name === "string" && name !== camelCase( name ) ) {
+
+               curData = jQuery.hasData( elem ) && origData.call( this, elem );
+               if ( curData && name in curData ) {
+                       migrateWarn( "data-camelCase",
+                               "jQuery.data() always sets/gets camelCased names: " + name );
+                       if ( arguments.length > 2 ) {
+                               curData[ name ] = value;
+                       }
+                       return curData[ name ];
+               }
+       }
+
+       return origData.apply( this, arguments );
+}, "data-camelCase" );
+
+// Support jQuery slim which excludes the effects module
+if ( jQuery.fx ) {
+
+var intervalValue, intervalMsg,
+       oldTweenRun = jQuery.Tween.prototype.run,
+       linearEasing = function( pct ) {
+               return pct;
+       };
+
+migratePatchFunc( jQuery.Tween.prototype, "run", function( ) {
+       if ( jQuery.easing[ this.easing ].length > 1 ) {
+               migrateWarn(
+                       "easing-one-arg",
+                       "'jQuery.easing." + this.easing.toString() + "' should use only one argument"
+               );
+
+               jQuery.easing[ this.easing ] = linearEasing;
+       }
+
+       oldTweenRun.apply( this, arguments );
+}, "easing-one-arg" );
+
+intervalValue = jQuery.fx.interval;
+intervalMsg = "jQuery.fx.interval is deprecated";
+
+// Support: IE9, Android <=4.4
+// Avoid false positives on browsers that lack rAF
+// Don't warn if document is hidden, jQuery uses setTimeout (#292)
+if ( window.requestAnimationFrame ) {
+       Object.defineProperty( jQuery.fx, "interval", {
+               configurable: true,
+               enumerable: true,
+               get: function() {
+                       if ( !window.document.hidden ) {
+                               migrateWarn( "fx-interval", intervalMsg );
+                       }
+
+                       // Only fallback to the default if patch is enabled
+                       if ( !jQuery.migrateIsPatchEnabled( "fx-interval" ) ) {
+                               return intervalValue;
+                       }
+                       return intervalValue === undefined ? 13 : intervalValue;
+               },
+               set: function( newValue ) {
+                       migrateWarn( "fx-interval", intervalMsg );
+                       intervalValue = newValue;
+               }
+       } );
+}
+
+}
+
+var oldLoad = jQuery.fn.load,
+       oldEventAdd = jQuery.event.add,
+       originalFix = jQuery.event.fix;
+
+jQuery.event.props = [];
+jQuery.event.fixHooks = {};
+
+migrateWarnProp( jQuery.event.props, "concat", jQuery.event.props.concat,
+       "event-old-patch",
+       "jQuery.event.props.concat() is deprecated and removed" );
+
+migratePatchFunc( jQuery.event, "fix", function( originalEvent ) {
+       var event,
+               type = originalEvent.type,
+               fixHook = this.fixHooks[ type ],
+               props = jQuery.event.props;
+
+       if ( props.length ) {
+               migrateWarn( "event-old-patch",
+                       "jQuery.event.props are deprecated and removed: " + props.join() );
+               while ( props.length ) {
+                       jQuery.event.addProp( props.pop() );
+               }
+       }
+
+       if ( fixHook && !fixHook._migrated_ ) {
+               fixHook._migrated_ = true;
+               migrateWarn( "event-old-patch",
+                       "jQuery.event.fixHooks are deprecated and removed: " + type );
+               if ( ( props = fixHook.props ) && props.length ) {
+                       while ( props.length ) {
+                               jQuery.event.addProp( props.pop() );
+                       }
+               }
+       }
+
+       event = originalFix.call( this, originalEvent );
+
+       return fixHook && fixHook.filter ?
+               fixHook.filter( event, originalEvent ) :
+               event;
+}, "event-old-patch" );
+
+migratePatchFunc( jQuery.event, "add", function( elem, types ) {
+
+       // This misses the multiple-types case but that seems awfully rare
+       if ( elem === window && types === "load" && window.document.readyState === "complete" ) {
+               migrateWarn( "load-after-event",
+                       "jQuery(window).on('load'...) called after load event occurred" );
+       }
+       return oldEventAdd.apply( this, arguments );
+}, "load-after-event" );
+
+jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
+
+       migratePatchFunc( jQuery.fn, name, function() {
+               var args = Array.prototype.slice.call( arguments, 0 );
+
+               // If this is an ajax load() the first arg should be the string URL;
+               // technically this could also be the "Anything" arg of the event .load()
+               // which just goes to show why this dumb signature has been deprecated!
+               // jQuery custom builds that exclude the Ajax module justifiably die here.
+               if ( name === "load" && typeof args[ 0 ] === "string" ) {
+                       return oldLoad.apply( this, args );
+               }
+
+               migrateWarn( "shorthand-removed-v3",
+                       "jQuery.fn." + name + "() is deprecated" );
+
+               args.splice( 0, 0, name );
+               if ( arguments.length ) {
+                       return this.on.apply( this, args );
+               }
+
+               // Use .triggerHandler here because:
+               // - load and unload events don't need to bubble, only applied to window or image
+               // - error event should not bubble to window, although it does pre-1.7
+               // See http://bugs.jquery.com/ticket/11820
+               this.triggerHandler.apply( this, args );
+               return this;
+       }, "shorthand-removed-v3" );
+
+} );
+
+jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+       "change select submit keydown keypress keyup contextmenu" ).split( " " ),
+function( _i, name ) {
+
+       // Handle event binding
+       migratePatchAndWarnFunc( jQuery.fn, name, function( data, fn ) {
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       },
+       "shorthand-deprecated-v3",
+       "jQuery.fn." + name + "() event shorthand is deprecated" );
+} );
+
+// Trigger "ready" event only once, on document ready
+jQuery( function() {
+       jQuery( window.document ).triggerHandler( "ready" );
+} );
+
+jQuery.event.special.ready = {
+       setup: function() {
+               if ( this === window.document ) {
+                       migrateWarn( "ready-event", "'ready' event is deprecated" );
+               }
+       }
+};
+
+migratePatchAndWarnFunc( jQuery.fn, "bind", function( types, data, fn ) {
+       return this.on( types, null, data, fn );
+}, "pre-on-methods", "jQuery.fn.bind() is deprecated" );
+migratePatchAndWarnFunc( jQuery.fn, "unbind", function( types, fn ) {
+       return this.off( types, null, fn );
+}, "pre-on-methods", "jQuery.fn.unbind() is deprecated" );
+migratePatchAndWarnFunc( jQuery.fn, "delegate", function( selector, types, data, fn ) {
+       return this.on( types, selector, data, fn );
+}, "pre-on-methods", "jQuery.fn.delegate() is deprecated" );
+migratePatchAndWarnFunc( jQuery.fn, "undelegate", function( selector, types, fn ) {
+       return arguments.length === 1 ?
+               this.off( selector, "**" ) :
+               this.off( types, selector || "**", fn );
+}, "pre-on-methods", "jQuery.fn.undelegate() is deprecated" );
+migratePatchAndWarnFunc( jQuery.fn, "hover", function( fnOver, fnOut ) {
+       return this.on( "mouseenter", fnOver ).on( "mouseleave", fnOut || fnOver );
+}, "pre-on-methods", "jQuery.fn.hover() is deprecated" );
+
+var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+       makeMarkup = function( html ) {
+               var doc = window.document.implementation.createHTMLDocument( "" );
+               doc.body.innerHTML = html;
+               return doc.body && doc.body.innerHTML;
+       },
+       warnIfChanged = function( html ) {
+               var changed = html.replace( rxhtmlTag, "<$1></$2>" );
+               if ( changed !== html && makeMarkup( html ) !== makeMarkup( changed ) ) {
+                       migrateWarn( "self-closed-tags",
+                               "HTML tags must be properly nested and closed: " + html );
+               }
+       };
+
+/**
+ * Deprecated, please use `jQuery.migrateDisablePatches( "self-closed-tags" )` instead.
+ * @deprecated
+ */
+migratePatchAndWarnFunc( jQuery, "UNSAFE_restoreLegacyHtmlPrefilter", function() {
+       jQuery.migrateEnablePatches( "self-closed-tags" );
+}, "legacy-self-closed-tags",
+"jQuery.UNSAFE_restoreLegacyHtmlPrefilter deprecated; use " +
+       "`jQuery.migrateEnablePatches( \"self-closed-tags\" )`" );
+
+migratePatchFunc( jQuery, "htmlPrefilter", function( html ) {
+       warnIfChanged( html );
+       return html.replace( rxhtmlTag, "<$1></$2>" );
+}, "self-closed-tags" );
+
+// This patch needs to be disabled by default as it re-introduces
+// security issues (CVE-2020-11022, CVE-2020-11023).
+jQuery.migrateDisablePatches( "self-closed-tags" );
+
+var origOffset = jQuery.fn.offset;
+
+migratePatchFunc( jQuery.fn, "offset", function() {
+       var elem = this[ 0 ];
+
+       if ( elem && ( !elem.nodeType || !elem.getBoundingClientRect ) ) {
+               migrateWarn( "offset-valid-elem", "jQuery.fn.offset() requires a valid DOM element" );
+               return arguments.length ? this : undefined;
+       }
+
+       return origOffset.apply( this, arguments );
+}, "offset-valid-elem" );
+
+// Support jQuery slim which excludes the ajax module
+// The jQuery.param patch is about respecting `jQuery.ajaxSettings.traditional`
+// so it doesn't make sense for the slim build.
+if ( jQuery.ajax ) {
+
+var origParam = jQuery.param;
+
+migratePatchFunc( jQuery, "param", function( data, traditional ) {
+       var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+
+       if ( traditional === undefined && ajaxTraditional ) {
+
+               migrateWarn( "param-ajax-traditional",
+                       "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" );
+               traditional = ajaxTraditional;
+       }
+
+       return origParam.call( this, data, traditional );
+}, "param-ajax-traditional" );
+
+}
+
+migratePatchAndWarnFunc( jQuery.fn, "andSelf", jQuery.fn.addBack, "andSelf",
+       "jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()" );
+
+// Support jQuery slim which excludes the deferred module in jQuery 4.0+
+if ( jQuery.Deferred ) {
+
+var oldDeferred = jQuery.Deferred,
+       tuples = [
+
+               // Action, add listener, callbacks, .then handlers, final state
+               [ "resolve", "done", jQuery.Callbacks( "once memory" ),
+                       jQuery.Callbacks( "once memory" ), "resolved" ],
+               [ "reject", "fail", jQuery.Callbacks( "once memory" ),
+                       jQuery.Callbacks( "once memory" ), "rejected" ],
+               [ "notify", "progress", jQuery.Callbacks( "memory" ),
+                       jQuery.Callbacks( "memory" ) ]
+       ];
+
+migratePatchFunc( jQuery, "Deferred", function( func ) {
+       var deferred = oldDeferred(),
+               promise = deferred.promise();
+
+       function newDeferredPipe( /* fnDone, fnFail, fnProgress */ ) {
+               var fns = arguments;
+
+               return jQuery.Deferred( function( newDefer ) {
+                       jQuery.each( tuples, function( i, tuple ) {
+                               var fn = typeof fns[ i ] === "function" && fns[ i ];
+
+                               // Deferred.done(function() { bind to newDefer or newDefer.resolve })
+                               // deferred.fail(function() { bind to newDefer or newDefer.reject })
+                               // deferred.progress(function() { bind to newDefer or newDefer.notify })
+                               deferred[ tuple[ 1 ] ]( function() {
+                                       var returned = fn && fn.apply( this, arguments );
+                                       if ( returned && typeof returned.promise === "function" ) {
+                                               returned.promise()
+                                                       .done( newDefer.resolve )
+                                                       .fail( newDefer.reject )
+                                                       .progress( newDefer.notify );
+                                       } else {
+                                               newDefer[ tuple[ 0 ] + "With" ](
+                                                       this === promise ? newDefer.promise() : this,
+                                                       fn ? [ returned ] : arguments
+                                               );
+                                       }
+                               } );
+                       } );
+                       fns = null;
+               } ).promise();
+       }
+
+       migratePatchAndWarnFunc( deferred, "pipe", newDeferredPipe, "deferred-pipe",
+               "deferred.pipe() is deprecated" );
+       migratePatchAndWarnFunc( promise, "pipe", newDeferredPipe, "deferred-pipe",
+               "deferred.pipe() is deprecated" );
+
+       if ( func ) {
+               func.call( deferred, deferred );
+       }
+
+       return deferred;
+}, "deferred-pipe" );
+
+// Preserve handler of uncaught exceptions in promise chains
+jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook;
+
+}
+
+return jQuery;
+} );
index c32d9765e6ba5261191905338802eb46c50a58fc..2f1b7ef4b5952aeb305582b26d6dddb6f7292db9 100644 (file)
@@ -112,9 +112,9 @@ function migrateUrl() {
        if ( jqueryVersion === "git" ) {
                url = "https://releases.jquery.com/git/jquery-migrate-git";
        } else if ( jqueryVersion[ 0 ] === "3" ) {
-               url = "../../../external/jquery-migrate-3.4.1/jquery-migrate";
+               url = "../../../external/jquery-migrate-3.x/jquery-migrate";
        } else if ( jqueryVersion[ 0 ] === "1" || jqueryVersion[ 0 ] === "2" ) {
-               url = "../../../external/jquery-migrate-1.4.1/jquery-migrate";
+               url = "../../../external/jquery-migrate-1.x/jquery-migrate";
        } else if ( jqueryVersion === "custom" ) {
                if ( parseUrl().migrate ) {
                        throw new Error( "Migrate not currently supported for custom build" );