[ofbiz-framework] branch trunk updated: Fixed: Check embedded Javascript libs vulnerabilities using retire.js (OFBIZ-11752)

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[ofbiz-framework] branch trunk updated: Fixed: Check embedded Javascript libs vulnerabilities using retire.js (OFBIZ-11752)

adityasharma
This is an automated email from the ASF dual-hosted git repository.

adityasharma pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 54307be  Fixed: Check embedded Javascript libs vulnerabilities using retire.js (OFBIZ-11752)
54307be is described below

commit 54307be1c222d97f5b6f262398d1c3ae122136bf
Author: Aditya Sharma <[hidden email]>
AuthorDate: Tue Jun 9 15:29:09 2020 +0530

    Fixed: Check embedded Javascript libs vulnerabilities using retire.js (OFBIZ-11752)
   
    * Fixed: Check embedded Javascript libs vulnerabilities using retire.js
    (OFBIZ-11752)
   
    Upgraded jQuery to 3.5.2 and jQuery migrate to 3.3.0 to vulnerabilities of medium severity
    Regex in its jQuery.htmlPrefilter sometimes may introduce XSS; https://blog.jquery.com/2020/04/10/jquery-3-5-0-released/
   
    * Fixed: console error TypeError: document is undefined
    (OFBIZ-11752)
   
    As the document object was not passed to the IFFE call for the FORMALIZE function, it gives console error for the missing document object when accessed
---
 .../webapp/common/js/jquery/jquery-3.4.1.min.js    |    2 -
 .../js/jquery/{jquery-3.4.1.js => jquery-3.5.1.js} | 1238 ++++++++++++--------
 .../webapp/common/js/jquery/jquery-3.5.1.min.js    |    2 +
 .../common/js/jquery/jquery-migrate-3.0.0.js       |  540 ---------
 .../common/js/jquery/jquery-migrate-3.0.0.min.js   |    2 -
 .../common/js/jquery/jquery-migrate-3.3.0.js       |  838 +++++++++++++
 .../common/js/jquery/jquery-migrate-3.3.0.min.js   |    2 +
 .../webapp/common/js/util/application.js           |    2 +-
 themes/common-theme/widget/CommonScreens.xml       |    8 +-
 themes/common-theme/widget/Theme.xml               |    6 +-
 10 files changed, 1606 insertions(+), 1034 deletions(-)

diff --git a/themes/common-theme/webapp/common/js/jquery/jquery-3.4.1.min.js b/themes/common-theme/webapp/common/js/jquery/jquery-3.4.1.min.js
deleted file mode 100644
index a1c07fd..0000000
--- a/themes/common-theme/webapp/common/js/jquery/jquery-3.4.1.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e& [...]
diff --git a/themes/common-theme/webapp/common/js/jquery/jquery-3.4.1.js b/themes/common-theme/webapp/common/js/jquery/jquery-3.5.1.js
similarity index 91%
rename from themes/common-theme/webapp/common/js/jquery/jquery-3.4.1.js
rename to themes/common-theme/webapp/common/js/jquery/jquery-3.5.1.js
index 773ad95..5093733 100644
--- a/themes/common-theme/webapp/common/js/jquery/jquery-3.4.1.js
+++ b/themes/common-theme/webapp/common/js/jquery/jquery-3.5.1.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery JavaScript Library v3.4.1
+ * jQuery JavaScript Library v3.5.1
  * https://jquery.com/
  *
  * Includes Sizzle.js
@@ -9,7 +9,7 @@
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2019-05-01T21:04Z
+ * Date: 2020-05-04T22:49Z
  */
 ( function( global, factory ) {
 
@@ -47,13 +47,16 @@
 
 var arr = [];
 
-var document = window.document;
-
 var getProto = Object.getPrototypeOf;
 
 var slice = arr.slice;
 
-var concat = arr.concat;
+var flat = arr.flat ? function( array ) {
+ return arr.flat.call( array );
+} : function( array ) {
+ return arr.concat.apply( [], array );
+};
+
 
 var push = arr.push;
 
@@ -86,6 +89,8 @@ var isWindow = function isWindow( obj ) {
  };
 
 
+var document = window.document;
+
 
 
  var preservedScriptAttributes = {
@@ -142,7 +147,7 @@ function toType( obj ) {
 
 
 var
- version = "3.4.1",
+ version = "3.5.1",
 
  // Define a local copy of jQuery
  jQuery = function( selector, context ) {
@@ -150,11 +155,7 @@ var
  // The jQuery object is actually just the init constructor 'enhanced'
  // Need init if jQuery is called (just allow error to be thrown if not included)
  return new jQuery.fn.init( selector, context );
- },
-
- // Support: Android <=4.0 only
- // Make sure we trim BOM and NBSP
- rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+ };
 
 jQuery.fn = jQuery.prototype = {
 
@@ -220,6 +221,18 @@ jQuery.fn = jQuery.prototype = {
  return this.eq( -1 );
  },
 
+ even: function() {
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+ return ( i + 1 ) % 2;
+ } ) );
+ },
+
+ odd: function() {
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+ return i % 2;
+ } ) );
+ },
+
  eq: function( i ) {
  var len = this.length,
  j = +i + ( i < 0 ? len : 0 );
@@ -353,9 +366,10 @@ jQuery.extend( {
  return true;
  },
 
- // Evaluates a script in a global context
- globalEval: function( code, options ) {
- DOMEval( code, { nonce: options && options.nonce } );
+ // Evaluates a script in a provided context; falls back to the global one
+ // if not specified.
+ globalEval: function( code, options, doc ) {
+ DOMEval( code, { nonce: options && options.nonce }, doc );
  },
 
  each: function( obj, callback ) {
@@ -379,13 +393,6 @@ jQuery.extend( {
  return obj;
  },
 
- // Support: Android <=4.0 only
- trim: function( text ) {
- return text == null ?
- "" :
- ( text + "" ).replace( rtrim, "" );
- },
-
  // results is for internal usage only
  makeArray: function( arr, results ) {
  var ret = results || [];
@@ -472,7 +479,7 @@ jQuery.extend( {
  }
 
  // Flatten any nested arrays
- return concat.apply( [], ret );
+ return flat( ret );
  },
 
  // A global GUID counter for objects
@@ -489,7 +496,7 @@ if ( typeof Symbol === "function" ) {
 
 // Populate the class2type map
 jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( i, name ) {
+function( _i, name ) {
  class2type[ "[object " + name + "]" ] = name.toLowerCase();
 } );
 
@@ -511,17 +518,16 @@ function isArrayLike( obj ) {
 }
 var Sizzle =
 /*!
- * Sizzle CSS Selector Engine v2.3.4
+ * Sizzle CSS Selector Engine v2.3.5
  * https://sizzlejs.com/
  *
  * Copyright JS Foundation and other contributors
  * Released under the MIT license
  * https://js.foundation/
  *
- * Date: 2019-04-08
+ * Date: 2020-03-14
  */
-(function( window ) {
-
+( function( window ) {
 var i,
  support,
  Expr,
@@ -561,59 +567,70 @@ var i,
  },
 
  // Instance methods
- hasOwn = ({}).hasOwnProperty,
+ hasOwn = ( {} ).hasOwnProperty,
  arr = [],
  pop = arr.pop,
- push_native = arr.push,
+ pushNative = arr.push,
  push = arr.push,
  slice = arr.slice,
+
  // Use a stripped-down indexOf as it's faster than native
  // https://jsperf.com/thor-indexof-vs-for/5
  indexOf = function( list, elem ) {
  var i = 0,
  len = list.length;
  for ( ; i < len; i++ ) {
- if ( list[i] === elem ) {
+ if ( list[ i ] === elem ) {
  return i;
  }
  }
  return -1;
  },
 
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
+ "ismap|loop|multiple|open|readonly|required|scoped",
 
  // Regular expressions
 
  // http://www.w3.org/TR/css3-selectors/#whitespace
  whitespace = "[\\x20\\t\\r\\n\\f]",
 
- // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
- identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+ // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
+ identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
+ "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
 
  // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
  attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+
  // Operator (capture 2)
  "*([*^$|!~]?=)" + whitespace +
- // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
- "*\\]",
+
+ // "Attribute values must be CSS identifiers [capture 5]
+ // or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
+ whitespace + "*\\]",
 
  pseudos = ":(" + identifier + ")(?:\\((" +
+
  // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
  // 1. quoted (capture 3; capture 4 or capture 5)
  "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+
  // 2. simple (capture 6)
  "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+
  // 3. anything else (capture 2)
  ".*" +
  ")\\)|)",
 
  // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
  rwhitespace = new RegExp( whitespace + "+", "g" ),
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
+ whitespace + "+$", "g" ),
 
  rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
+ "*" ),
  rdescend = new RegExp( whitespace + "|>" ),
 
  rpseudo = new RegExp( pseudos ),
@@ -625,14 +642,16 @@ var i,
  "TAG": new RegExp( "^(" + identifier + "|[*])" ),
  "ATTR": new RegExp( "^" + attributes ),
  "PSEUDO": new RegExp( "^" + pseudos ),
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
- "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
- "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
+ whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
+ whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
  "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+
  // For use in libraries implementing .is()
  // We use this for POS matching in `select`
- "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
- whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ "needsContext": new RegExp( "^" + whitespace +
+ "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+ "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
  },
 
  rhtml = /HTML$/i,
@@ -648,18 +667,21 @@ var i,
 
  // CSS escapes
  // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
- runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
- funescape = function( _, escaped, escapedWhitespace ) {
- var high = "0x" + escaped - 0x10000;
- // NaN means non-codepoint
- // Support: Firefox<24
- // Workaround erroneous numeric interpretation of +"0x"
- return high !== high || escapedWhitespace ?
- escaped :
+ runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
+ funescape = function( escape, nonHex ) {
+ var high = "0x" + escape.slice( 1 ) - 0x10000;
+
+ return nonHex ?
+
+ // Strip the backslash prefix from a non-hex escape sequence
+ nonHex :
+
+ // Replace a hexadecimal escape sequence with the encoded Unicode code point
+ // Support: IE <=11+
+ // For values outside the Basic Multilingual Plane (BMP), manually construct a
+ // surrogate pair
  high < 0 ?
- // BMP codepoint
  String.fromCharCode( high + 0x10000 ) :
- // Supplemental Plane codepoint (surrogate pair)
  String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
  },
 
@@ -675,7 +697,8 @@ var i,
  }
 
  // Control characters and (dependent upon position) numbers get escaped as code points
- return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+ return ch.slice( 0, -1 ) + "\\" +
+ ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
  }
 
  // Other potentially-special ASCII characters get backslash-escaped
@@ -700,18 +723,20 @@ var i,
 // Optimize for push.apply( _, NodeList )
 try {
  push.apply(
- (arr = slice.call( preferredDoc.childNodes )),
+ ( arr = slice.call( preferredDoc.childNodes ) ),
  preferredDoc.childNodes
  );
+
  // Support: Android<4.0
  // Detect silently failing push.apply
+ // eslint-disable-next-line no-unused-expressions
  arr[ preferredDoc.childNodes.length ].nodeType;
 } catch ( e ) {
  push = { apply: arr.length ?
 
  // Leverage slice if possible
  function( target, els ) {
- push_native.apply( target, slice.call(els) );
+ pushNative.apply( target, slice.call( els ) );
  } :
 
  // Support: IE<9
@@ -719,8 +744,9 @@ try {
  function( target, els ) {
  var j = target.length,
  i = 0;
+
  // Can't trust NodeList.length
- while ( (target[j++] = els[i++]) ) {}
+ while ( ( target[ j++ ] = els[ i++ ] ) ) {}
  target.length = j - 1;
  }
  };
@@ -744,24 +770,21 @@ function Sizzle( selector, context, results, seed ) {
 
  // Try to shortcut find operations (as opposed to filters) in HTML documents
  if ( !seed ) {
-
- if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
- setDocument( context );
- }
+ setDocument( context );
  context = context || document;
 
  if ( documentIsHTML ) {
 
  // If the selector is sufficiently simple, try using a "get*By*" DOM method
  // (excepting DocumentFragment context, where the methods don't exist)
- if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+ if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
 
  // ID selector
- if ( (m = match[1]) ) {
+ if ( ( m = match[ 1 ] ) ) {
 
  // Document context
  if ( nodeType === 9 ) {
- if ( (elem = context.getElementById( m )) ) {
+ if ( ( elem = context.getElementById( m ) ) ) {
 
  // Support: IE, Opera, Webkit
  // TODO: identify versions
@@ -780,7 +803,7 @@ function Sizzle( selector, context, results, seed ) {
  // Support: IE, Opera, Webkit
  // TODO: identify versions
  // getElementById can match elements by name instead of ID
- if ( newContext && (elem = newContext.getElementById( m )) &&
+ if ( newContext && ( elem = newContext.getElementById( m ) ) &&
  contains( context, elem ) &&
  elem.id === m ) {
 
@@ -790,12 +813,12 @@ function Sizzle( selector, context, results, seed ) {
  }
 
  // Type selector
- } else if ( match[2] ) {
+ } else if ( match[ 2 ] ) {
  push.apply( results, context.getElementsByTagName( selector ) );
  return results;
 
  // Class selector
- } else if ( (m = match[3]) && support.getElementsByClassName &&
+ } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
  context.getElementsByClassName ) {
 
  push.apply( results, context.getElementsByClassName( m ) );
@@ -806,11 +829,11 @@ function Sizzle( selector, context, results, seed ) {
  // Take advantage of querySelectorAll
  if ( support.qsa &&
  !nonnativeSelectorCache[ selector + " " ] &&
- (!rbuggyQSA || !rbuggyQSA.test( selector )) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
 
  // Support: IE 8 only
  // Exclude object elements
- (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
+ ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
 
  newSelector = selector;
  newContext = context;
@@ -819,27 +842,36 @@ function Sizzle( selector, context, results, seed ) {
  // descendant combinators, which is not what we want.
  // In such cases, we work around the behavior by prefixing every selector in the
  // list with an ID selector referencing the scope context.
+ // The technique has to be used as well when a leading combinator is used
+ // as such selectors are not recognized by querySelectorAll.
  // Thanks to Andrew Dupont for this technique.
- if ( nodeType === 1 && rdescend.test( selector ) ) {
+ if ( nodeType === 1 &&
+ ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
 
- // Capture the context ID, setting it first if necessary
- if ( (nid = context.getAttribute( "id" )) ) {
- nid = nid.replace( rcssescape, fcssescape );
- } else {
- context.setAttribute( "id", (nid = expando) );
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+
+ // We can use :scope instead of the ID hack if the browser
+ // supports it & if we're not changing the context.
+ if ( newContext !== context || !support.scope ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( ( nid = context.getAttribute( "id" ) ) ) {
+ nid = nid.replace( rcssescape, fcssescape );
+ } else {
+ context.setAttribute( "id", ( nid = expando ) );
+ }
  }
 
  // Prefix every selector in the list
  groups = tokenize( selector );
  i = groups.length;
  while ( i-- ) {
- groups[i] = "#" + nid + " " + toSelector( groups[i] );
+ groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
+ toSelector( groups[ i ] );
  }
  newSelector = groups.join( "," );
-
- // Expand context for sibling selectors
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
- context;
  }
 
  try {
@@ -872,12 +904,14 @@ function createCache() {
  var keys = [];
 
  function cache( key, value ) {
+
  // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
  if ( keys.push( key + " " ) > Expr.cacheLength ) {
+
  // Only keep the most recent entries
  delete cache[ keys.shift() ];
  }
- return (cache[ key + " " ] = value);
+ return ( cache[ key + " " ] = value );
  }
  return cache;
 }
@@ -896,17 +930,19 @@ function markFunction( fn ) {
  * @param {Function} fn Passed the created element and returns a boolean result
  */
 function assert( fn ) {
- var el = document.createElement("fieldset");
+ var el = document.createElement( "fieldset" );
 
  try {
  return !!fn( el );
- } catch (e) {
+ } catch ( e ) {
  return false;
  } finally {
+
  // Remove from its parent by default
  if ( el.parentNode ) {
  el.parentNode.removeChild( el );
  }
+
  // release memory in IE
  el = null;
  }
@@ -918,11 +954,11 @@ function assert( fn ) {
  * @param {Function} handler The method that will be applied
  */
 function addHandle( attrs, handler ) {
- var arr = attrs.split("|"),
+ var arr = attrs.split( "|" ),
  i = arr.length;
 
  while ( i-- ) {
- Expr.attrHandle[ arr[i] ] = handler;
+ Expr.attrHandle[ arr[ i ] ] = handler;
  }
 }
 
@@ -944,7 +980,7 @@ function siblingCheck( a, b ) {
 
  // Check if b follows a
  if ( cur ) {
- while ( (cur = cur.nextSibling) ) {
+ while ( ( cur = cur.nextSibling ) ) {
  if ( cur === b ) {
  return -1;
  }
@@ -972,7 +1008,7 @@ function createInputPseudo( type ) {
 function createButtonPseudo( type ) {
  return function( elem ) {
  var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && elem.type === type;
+ return ( name === "input" || name === "button" ) && elem.type === type;
  };
 }
 
@@ -1015,7 +1051,7 @@ function createDisabledPseudo( disabled ) {
  // Where there is no isDisabled, check manually
  /* jshint -W018 */
  elem.isDisabled !== !disabled &&
- inDisabledFieldset( elem ) === disabled;
+ inDisabledFieldset( elem ) === disabled;
  }
 
  return elem.disabled === disabled;
@@ -1037,21 +1073,21 @@ function createDisabledPseudo( disabled ) {
  * @param {Function} fn
  */
 function createPositionalPseudo( fn ) {
- return markFunction(function( argument ) {
+ return markFunction( function( argument ) {
  argument = +argument;
- return markFunction(function( seed, matches ) {
+ return markFunction( function( seed, matches ) {
  var j,
  matchIndexes = fn( [], seed.length, argument ),
  i = matchIndexes.length;
 
  // Match elements found at the specified indexes
  while ( i-- ) {
- if ( seed[ (j = matchIndexes[i]) ] ) {
- seed[j] = !(matches[j] = seed[j]);
+ if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
+ seed[ j ] = !( matches[ j ] = seed[ j ] );
  }
  }
- });
- });
+ } );
+ } );
 }
 
 /**
@@ -1073,7 +1109,7 @@ support = Sizzle.support = {};
  */
 isXML = Sizzle.isXML = function( elem ) {
  var namespace = elem.namespaceURI,
- docElem = (elem.ownerDocument || elem).documentElement;
+ docElem = ( elem.ownerDocument || elem ).documentElement;
 
  // Support: IE <=8
  // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -1091,7 +1127,11 @@ setDocument = Sizzle.setDocument = function( node ) {
  doc = node ? node.ownerDocument || node : preferredDoc;
 
  // Return early if doc is invalid or already selected
- if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
  return document;
  }
 
@@ -1100,10 +1140,14 @@ setDocument = Sizzle.setDocument = function( node ) {
  docElem = document.documentElement;
  documentIsHTML = !isXML( document );
 
- // Support: IE 9-11, Edge
+ // Support: IE 9 - 11+, Edge 12 - 18+
  // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
- if ( preferredDoc !== document &&
- (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( preferredDoc != document &&
+ ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
 
  // Support: IE 11, Edge
  if ( subWindow.addEventListener ) {
@@ -1115,25 +1159,36 @@ setDocument = Sizzle.setDocument = function( node ) {
  }
  }
 
+ // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
+ // Safari 4 - 5 only, Opera <=11.6 - 12.x only
+ // IE/Edge & older browsers don't support the :scope pseudo-class.
+ // Support: Safari 6.0 only
+ // Safari 6.0 supports :scope but it's an alias of :root there.
+ support.scope = assert( function( el ) {
+ docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
+ return typeof el.querySelectorAll !== "undefined" &&
+ !el.querySelectorAll( ":scope fieldset div" ).length;
+ } );
+
  /* Attributes
  ---------------------------------------------------------------------- */
 
  // Support: IE<8
  // Verify that getAttribute really returns attributes and not properties
  // (excepting IE8 booleans)
- support.attributes = assert(function( el ) {
+ support.attributes = assert( function( el ) {
  el.className = "i";
- return !el.getAttribute("className");
- });
+ return !el.getAttribute( "className" );
+ } );
 
  /* getElement(s)By*
  ---------------------------------------------------------------------- */
 
  // Check if getElementsByTagName("*") returns only elements
- support.getElementsByTagName = assert(function( el ) {
- el.appendChild( document.createComment("") );
- return !el.getElementsByTagName("*").length;
- });
+ support.getElementsByTagName = assert( function( el ) {
+ el.appendChild( document.createComment( "" ) );
+ return !el.getElementsByTagName( "*" ).length;
+ } );
 
  // Support: IE<9
  support.getElementsByClassName = rnative.test( document.getElementsByClassName );
@@ -1142,38 +1197,38 @@ setDocument = Sizzle.setDocument = function( node ) {
  // Check if getElementById returns elements by name
  // The broken getElementById methods don't pick up programmatically-set names,
  // so use a roundabout getElementsByName test
- support.getById = assert(function( el ) {
+ support.getById = assert( function( el ) {
  docElem.appendChild( el ).id = expando;
  return !document.getElementsByName || !document.getElementsByName( expando ).length;
- });
+ } );
 
  // ID filter and find
  if ( support.getById ) {
- Expr.filter["ID"] = function( id ) {
+ Expr.filter[ "ID" ] = function( id ) {
  var attrId = id.replace( runescape, funescape );
  return function( elem ) {
- return elem.getAttribute("id") === attrId;
+ return elem.getAttribute( "id" ) === attrId;
  };
  };
- Expr.find["ID"] = function( id, context ) {
+ Expr.find[ "ID" ] = function( id, context ) {
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
  var elem = context.getElementById( id );
  return elem ? [ elem ] : [];
  }
  };
  } else {
- Expr.filter["ID"] =  function( id ) {
+ Expr.filter[ "ID" ] =  function( id ) {
  var attrId = id.replace( runescape, funescape );
  return function( elem ) {
  var node = typeof elem.getAttributeNode !== "undefined" &&
- elem.getAttributeNode("id");
+ elem.getAttributeNode( "id" );
  return node && node.value === attrId;
  };
  };
 
  // Support: IE 6 - 7 only
  // getElementById is not reliable as a find shortcut
- Expr.find["ID"] = function( id, context ) {
+ Expr.find[ "ID" ] = function( id, context ) {
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
  var node, i, elems,
  elem = context.getElementById( id );
@@ -1181,7 +1236,7 @@ setDocument = Sizzle.setDocument = function( node ) {
  if ( elem ) {
 
  // Verify the id attribute
- node = elem.getAttributeNode("id");
+ node = elem.getAttributeNode( "id" );
  if ( node && node.value === id ) {
  return [ elem ];
  }
@@ -1189,8 +1244,8 @@ setDocument = Sizzle.setDocument = function( node ) {
  // Fall back on getElementsByName
  elems = context.getElementsByName( id );
  i = 0;
- while ( (elem = elems[i++]) ) {
- node = elem.getAttributeNode("id");
+ while ( ( elem = elems[ i++ ] ) ) {
+ node = elem.getAttributeNode( "id" );
  if ( node && node.value === id ) {
  return [ elem ];
  }
@@ -1203,7 +1258,7 @@ setDocument = Sizzle.setDocument = function( node ) {
  }
 
  // Tag
- Expr.find["TAG"] = support.getElementsByTagName ?
+ Expr.find[ "TAG" ] = support.getElementsByTagName ?
  function( tag, context ) {
  if ( typeof context.getElementsByTagName !== "undefined" ) {
  return context.getElementsByTagName( tag );
@@ -1218,12 +1273,13 @@ setDocument = Sizzle.setDocument = function( node ) {
  var elem,
  tmp = [],
  i = 0,
+
  // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
  results = context.getElementsByTagName( tag );
 
  // Filter out possible comments
  if ( tag === "*" ) {
- while ( (elem = results[i++]) ) {
+ while ( ( elem = results[ i++ ] ) ) {
  if ( elem.nodeType === 1 ) {
  tmp.push( elem );
  }
@@ -1235,7 +1291,7 @@ setDocument = Sizzle.setDocument = function( node ) {
  };
 
  // Class
- Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
  if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
  return context.getElementsByClassName( className );
  }
@@ -1256,10 +1312,14 @@ setDocument = Sizzle.setDocument = function( node ) {
  // See https://bugs.jquery.com/ticket/13378
  rbuggyQSA = [];
 
- if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+ if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
+
  // Build QSA regex
  // Regex strategy adopted from Diego Perini
- assert(function( el ) {
+ assert( function( el ) {
+
+ var input;
+
  // Select is set to empty string on purpose
  // This is to test IE's treatment of not explicitly
  // setting a boolean content attribute,
@@ -1273,78 +1333,98 @@ setDocument = Sizzle.setDocument = function( node ) {
  // Nothing should be selected when empty strings follow ^= or $= or *=
  // The test attribute must be unknown in Opera but "safe" for WinRT
  // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
- if ( el.querySelectorAll("[msallowcapture^='']").length ) {
+ if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
  rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
  }
 
  // Support: IE8
  // Boolean attributes and "value" are not treated correctly
- if ( !el.querySelectorAll("[selected]").length ) {
+ if ( !el.querySelectorAll( "[selected]" ).length ) {
  rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
  }
 
  // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
  if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
- rbuggyQSA.push("~=");
+ rbuggyQSA.push( "~=" );
+ }
+
+ // Support: IE 11+, Edge 15 - 18+
+ // IE 11/Edge don't find elements on a `[name='']` query in some cases.
+ // Adding a temporary attribute to the document before the selection works
+ // around the issue.
+ // Interestingly, IE 10 & older don't seem to have the issue.
+ input = document.createElement( "input" );
+ input.setAttribute( "name", "" );
+ el.appendChild( input );
+ if ( !el.querySelectorAll( "[name='']" ).length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
+ whitespace + "*(?:''|\"\")" );
  }
 
  // Webkit/Opera - :checked should return selected option elements
  // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
  // IE8 throws error here and will not see later tests
- if ( !el.querySelectorAll(":checked").length ) {
- rbuggyQSA.push(":checked");
+ if ( !el.querySelectorAll( ":checked" ).length ) {
+ rbuggyQSA.push( ":checked" );
  }
 
  // Support: Safari 8+, iOS 8+
  // https://bugs.webkit.org/show_bug.cgi?id=136851
  // In-page `selector#id sibling-combinator selector` fails
  if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
- rbuggyQSA.push(".#.+[+~]");
+ rbuggyQSA.push( ".#.+[+~]" );
  }
- });
 
- assert(function( el ) {
+ // Support: Firefox <=3.6 - 5 only
+ // Old Firefox doesn't throw on a badly-escaped identifier.
+ el.querySelectorAll( "\\\f" );
+ rbuggyQSA.push( "[\\r\\n\\f]" );
+ } );
+
+ assert( function( el ) {
  el.innerHTML = "<a href='' disabled='disabled'></a>" +
  "<select disabled='disabled'><option/></select>";
 
  // Support: Windows 8 Native Apps
  // The type and name attributes are restricted during .innerHTML assignment
- var input = document.createElement("input");
+ var input = document.createElement( "input" );
  input.setAttribute( "type", "hidden" );
  el.appendChild( input ).setAttribute( "name", "D" );
 
  // Support: IE8
  // Enforce case-sensitivity of name attribute
- if ( el.querySelectorAll("[name=d]").length ) {
+ if ( el.querySelectorAll( "[name=d]" ).length ) {
  rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
  }
 
  // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
  // IE8 throws error here and will not see later tests
- if ( el.querySelectorAll(":enabled").length !== 2 ) {
+ if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
  rbuggyQSA.push( ":enabled", ":disabled" );
  }
 
  // Support: IE9-11+
  // IE's :disabled selector does not pick up the children of disabled fieldsets
  docElem.appendChild( el ).disabled = true;
- if ( el.querySelectorAll(":disabled").length !== 2 ) {
+ if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
  rbuggyQSA.push( ":enabled", ":disabled" );
  }
 
+ // Support: Opera 10 - 11 only
  // Opera 10-11 does not throw on post-comma invalid pseudos
- el.querySelectorAll("*,:x");
- rbuggyQSA.push(",.*:");
- });
+ el.querySelectorAll( "*,:x" );
+ rbuggyQSA.push( ",.*:" );
+ } );
  }
 
- if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
  docElem.webkitMatchesSelector ||
  docElem.mozMatchesSelector ||
  docElem.oMatchesSelector ||
- docElem.msMatchesSelector) )) ) {
+ docElem.msMatchesSelector ) ) ) ) {
+
+ assert( function( el ) {
 
- assert(function( el ) {
  // Check to see if it's possible to do matchesSelector
  // on a disconnected node (IE 9)
  support.disconnectedMatch = matches.call( el, "*" );
@@ -1353,11 +1433,11 @@ setDocument = Sizzle.setDocument = function( node ) {
  // Gecko does not error, returns false instead
  matches.call( el, "[s!='']:x" );
  rbuggyMatches.push( "!=", pseudos );
- });
+ } );
  }
 
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
 
  /* Contains
  ---------------------------------------------------------------------- */
@@ -1374,11 +1454,11 @@ setDocument = Sizzle.setDocument = function( node ) {
  adown.contains ?
  adown.contains( bup ) :
  a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
- ));
+ ) );
  } :
  function( a, b ) {
  if ( b ) {
- while ( (b = b.parentNode) ) {
+ while ( ( b = b.parentNode ) ) {
  if ( b === a ) {
  return true;
  }
@@ -1407,7 +1487,11 @@ setDocument = Sizzle.setDocument = function( node ) {
  }
 
  // Calculate position if both inputs belong to the same document
- compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
  a.compareDocumentPosition( b ) :
 
  // Otherwise we know they are disconnected
@@ -1415,13 +1499,24 @@ setDocument = Sizzle.setDocument = function( node ) {
 
  // Disconnected nodes
  if ( compare & 1 ||
- (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+ ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
 
  // Choose the first element that is related to our preferred document
- if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( a == document || a.ownerDocument == preferredDoc &&
+ contains( preferredDoc, a ) ) {
  return -1;
  }
- if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( b == document || b.ownerDocument == preferredDoc &&
+ contains( preferredDoc, b ) ) {
  return 1;
  }
 
@@ -1434,6 +1529,7 @@ setDocument = Sizzle.setDocument = function( node ) {
  return compare & 4 ? -1 : 1;
  } :
  function( a, b ) {
+
  // Exit early if the nodes are identical
  if ( a === b ) {
  hasDuplicate = true;
@@ -1449,8 +1545,14 @@ setDocument = Sizzle.setDocument = function( node ) {
 
  // Parentless nodes are either documents or disconnected
  if ( !aup || !bup ) {
- return a === document ? -1 :
- b === document ? 1 :
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ /* eslint-disable eqeqeq */
+ return a == document ? -1 :
+ b == document ? 1 :
+ /* eslint-enable eqeqeq */
  aup ? -1 :
  bup ? 1 :
  sortInput ?
@@ -1464,26 +1566,32 @@ setDocument = Sizzle.setDocument = function( node ) {
 
  // Otherwise we need full lists of their ancestors for comparison
  cur = a;
- while ( (cur = cur.parentNode) ) {
+ while ( ( cur = cur.parentNode ) ) {
  ap.unshift( cur );
  }
  cur = b;
- while ( (cur = cur.parentNode) ) {
+ while ( ( cur = cur.parentNode ) ) {
  bp.unshift( cur );
  }
 
  // Walk down the tree looking for a discrepancy
- while ( ap[i] === bp[i] ) {
+ while ( ap[ i ] === bp[ i ] ) {
  i++;
  }
 
  return i ?
+
  // Do a sibling check if the nodes have a common ancestor
- siblingCheck( ap[i], bp[i] ) :
+ siblingCheck( ap[ i ], bp[ i ] ) :
 
  // Otherwise nodes in our document sort first
- ap[i] === preferredDoc ? -1 :
- bp[i] === preferredDoc ? 1 :
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ /* eslint-disable eqeqeq */
+ ap[ i ] == preferredDoc ? -1 :
+ bp[ i ] == preferredDoc ? 1 :
+ /* eslint-enable eqeqeq */
  0;
  };
 
@@ -1495,10 +1603,7 @@ Sizzle.matches = function( expr, elements ) {
 };
 
 Sizzle.matchesSelector = function( elem, expr ) {
- // Set document vars if needed
- if ( ( elem.ownerDocument || elem ) !== document ) {
- setDocument( elem );
- }
+ setDocument( elem );
 
  if ( support.matchesSelector && documentIsHTML &&
  !nonnativeSelectorCache[ expr + " " ] &&
@@ -1510,12 +1615,13 @@ Sizzle.matchesSelector = function( elem, expr ) {
 
  // IE 9's matchesSelector returns false on disconnected nodes
  if ( ret || support.disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9
- elem.document && elem.document.nodeType !== 11 ) {
+
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
  return ret;
  }
- } catch (e) {
+ } catch ( e ) {
  nonnativeSelectorCache( expr, true );
  }
  }
@@ -1524,20 +1630,31 @@ Sizzle.matchesSelector = function( elem, expr ) {
 };
 
 Sizzle.contains = function( context, elem ) {
+
  // Set document vars if needed
- if ( ( context.ownerDocument || context ) !== document ) {
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( ( context.ownerDocument || context ) != document ) {
  setDocument( context );
  }
  return contains( context, elem );
 };
 
 Sizzle.attr = function( elem, name ) {
+
  // Set document vars if needed
- if ( ( elem.ownerDocument || elem ) !== document ) {
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( ( elem.ownerDocument || elem ) != document ) {
  setDocument( elem );
  }
 
  var fn = Expr.attrHandle[ name.toLowerCase() ],
+
  // Don't get fooled by Object.prototype properties (jQuery #13807)
  val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
  fn( elem, name, !documentIsHTML ) :
@@ -1547,13 +1664,13 @@ Sizzle.attr = function( elem, name ) {
  val :
  support.attributes || !documentIsHTML ?
  elem.getAttribute( name ) :
- (val = elem.getAttributeNode(name)) && val.specified ?
+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
  val.value :
  null;
 };
 
 Sizzle.escape = function( sel ) {
- return (sel + "").replace( rcssescape, fcssescape );
+ return ( sel + "" ).replace( rcssescape, fcssescape );
 };
 
 Sizzle.error = function( msg ) {
@@ -1576,7 +1693,7 @@ Sizzle.uniqueSort = function( results ) {
  results.sort( sortOrder );
 
  if ( hasDuplicate ) {
- while ( (elem = results[i++]) ) {
+ while ( ( elem = results[ i++ ] ) ) {
  if ( elem === results[ i ] ) {
  j = duplicates.push( i );
  }
@@ -1604,17 +1721,21 @@ getText = Sizzle.getText = function( elem ) {
  nodeType = elem.nodeType;
 
  if ( !nodeType ) {
+
  // If no nodeType, this is expected to be an array
- while ( (node = elem[i++]) ) {
+ while ( ( node = elem[ i++ ] ) ) {
+
  // Do not traverse comment nodes
  ret += getText( node );
  }
  } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+
  // Use textContent for elements
  // innerText usage removed for consistency of new lines (jQuery #11153)
  if ( typeof elem.textContent === "string" ) {
  return elem.textContent;
  } else {
+
  // Traverse its children
  for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
  ret += getText( elem );
@@ -1623,6 +1744,7 @@ getText = Sizzle.getText = function( elem ) {
  } else if ( nodeType === 3 || nodeType === 4 ) {
  return elem.nodeValue;
  }
+
  // Do not include comment or processing instruction nodes
 
  return ret;
@@ -1650,19 +1772,21 @@ Expr = Sizzle.selectors = {
 
  preFilter: {
  "ATTR": function( match ) {
- match[1] = match[1].replace( runescape, funescape );
+ match[ 1 ] = match[ 1 ].replace( runescape, funescape );
 
  // Move the given value to match[3] whether quoted or unquoted
- match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+ match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
+ match[ 5 ] || "" ).replace( runescape, funescape );
 
- if ( match[2] === "~=" ) {
- match[3] = " " + match[3] + " ";
+ if ( match[ 2 ] === "~=" ) {
+ match[ 3 ] = " " + match[ 3 ] + " ";
  }
 
  return match.slice( 0, 4 );
  },
 
  "CHILD": function( match ) {
+
  /* matches from matchExpr["CHILD"]
  1 type (only|nth|...)
  2 what (child|of-type)
@@ -1673,22 +1797,25 @@ Expr = Sizzle.selectors = {
  7 sign of y-component
  8 y of y-component
  */
- match[1] = match[1].toLowerCase();
+ match[ 1 ] = match[ 1 ].toLowerCase();
+
+ if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
 
- if ( match[1].slice( 0, 3 ) === "nth" ) {
  // nth-* requires argument
- if ( !match[3] ) {
- Sizzle.error( match[0] );
+ if ( !match[ 3 ] ) {
+ Sizzle.error( match[ 0 ] );
  }
 
  // numeric x and y parameters for Expr.filter.CHILD
  // remember that false/true cast respectively to 0/1
- match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
- match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+ match[ 4 ] = +( match[ 4 ] ?
+ match[ 5 ] + ( match[ 6 ] || 1 ) :
+ 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
+ match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
 
- // other types prohibit arguments
- } else if ( match[3] ) {
- Sizzle.error( match[0] );
+ // other types prohibit arguments
+ } else if ( match[ 3 ] ) {
+ Sizzle.error( match[ 0 ] );
  }
 
  return match;
@@ -1696,26 +1823,28 @@ Expr = Sizzle.selectors = {
 
  "PSEUDO": function( match ) {
  var excess,
- unquoted = !match[6] && match[2];
+ unquoted = !match[ 6 ] && match[ 2 ];
 
- if ( matchExpr["CHILD"].test( match[0] ) ) {
+ if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
  return null;
  }
 
  // Accept quoted arguments as-is
- if ( match[3] ) {
- match[2] = match[4] || match[5] || "";
+ if ( match[ 3 ] ) {
+ match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
 
  // Strip excess characters from unquoted arguments
  } else if ( unquoted && rpseudo.test( unquoted ) &&
+
  // Get excess from tokenize (recursively)
- (excess = tokenize( unquoted, true )) &&
+ ( excess = tokenize( unquoted, true ) ) &&
+
  // advance to the next closing parenthesis
- (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+ ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
 
  // excess is a negative index
- match[0] = match[0].slice( 0, excess );
- match[2] = unquoted.slice( 0, excess );
+ match[ 0 ] = match[ 0 ].slice( 0, excess );
+ match[ 2 ] = unquoted.slice( 0, excess );
  }
 
  // Return only captures needed by the pseudo filter method (type and argument)
@@ -1728,7 +1857,9 @@ Expr = Sizzle.selectors = {
  "TAG": function( nodeNameSelector ) {
  var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
  return nodeNameSelector === "*" ?
- function() { return true; } :
+ function() {
+ return true;
+ } :
  function( elem ) {
  return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
  };
@@ -1738,10 +1869,16 @@ Expr = Sizzle.selectors = {
  var pattern = classCache[ className + " " ];
 
  return pattern ||
- (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
- classCache( className, function( elem ) {
- return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
- });
+ ( pattern = new RegExp( "(^|" + whitespace +
+ ")" + className + "(" + whitespace + "|$)" ) ) && classCache(
+ className, function( elem ) {
+ return pattern.test(
+ typeof elem.className === "string" && elem.className ||
+ typeof elem.getAttribute !== "undefined" &&
+ elem.getAttribute( "class" ) ||
+ ""
+ );
+ } );
  },
 
  "ATTR": function( name, operator, check ) {
@@ -1757,6 +1894,8 @@ Expr = Sizzle.selectors = {
 
  result += "";
 
+ /* eslint-disable max-len */
+
  return operator === "=" ? result === check :
  operator === "!=" ? result !== check :
  operator === "^=" ? check && result.indexOf( check ) === 0 :
@@ -1765,10 +1904,12 @@ Expr = Sizzle.selectors = {
  operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
  operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
  false;
+ /* eslint-enable max-len */
+
  };
  },
 
- "CHILD": function( type, what, argument, first, last ) {
+ "CHILD": function( type, what, _argument, first, last ) {
  var simple = type.slice( 0, 3 ) !== "nth",
  forward = type.slice( -4 ) !== "last",
  ofType = what === "of-type";
@@ -1780,7 +1921,7 @@ Expr = Sizzle.selectors = {
  return !!elem.parentNode;
  } :
 
- function( elem, context, xml ) {
+ function( elem, _context, xml ) {
  var cache, uniqueCache, outerCache, node, nodeIndex, start,
  dir = simple !== forward ? "nextSibling" : "previousSibling",
  parent = elem.parentNode,
@@ -1794,7 +1935,7 @@ Expr = Sizzle.selectors = {
  if ( simple ) {
  while ( dir ) {
  node = elem;
- while ( (node = node[ dir ]) ) {
+ while ( ( node = node[ dir ] ) ) {
  if ( ofType ?
  node.nodeName.toLowerCase() === name :
  node.nodeType === 1 ) {
@@ -1802,6 +1943,7 @@ Expr = Sizzle.selectors = {
  return false;
  }
  }
+
  // Reverse direction for :only-* (if we haven't yet done so)
  start = dir = type === "only" && !start && "nextSibling";
  }
@@ -1817,22 +1959,22 @@ Expr = Sizzle.selectors = {
 
  // ...in a gzip-friendly way
  node = parent;
- outerCache = node[ expando ] || (node[ expando ] = {});
+ outerCache = node[ expando ] || ( node[ expando ] = {} );
 
  // Support: IE <9 only
  // Defend against cloned attroperties (jQuery gh-1709)
  uniqueCache = outerCache[ node.uniqueID ] ||
- (outerCache[ node.uniqueID ] = {});
+ ( outerCache[ node.uniqueID ] = {} );
 
  cache = uniqueCache[ type ] || [];
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
  diff = nodeIndex && cache[ 2 ];
  node = nodeIndex && parent.childNodes[ nodeIndex ];
 
- while ( (node = ++nodeIndex && node && node[ dir ] ||
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
 
  // Fallback to seeking `elem` from the start
- (diff = nodeIndex = 0) || start.pop()) ) {
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
 
  // When found, cache indexes on `parent` and break
  if ( node.nodeType === 1 && ++diff && node === elem ) {
@@ -1842,16 +1984,18 @@ Expr = Sizzle.selectors = {
  }
 
  } else {
+
  // Use previously-cached element index if available
  if ( useCache ) {
+
  // ...in a gzip-friendly way
  node = elem;
- outerCache = node[ expando ] || (node[ expando ] = {});
+ outerCache = node[ expando ] || ( node[ expando ] = {} );
 
  // Support: IE <9 only
  // Defend against cloned attroperties (jQuery gh-1709)
  uniqueCache = outerCache[ node.uniqueID ] ||
- (outerCache[ node.uniqueID ] = {});
+ ( outerCache[ node.uniqueID ] = {} );
 
  cache = uniqueCache[ type ] || [];
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
@@ -1861,9 +2005,10 @@ Expr = Sizzle.selectors = {
  // xml :nth-child(...)
  // or :nth-last-child(...) or :nth(-last)?-of-type(...)
  if ( diff === false ) {
+
  // Use the same loop as above to seek `elem` from the start
- while ( (node = ++nodeIndex && node && node[ dir ] ||
- (diff = nodeIndex = 0) || start.pop()) ) {
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
 
  if ( ( ofType ?
  node.nodeName.toLowerCase() === name :
@@ -1872,12 +2017,13 @@ Expr = Sizzle.selectors = {
 
  // Cache the index of each encountered element
  if ( useCache ) {
- outerCache = node[ expando ] || (node[ expando ] = {});
+ outerCache = node[ expando ] ||
+ ( node[ expando ] = {} );
 
  // Support: IE <9 only
  // Defend against cloned attroperties (jQuery gh-1709)
  uniqueCache = outerCache[ node.uniqueID ] ||
- (outerCache[ node.uniqueID ] = {});
+ ( outerCache[ node.uniqueID ] = {} );
 
  uniqueCache[ type ] = [ dirruns, diff ];
  }
@@ -1898,6 +2044,7 @@ Expr = Sizzle.selectors = {
  },
 
  "PSEUDO": function( pseudo, argument ) {
+
  // pseudo-class names are case-insensitive
  // http://www.w3.org/TR/selectors/#pseudo-classes
  // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
@@ -1917,15 +2064,15 @@ Expr = Sizzle.selectors = {
  if ( fn.length > 1 ) {
  args = [ pseudo, pseudo, "", argument ];
  return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
- markFunction(function( seed, matches ) {
+ markFunction( function( seed, matches ) {
  var idx,
  matched = fn( seed, argument ),
  i = matched.length;
  while ( i-- ) {
- idx = indexOf( seed, matched[i] );
- seed[ idx ] = !( matches[ idx ] = matched[i] );
+ idx = indexOf( seed, matched[ i ] );
+ seed[ idx ] = !( matches[ idx ] = matched[ i ] );
  }
- }) :
+ } ) :
  function( elem ) {
  return fn( elem, 0, args );
  };
@@ -1936,8 +2083,10 @@ Expr = Sizzle.selectors = {
  },
 
  pseudos: {
+
  // Potentially complex pseudos
- "not": markFunction(function( selector ) {
+ "not": markFunction( function( selector ) {
+
  // Trim the selector passed to compile
  // to avoid treating leading and trailing
  // spaces as combinators
@@ -1946,39 +2095,40 @@ Expr = Sizzle.selectors = {
  matcher = compile( selector.replace( rtrim, "$1" ) );
 
  return matcher[ expando ] ?
- markFunction(function( seed, matches, context, xml ) {
+ markFunction( function( seed, matches, _context, xml ) {
  var elem,
  unmatched = matcher( seed, null, xml, [] ),
  i = seed.length;
 
  // Match elements unmatched by `matcher`
  while ( i-- ) {
- if ( (elem = unmatched[i]) ) {
- seed[i] = !(matches[i] = elem);
+ if ( ( elem = unmatched[ i ] ) ) {
+ seed[ i ] = !( matches[ i ] = elem );
  }
  }
- }) :
- function( elem, context, xml ) {
- input[0] = elem;
+ } ) :
+ function( elem, _context, xml ) {
+ input[ 0 ] = elem;
  matcher( input, null, xml, results );
+
  // Don't keep the element (issue #299)
- input[0] = null;
+ input[ 0 ] = null;
  return !results.pop();
  };
- }),
+ } ),
 
- "has": markFunction(function( selector ) {
+ "has": markFunction( function( selector ) {
  return function( elem ) {
  return Sizzle( selector, elem ).length > 0;
  };
- }),
+ } ),
 
- "contains": markFunction(function( text ) {
+ "contains": markFunction( function( text ) {
  text = text.replace( runescape, funescape );
  return function( elem ) {
  return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
  };
- }),
+ } ),
 
  // "Whether an element is represented by a :lang() selector
  // is based solely on the element's language value
@@ -1988,25 +2138,26 @@ Expr = Sizzle.selectors = {
  // The identifier C does not have to be a valid language name."
  // http://www.w3.org/TR/selectors/#lang-pseudo
  "lang": markFunction( function( lang ) {
+
  // lang value must be a valid identifier
- if ( !ridentifier.test(lang || "") ) {
+ if ( !ridentifier.test( lang || "" ) ) {
  Sizzle.error( "unsupported lang: " + lang );
  }
  lang = lang.replace( runescape, funescape ).toLowerCase();
  return function( elem ) {
  var elemLang;
  do {
- if ( (elemLang = documentIsHTML ?
+ if ( ( elemLang = documentIsHTML ?
  elem.lang :
- elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+ elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
 
  elemLang = elemLang.toLowerCase();
  return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
  }
- } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
  return false;
  };
- }),
+ } ),
 
  // Miscellaneous
  "target": function( elem ) {
@@ -2019,7 +2170,9 @@ Expr = Sizzle.selectors = {
  },
 
  "focus": function( elem ) {
- return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ return elem === document.activeElement &&
+ ( !document.hasFocus || document.hasFocus() ) &&
+ !!( elem.type || elem.href || ~elem.tabIndex );
  },
 
  // Boolean properties
@@ -2027,16 +2180,20 @@ Expr = Sizzle.selectors = {
  "disabled": createDisabledPseudo( true ),
 
  "checked": function( elem ) {
+
  // In CSS3, :checked should return both checked and selected elements
  // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
  var nodeName = elem.nodeName.toLowerCase();
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ return ( nodeName === "input" && !!elem.checked ) ||
+ ( nodeName === "option" && !!elem.selected );
  },
 
  "selected": function( elem ) {
+
  // Accessing this property makes selected-by-default
  // options in Safari work properly
  if ( elem.parentNode ) {
+ // eslint-disable-next-line no-unused-expressions
  elem.parentNode.selectedIndex;
  }
 
@@ -2045,6 +2202,7 @@ Expr = Sizzle.selectors = {
 
  // Contents
  "empty": function( elem ) {
+
  // http://www.w3.org/TR/selectors/#empty-pseudo
  // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
  //   but not by others (comment: 8; processing instruction: 7; etc.)
@@ -2058,7 +2216,7 @@ Expr = Sizzle.selectors = {
  },
 
  "parent": function( elem ) {
- return !Expr.pseudos["empty"]( elem );
+ return !Expr.pseudos[ "empty" ]( elem );
  },
 
  // Element/input types
@@ -2082,39 +2240,40 @@ Expr = Sizzle.selectors = {
 
  // Support: IE<8
  // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ ( ( attr = elem.getAttribute( "type" ) ) == null ||
+ attr.toLowerCase() === "text" );
  },
 
  // Position-in-collection
- "first": createPositionalPseudo(function() {
+ "first": createPositionalPseudo( function() {
  return [ 0 ];
- }),
+ } ),
 
- "last": createPositionalPseudo(function( matchIndexes, length ) {
+ "last": createPositionalPseudo( function( _matchIndexes, length ) {
  return [ length - 1 ];
- }),
+ } ),
 
- "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
  return [ argument < 0 ? argument + length : argument ];
- }),
+ } ),
 
- "even": createPositionalPseudo(function( matchIndexes, length ) {
+ "even": createPositionalPseudo( function( matchIndexes, length ) {
  var i = 0;
  for ( ; i < length; i += 2 ) {
  matchIndexes.push( i );
  }
  return matchIndexes;
- }),
+ } ),
 
- "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ "odd": createPositionalPseudo( function( matchIndexes, length ) {
  var i = 1;
  for ( ; i < length; i += 2 ) {
  matchIndexes.push( i );
  }
  return matchIndexes;
- }),
+ } ),
 
- "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ "lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
  var i = argument < 0 ?
  argument + length :
  argument > length ?
@@ -2124,19 +2283,19 @@ Expr = Sizzle.selectors = {
  matchIndexes.push( i );
  }
  return matchIndexes;
- }),
+ } ),
 
- "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ "gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
  var i = argument < 0 ? argument + length : argument;
  for ( ; ++i < length; ) {
  matchIndexes.push( i );
  }
  return matchIndexes;
- })
+ } )
  }
 };
 
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
+Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
 
 // Add button/input type pseudos
 for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
@@ -2167,37 +2326,39 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
  while ( soFar ) {
 
  // Comma and first run
- if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
  if ( match ) {
+
  // Don't consume trailing commas as valid
- soFar = soFar.slice( match[0].length ) || soFar;
+ soFar = soFar.slice( match[ 0 ].length ) || soFar;
  }
- groups.push( (tokens = []) );
+ groups.push( ( tokens = [] ) );
  }
 
  matched = false;
 
  // Combinators
- if ( (match = rcombinators.exec( soFar )) ) {
+ if ( ( match = rcombinators.exec( soFar ) ) ) {
  matched = match.shift();
- tokens.push({
+ tokens.push( {
  value: matched,
+
  // Cast descendant combinators to space
- type: match[0].replace( rtrim, " " )
- });
+ type: match[ 0 ].replace( rtrim, " " )
+ } );
  soFar = soFar.slice( matched.length );
  }
 
  // Filters
  for ( type in Expr.filter ) {
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
- (match = preFilters[ type ]( match ))) ) {
+ if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
+ ( match = preFilters[ type ]( match ) ) ) ) {
  matched = match.shift();
- tokens.push({
+ tokens.push( {
  value: matched,
  type: type,
  matches: match
- });
+ } );
  soFar = soFar.slice( matched.length );
  }
  }
@@ -2214,6 +2375,7 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
  soFar.length :
  soFar ?
  Sizzle.error( selector ) :
+
  // Cache the tokens
  tokenCache( selector, groups ).slice( 0 );
 };
@@ -2223,7 +2385,7 @@ function toSelector( tokens ) {
  len = tokens.length,
  selector = "";
  for ( ; i < len; i++ ) {
- selector += tokens[i].value;
+ selector += tokens[ i ].value;
  }
  return selector;
 }
@@ -2236,9 +2398,10 @@ function addCombinator( matcher, combinator, base ) {
  doneName = done++;
 
  return combinator.first ?
+
  // Check against closest ancestor/preceding element
  function( elem, context, xml ) {
- while ( (elem = elem[ dir ]) ) {
+ while ( ( elem = elem[ dir ] ) ) {
  if ( elem.nodeType === 1 || checkNonElements ) {
  return matcher( elem, context, xml );
  }
@@ -2253,7 +2416,7 @@ function addCombinator( matcher, combinator, base ) {
 
  // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
  if ( xml ) {
- while ( (elem = elem[ dir ]) ) {
+ while ( ( elem = elem[ dir ] ) ) {
  if ( elem.nodeType === 1 || checkNonElements ) {
  if ( matcher( elem, context, xml ) ) {
  return true;
@@ -2261,27 +2424,29 @@ function addCombinator( matcher, combinator, base ) {
  }
  }
  } else {
- while ( (elem = elem[ dir ]) ) {
+ while ( ( elem = elem[ dir ] ) ) {
  if ( elem.nodeType === 1 || checkNonElements ) {
- outerCache = elem[ expando ] || (elem[ expando ] = {});
+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
 
  // Support: IE <9 only
  // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+ uniqueCache = outerCache[ elem.uniqueID ] ||
+ ( outerCache[ elem.uniqueID ] = {} );
 
  if ( skip && skip === elem.nodeName.toLowerCase() ) {
  elem = elem[ dir ] || elem;
- } else if ( (oldCache = uniqueCache[ key ]) &&
+ } else if ( ( oldCache = uniqueCache[ key ] ) &&
  oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
 
  // Assign to newCache so results back-propagate to previous elements
- return (newCache[ 2 ] = oldCache[ 2 ]);
+ return ( newCache[ 2 ] = oldCache[ 2 ] );
  } else {
+
  // Reuse newcache so results back-propagate to previous elements
  uniqueCache[ key ] = newCache;
 
  // A match means we're done; a fail means we have to keep checking
- if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
  return true;
  }
  }
@@ -2297,20 +2462,20 @@ function elementMatcher( matchers ) {
  function( elem, context, xml ) {
  var i = matchers.length;
  while ( i-- ) {
- if ( !matchers[i]( elem, context, xml ) ) {
+ if ( !matchers[ i ]( elem, context, xml ) ) {
  return false;
  }
  }
  return true;
  } :
- matchers[0];
+ matchers[ 0 ];
 }
 
 function multipleContexts( selector, contexts, results ) {
  var i = 0,
  len = contexts.length;
  for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[i], results );
+ Sizzle( selector, contexts[ i ], results );
  }
  return results;
 }
@@ -2323,7 +2488,7 @@ function condense( unmatched, map, filter, context, xml ) {
  mapped = map != null;
 
  for ( ; i < len; i++ ) {
- if ( (elem = unmatched[i]) ) {
+ if ( ( elem = unmatched[ i ] ) ) {
  if ( !filter || filter( elem, context, xml ) ) {
  newUnmatched.push( elem );
  if ( mapped ) {
@@ -2343,14 +2508,18 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
  if ( postFinder && !postFinder[ expando ] ) {
  postFinder = setMatcher( postFinder, postSelector );
  }
- return markFunction(function( seed, results, context, xml ) {
+ return markFunction( function( seed, results, context, xml ) {
  var temp, i, elem,
  preMap = [],
  postMap = [],
  preexisting = results.length,
 
  // Get initial elements from seed or context
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+ elems = seed || multipleContexts(
+ selector || "*",
+ context.nodeType ? [ context ] : context,
+ []
+ ),
 
  // Prefilter to get matcher input, preserving a map for seed-results synchronization
  matcherIn = preFilter && ( seed || !selector ) ?
@@ -2358,6 +2527,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
  elems,
 
  matcherOut = matcher ?
+
  // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
  postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
 
@@ -2381,8 +2551,8 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
  // Un-match failing elements by moving them back to matcherIn
  i = temp.length;
  while ( i-- ) {
- if ( (elem = temp[i]) ) {
- matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ if ( ( elem = temp[ i ] ) ) {
+ matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
  }
  }
  }
@@ -2390,25 +2560,27 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
  if ( seed ) {
  if ( postFinder || preFilter ) {
  if ( postFinder ) {
+
  // Get the final matcherOut by condensing this intermediate into postFinder contexts
  temp = [];
  i = matcherOut.length;
  while ( i-- ) {
- if ( (elem = matcherOut[i]) ) {
+ if ( ( elem = matcherOut[ i ] ) ) {
+
  // Restore matcherIn since elem is not yet a final match
- temp.push( (matcherIn[i] = elem) );
+ temp.push( ( matcherIn[ i ] = elem ) );
  }
  }
- postFinder( null, (matcherOut = []), temp, xml );
+ postFinder( null, ( matcherOut = [] ), temp, xml );
  }
 
  // Move matched elements from seed to results to keep them synchronized
  i = matcherOut.length;
  while ( i-- ) {
- if ( (elem = matcherOut[i]) &&
- (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+ if ( ( elem = matcherOut[ i ] ) &&
+ ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
 
- seed[temp] = !(results[temp] = elem);
+ seed[ temp ] = !( results[ temp ] = elem );
  }
  }
  }
@@ -2426,14 +2598,14 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
  push.apply( results, matcherOut );
  }
  }
- });
+ } );
 }
 
 function matcherFromTokens( tokens ) {
  var checkContext, matcher, j,
  len = tokens.length,
- leadingRelative = Expr.relative[ tokens[0].type ],
- implicitRelative = leadingRelative || Expr.relative[" "],
+ leadingRelative = Expr.relative[ tokens[ 0 ].type ],
+ implicitRelative = leadingRelative || Expr.relative[ " " ],
  i = leadingRelative ? 1 : 0,
 
  // The foundational matcher ensures that elements are reachable from top-level context(s)
@@ -2445,38 +2617,43 @@ function matcherFromTokens( tokens ) {
  }, implicitRelative, true ),
  matchers = [ function( elem, context, xml ) {
  var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
- (checkContext = context).nodeType ?
+ ( checkContext = context ).nodeType ?
  matchContext( elem, context, xml ) :
  matchAnyContext( elem, context, xml ) );
+
  // Avoid hanging onto element (issue #299)
  checkContext = null;
  return ret;
  } ];
 
  for ( ; i < len; i++ ) {
- if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
- matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
+ matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
  } else {
- matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+ matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
 
  // Return special upon seeing a positional matcher
  if ( matcher[ expando ] ) {
+
  // Find the next relative operator (if any) for proper handling
  j = ++i;
  for ( ; j < len; j++ ) {
- if ( Expr.relative[ tokens[j].type ] ) {
+ if ( Expr.relative[ tokens[ j ].type ] ) {
  break;
  }
  }
  return setMatcher(
  i > 1 && elementMatcher( matchers ),
  i > 1 && toSelector(
- // If the preceding token was a descendant combinator, insert an implicit any-element `*`
- tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens
+ .slice( 0, i - 1 )
+ .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
  ).replace( rtrim, "$1" ),
  matcher,
  i < j && matcherFromTokens( tokens.slice( i, j ) ),
- j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
  j < len && toSelector( tokens )
  );
  }
@@ -2497,28 +2674,40 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  unmatched = seed && [],
  setMatched = [],
  contextBackup = outermostContext,
+
  // We must always have either seed elements or outermost context
- elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
+
  // Use integer dirruns iff this is the outermost matcher
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
  len = elems.length;
 
  if ( outermost ) {
- outermostContext = context === document || context || outermost;
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ outermostContext = context == document || context || outermost;
  }
 
  // Add elements passing elementMatchers directly to results
  // Support: IE<9, Safari
  // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
- for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
  if ( byElement && elem ) {
  j = 0;
- if ( !context && elem.ownerDocument !== document ) {
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( !context && elem.ownerDocument != document ) {
  setDocument( elem );
  xml = !documentIsHTML;
  }
- while ( (matcher = elementMatchers[j++]) ) {
- if ( matcher( elem, context || document, xml) ) {
+ while ( ( matcher = elementMatchers[ j++ ] ) ) {
+ if ( matcher( elem, context || document, xml ) ) {
  results.push( elem );
  break;
  }
@@ -2530,8 +2719,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
 
  // Track unmatched elements for set filters
  if ( bySet ) {
+
  // They will have gone through all possible matchers
- if ( (elem = !matcher && elem) ) {
+ if ( ( elem = !matcher && elem ) ) {
  matchedCount--;
  }
 
@@ -2555,16 +2745,17 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  // numerically zero.
  if ( bySet && i !== matchedCount ) {
  j = 0;
- while ( (matcher = setMatchers[j++]) ) {
+ while ( ( matcher = setMatchers[ j++ ] ) ) {
  matcher( unmatched, setMatched, context, xml );
  }
 
  if ( seed ) {
+
  // Reintegrate element matches to eliminate the need for sorting
  if ( matchedCount > 0 ) {
  while ( i-- ) {
- if ( !(unmatched[i] || setMatched[i]) ) {
- setMatched[i] = pop.call( results );
+ if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
+ setMatched[ i ] = pop.call( results );
  }
  }
  }
@@ -2605,13 +2796,14 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
  cached = compilerCache[ selector + " " ];
 
  if ( !cached ) {
+
  // Generate a function of recursive functions that can be used to check each element
  if ( !match ) {
  match = tokenize( selector );
  }
  i = match.length;
  while ( i-- ) {
- cached = matcherFromTokens( match[i] );
+ cached = matcherFromTokens( match[ i ] );
  if ( cached[ expando ] ) {
  setMatchers.push( cached );
  } else {
@@ -2620,7 +2812,10 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
  }
 
  // Cache the compiled function
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+ cached = compilerCache(
+ selector,
+ matcherFromGroupMatchers( elementMatchers, setMatchers )
+ );
 
  // Save selector and tokenization
  cached.selector = selector;
@@ -2640,7 +2835,7 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
 select = Sizzle.select = function( selector, context, results, seed ) {
  var i, tokens, token, type, find,
  compiled = typeof selector === "function" && selector,
- match = !seed && tokenize( (selector = compiled.selector || selector) );
+ match = !seed && tokenize( ( selector = compiled.selector || selector ) );
 
  results = results || [];
 
@@ -2649,11 +2844,12 @@ select = Sizzle.select = function( selector, context, results, seed ) {
  if ( match.length === 1 ) {
 
  // Reduce context if the leading compound selector is an ID
- tokens = match[0] = match[0].slice( 0 );
- if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
- context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
+ tokens = match[ 0 ] = match[ 0 ].slice( 0 );
+ if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
 
- context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
+ .replace( runescape, funescape ), context ) || [] )[ 0 ];
  if ( !context ) {
  return results;
 
@@ -2666,20 +2862,22 @@ select = Sizzle.select = function( selector, context, results, seed ) {
  }
 
  // Fetch a seed set for right-to-left matching
- i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
  while ( i-- ) {
- token = tokens[i];
+ token = tokens[ i ];
 
  // Abort if we hit a combinator
- if ( Expr.relative[ (type = token.type) ] ) {
+ if ( Expr.relative[ ( type = token.type ) ] ) {
  break;
  }
- if ( (find = Expr.find[ type ]) ) {
+ if ( ( find = Expr.find[ type ] ) ) {
+
  // Search, expanding context for leading sibling combinators
- if ( (seed = find(
- token.matches[0].replace( runescape, funescape ),
- rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
- )) ) {
+ if ( ( seed = find(
+ token.matches[ 0 ].replace( runescape, funescape ),
+ rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
+ context
+ ) ) ) {
 
  // If seed is empty or no tokens remain, we can return early
  tokens.splice( i, 1 );
@@ -2710,7 +2908,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
 // One-time assignments
 
 // Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
 
 // Support: Chrome 14-35+
 // Always assume duplicates if they aren't passed to the comparison function
@@ -2721,58 +2919,59 @@ setDocument();
 
 // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
 // Detached nodes confoundingly follow *each other*
-support.sortDetached = assert(function( el ) {
+support.sortDetached = assert( function( el ) {
+
  // Should return 1, but returns 4 (following)
- return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
-});
+ return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
+} );
 
 // Support: IE<8
 // Prevent attribute/property "interpolation"
 // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert(function( el ) {
+if ( !assert( function( el ) {
  el.innerHTML = "<a href='#'></a>";
- return el.firstChild.getAttribute("href") === "#" ;
-}) ) {
+ return el.firstChild.getAttribute( "href" ) === "#";
+} ) ) {
  addHandle( "type|href|height|width", function( elem, name, isXML ) {
  if ( !isXML ) {
  return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
  }
- });
+ } );
 }
 
 // Support: IE<9
 // Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert(function( el ) {
+if ( !support.attributes || !assert( function( el ) {
  el.innerHTML = "<input/>";
  el.firstChild.setAttribute( "value", "" );
  return el.firstChild.getAttribute( "value" ) === "";
-}) ) {
- addHandle( "value", function( elem, name, isXML ) {
+} ) ) {
+ addHandle( "value", function( elem, _name, isXML ) {
  if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
  return elem.defaultValue;
  }
- });
+ } );
 }
 
 // Support: IE<9
 // Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert(function( el ) {
- return el.getAttribute("disabled") == null;
-}) ) {
+if ( !assert( function( el ) {
+ return el.getAttribute( "disabled" ) == null;
+} ) ) {
  addHandle( booleans, function( elem, name, isXML ) {
  var val;
  if ( !isXML ) {
  return elem[ name ] === true ? name.toLowerCase() :
- (val = elem.getAttributeNode( name )) && val.specified ?
+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
  val.value :
- null;
+ null;
  }
- });
+ } );
 }
 
 return Sizzle;
 
-})( window );
+} )( window );
 
 
 
@@ -3141,7 +3340,7 @@ jQuery.each( {
  parents: function( elem ) {
  return dir( elem, "parentNode" );
  },
- parentsUntil: function( elem, i, until ) {
+ parentsUntil: function( elem, _i, until ) {
  return dir( elem, "parentNode", until );
  },
  next: function( elem ) {
@@ -3156,10 +3355,10 @@ jQuery.each( {
  prevAll: function( elem ) {
  return dir( elem, "previousSibling" );
  },
- nextUntil: function( elem, i, until ) {
+ nextUntil: function( elem, _i, until ) {
  return dir( elem, "nextSibling", until );
  },
- prevUntil: function( elem, i, until ) {
+ prevUntil: function( elem, _i, until ) {
  return dir( elem, "previousSibling", until );
  },
  siblings: function( elem ) {
@@ -3169,7 +3368,13 @@ jQuery.each( {
  return siblings( elem.firstChild );
  },
  contents: function( elem ) {
- if ( typeof elem.contentDocument !== "undefined" ) {
+ if ( elem.contentDocument != null &&
+
+ // Support: IE 11+
+ // <object> elements with no `data` attribute has an object
+ // `contentDocument` with a `null` prototype.
+ getProto( elem.contentDocument ) ) {
+
  return elem.contentDocument;
  }
 
@@ -3512,7 +3717,7 @@ jQuery.extend( {
  var fns = arguments;
 
  return jQuery.Deferred( function( newDefer ) {
- jQuery.each( tuples, function( i, tuple ) {
+ jQuery.each( tuples, function( _i, tuple ) {
 
  // Map tuples (progress, done, fail) to arguments (done, fail, progress)
  var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
@@ -3965,7 +4170,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
  // ...except when executing function values
  } else {
  bulk = fn;
- fn = function( elem, key, value ) {
+ fn = function( elem, _key, value ) {
  return bulk.call( jQuery( elem ), value );
  };
  }
@@ -4000,7 +4205,7 @@ var rmsPrefix = /^-ms-/,
  rdashAlpha = /-([a-z])/g;
 
 // Used by camelCase as callback to replace()
-function fcamelCase( all, letter ) {
+function fcamelCase( _all, letter ) {
  return letter.toUpperCase();
 }
 
@@ -4528,27 +4733,6 @@ var isHiddenWithinTree = function( elem, el ) {
  jQuery.css( elem, "display" ) === "none";
  };
 
-var swap = function( elem, options, callback, args ) {
- var ret, name,
- old = {};
-
- // 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;
-};
-
-
 
 
 function adjustCSS( elem, prop, valueParts, tween ) {
@@ -4719,11 +4903,40 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
 
 
 
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
+( function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Android 4.0 - 4.3 only
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Android <=4.1 only
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE <=11 only
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
 
  // Support: IE <=9 only
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
+ // IE <=9 replaces <option> tags with their contents when inserted outside of
+ // the select element.
+ div.innerHTML = "<option></option>";
+ support.option = !!div.lastChild;
+} )();
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
 
  // XHTML parsers do not magically insert elements in the
  // same way that tag soup parsers do. So we cannot shorten
@@ -4736,12 +4949,14 @@ var wrapMap = {
  _default: [ 0, "", "" ]
 };
 
-// Support: IE <=9 only
-wrapMap.optgroup = wrapMap.option;
-
 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
 wrapMap.th = wrapMap.td;
 
+// Support: IE <=9 only
+if ( !support.option ) {
+ wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
+}
+
 
 function getAll( context, tag ) {
 
@@ -4874,32 +5089,6 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
 }
 
 
-( function() {
- var fragment = document.createDocumentFragment(),
- div = fragment.appendChild( document.createElement( "div" ) ),
- input = document.createElement( "input" );
-
- // Support: Android 4.0 - 4.3 only
- // Check state lost if the name is set (#11217)
- // Support: Windows Web Apps (WWA)
- // `name` and `type` must use .setAttribute for WWA (#14901)
- input.setAttribute( "type", "radio" );
- input.setAttribute( "checked", "checked" );
- input.setAttribute( "name", "t" );
-
- div.appendChild( input );
-
- // Support: Android <=4.1 only
- // Older WebKit doesn't clone checked state correctly in fragments
- support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- // Support: IE <=11 only
- // Make sure textarea (and checkbox) defaultValue is properly cloned
- div.innerHTML = "<textarea>x</textarea>";
- support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-} )();
-
-
 var
  rkeyEvent = /^key/,
  rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
@@ -5008,8 +5197,8 @@ jQuery.event = {
  special, handlers, type, namespaces, origType,
  elemData = dataPriv.get( elem );
 
- // Don't attach events to noData or text/comment nodes (but allow plain objects)
- if ( !elemData ) {
+ // Only attach events to objects that accept data
+ if ( !acceptData( elem ) ) {
  return;
  }
 
@@ -5033,7 +5222,7 @@ jQuery.event = {
 
  // Init the element's event structure and main handler, if this is the first
  if ( !( events = elemData.events ) ) {
- events = elemData.events = {};
+ events = elemData.events = Object.create( null );
  }
  if ( !( eventHandle = elemData.handle ) ) {
  eventHandle = elemData.handle = function( e ) {
@@ -5191,12 +5380,15 @@ jQuery.event = {
 
  dispatch: function( nativeEvent ) {
 
- // Make a writable jQuery.Event from the native event object
- var event = jQuery.event.fix( nativeEvent );
-
  var i, j, ret, matched, handleObj, handlerQueue,
  args = new Array( arguments.length ),
- handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( nativeEvent ),
+
+ handlers = (
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
  special = jQuery.event.special[ event.type ] || {};
 
  // Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5771,13 +5963,6 @@ jQuery.fn.extend( {
 
 var
 
- /* eslint-disable max-len */
-
- // See https://github.com/eslint/eslint/issues/3229
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
-
- /* eslint-enable */
-
  // Support: IE <=10 - 11, Edge 12 - 13 only
  // In IE/Edge using regex groups here causes severe slowdowns.
  // See https://connect.microsoft.com/IE/feedback/details/1736512/
@@ -5814,7 +5999,7 @@ function restoreScript( elem ) {
 }
 
 function cloneCopyEvent( src, dest ) {
- var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+ var i, l, type, pdataOld, udataOld, udataCur, events;
 
  if ( dest.nodeType !== 1 ) {
  return;
@@ -5822,13 +6007,11 @@ function cloneCopyEvent( src, dest ) {
 
  // 1. Copy private data: events, handlers, etc.
  if ( dataPriv.hasData( src ) ) {
- pdataOld = dataPriv.access( src );
- pdataCur = dataPriv.set( dest, pdataOld );
+ pdataOld = dataPriv.get( src );
  events = pdataOld.events;
 
  if ( events ) {
- delete pdataCur.handle;
- pdataCur.events = {};
+ dataPriv.remove( dest, "handle events" );
 
  for ( type in events ) {
  for ( i = 0, l = events[ type ].length; i < l; i++ ) {
@@ -5864,7 +6047,7 @@ function fixInput( src, dest ) {
 function domManip( collection, args, callback, ignored ) {
 
  // Flatten any nested arrays
- args = concat.apply( [], args );
+ args = flat( args );
 
  var fragment, first, scripts, hasScripts, node, doc,
  i = 0,
@@ -5939,7 +6122,7 @@ function domManip( collection, args, callback, ignored ) {
  if ( jQuery._evalUrl && !node.noModule ) {
  jQuery._evalUrl( node.src, {
  nonce: node.nonce || node.getAttribute( "nonce" )
- } );
+ }, doc );
  }
  } else {
  DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
@@ -5976,7 +6159,7 @@ function remove( elem, selector, keepData ) {
 
 jQuery.extend( {
  htmlPrefilter: function( html ) {
- return html.replace( rxhtmlTag, "<$1></$2>" );
+ return html;
  },
 
  clone: function( elem, dataAndEvents, deepDataAndEvents ) {
@@ -6238,6 +6421,27 @@ var getStyles = function( elem ) {
  return view.getComputedStyle( elem );
  };
 
+var swap = function( elem, options, callback ) {
+ var ret, name,
+ old = {};
+
+ // 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.call( elem );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
 var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
 
 
@@ -6295,7 +6499,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
  }
 
  var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
- reliableMarginLeftVal,
+ reliableTrDimensionsVal, reliableMarginLeftVal,
  container = document.createElement( "div" ),
  div = document.createElement( "div" );
 
@@ -6330,6 +6534,35 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
  scrollboxSize: function() {
  computeStyleTests();
  return scrollboxSizeVal;
+ },
+
+ // Support: IE 9 - 11+, Edge 15 - 18+
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
+ // set in CSS while `offset*` properties report correct values.
+ // Behavior in IE 9 is more subtle than in newer versions & it passes
+ // some versions of this test; make sure not to make it pass there!
+ reliableTrDimensions: function() {
+ var table, tr, trChild, trStyle;
+ if ( reliableTrDimensionsVal == null ) {
+ table = document.createElement( "table" );
+ tr = document.createElement( "tr" );
+ trChild = document.createElement( "div" );
+
+ table.style.cssText = "position:absolute;left:-11111px";
+ tr.style.height = "1px";
+ trChild.style.height = "9px";
+
+ documentElement
+ .appendChild( table )
+ .appendChild( tr )
+ .appendChild( trChild );
+
+ trStyle = window.getComputedStyle( tr );
+ reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+
+ documentElement.removeChild( table );
+ }
+ return reliableTrDimensionsVal;
  }
  } );
 } )();
@@ -6454,7 +6687,7 @@ var
  fontWeight: "400"
  };
 
-function setPositiveNumber( elem, value, subtract ) {
+function setPositiveNumber( _elem, value, subtract ) {
 
  // Any relative (+/-) values have already been
  // normalized at this point
@@ -6559,17 +6792,26 @@ function getWidthOrHeight( elem, dimension, extra ) {
  }
 
 
- // Fall back to offsetWidth/offsetHeight when value is "auto"
- // This happens for inline elements with no explicit setting (gh-3571)
- // Support: Android <=4.1 - 4.3 only
- // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
- // Support: IE 9-11 only
- // Also use offsetWidth/offsetHeight for when box sizing is unreliable
- // We use getClientRects() to check for hidden/disconnected.
- // In those cases, the computed value can be trusted to be border-box
+ // Support: IE 9 - 11 only
+ // Use offsetWidth/offsetHeight for when box sizing is unreliable.
+ // In those cases, the computed value can be trusted to be border-box.
  if ( ( !support.boxSizingReliable() && isBorderBox ||
+
+ // Support: IE 10 - 11+, Edge 15 - 18+
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
+ // set in CSS while `offset*` properties report correct values.
+ // Interestingly, in some cases IE 9 doesn't suffer from this issue.
+ !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
+
+ // Fall back to offsetWidth/offsetHeight when value is "auto"
+ // This happens for inline elements with no explicit setting (gh-3571)
  val === "auto" ||
+
+ // Support: Android <=4.1 - 4.3 only
+ // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
  !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
+
+ // Make sure the element is visible & connected
  elem.getClientRects().length ) {
 
  isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
@@ -6764,7 +7006,7 @@ jQuery.extend( {
  }
 } );
 
-jQuery.each( [ "height", "width" ], function( i, dimension ) {
+jQuery.each( [ "height", "width" ], function( _i, dimension ) {
  jQuery.cssHooks[ dimension ] = {
  get: function( elem, computed, extra ) {
  if ( computed ) {
@@ -7537,7 +7779,7 @@ jQuery.fn.extend( {
  clearQueue = type;
  type = undefined;
  }
- if ( clearQueue && type !== false ) {
+ if ( clearQueue ) {
  this.queue( type || "fx", [] );
  }
 
@@ -7620,7 +7862,7 @@ jQuery.fn.extend( {
  }
 } );
 
-jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
+jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
  var cssFn = jQuery.fn[ name ];
  jQuery.fn[ name ] = function( speed, easing, callback ) {
  return speed == null || typeof speed === "boolean" ?
@@ -7841,7 +8083,7 @@ boolHook = {
  }
 };
 
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
  var getter = attrHandle[ name ] || jQuery.find.attr;
 
  attrHandle[ name ] = function( elem, name, isXML ) {
@@ -8465,7 +8707,9 @@ jQuery.extend( jQuery.event, {
  special.bindType || type;
 
  // jQuery handler
- handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
+ handle = (
+ dataPriv.get( cur, "events" ) || Object.create( null )
+ )[ event.type ] &&
  dataPriv.get( cur, "handle" );
  if ( handle ) {
  handle.apply( cur, data );
@@ -8576,7 +8820,10 @@ if ( !support.focusin ) {
 
  jQuery.event.special[ fix ] = {
  setup: function() {
- var doc = this.ownerDocument || this,
+
+ // Handle: regular nodes (via `this.ownerDocument`), window
+ // (via `this.document`) & document (via `this`).
+ var doc = this.ownerDocument || this.document || this,
  attaches = dataPriv.access( doc, fix );
 
  if ( !attaches ) {
@@ -8585,7 +8832,7 @@ if ( !support.focusin ) {
  dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
  },
  teardown: function() {
- var doc = this.ownerDocument || this,
+ var doc = this.ownerDocument || this.document || this,
  attaches = dataPriv.access( doc, fix ) - 1;
 
  if ( !attaches ) {
@@ -8601,7 +8848,7 @@ if ( !support.focusin ) {
 }
 var location = window.location;
 
-var nonce = Date.now();
+var nonce = { guid: Date.now() };
 
 var rquery = ( /\?/ );
 
@@ -8733,7 +8980,7 @@ jQuery.fn.extend( {
  rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
  ( this.checked || !rcheckableType.test( type ) );
  } )
- .map( function( i, elem ) {
+ .map( function( _i, elem ) {
  var val = jQuery( this ).val();
 
  if ( val == null ) {
@@ -9346,7 +9593,8 @@ jQuery.extend( {
  // Add or update anti-cache param if needed
  if ( s.cache === false ) {
  cacheURL = cacheURL.replace( rantiCache, "$1" );
- uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
+ uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
+ uncached;
  }
 
  // Put hash and anti-cache on the URL that will be requested (gh-1732)
@@ -9479,6 +9727,11 @@ jQuery.extend( {
  response = ajaxHandleResponses( s, jqXHR, responses );
  }
 
+ // Use a noop converter for missing script
+ if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ s.converters[ "text script" ] = function() {};
+ }
+
  // Convert no matter what (that way responseXXX fields are always set)
  response = ajaxConvert( s, response, jqXHR, isSuccess );
 
@@ -9569,7 +9822,7 @@ jQuery.extend( {
  }
 } );
 
-jQuery.each( [ "get", "post" ], function( i, method ) {
+jQuery.each( [ "get", "post" ], function( _i, method ) {
  jQuery[ method ] = function( url, data, callback, type ) {
 
  // Shift arguments if data argument was omitted
@@ -9590,8 +9843,17 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
  };
 } );
 
+jQuery.ajaxPrefilter( function( s ) {
+ var i;
+ for ( i in s.headers ) {
+ if ( i.toLowerCase() === "content-type" ) {
+ s.contentType = s.headers[ i ] || "";
+ }
+ }
+} );
+
 
-jQuery._evalUrl = function( url, options ) {
+jQuery._evalUrl = function( url, options, doc ) {
  return jQuery.ajax( {
  url: url,
 
@@ -9609,7 +9871,7 @@ jQuery._evalUrl = function( url, options ) {
  "text script": function() {}
  },
  dataFilter: function( response ) {
- jQuery.globalEval( response, options );
+ jQuery.globalEval( response, options, doc );
  }
  } );
 };
@@ -9931,7 +10193,7 @@ var oldCallbacks = [],
 jQuery.ajaxSetup( {
  jsonp: "callback",
  jsonpCallback: function() {
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
  this[ callback ] = true;
  return callback;
  }
@@ -10148,23 +10410,6 @@ jQuery.fn.load = function( url, params, callback ) {
 
 
 
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [
- "ajaxStart",
- "ajaxStop",
- "ajaxComplete",
- "ajaxError",
- "ajaxSuccess",
- "ajaxSend"
-], function( i, type ) {
- jQuery.fn[ type ] = function( fn ) {
- return this.on( type, fn );
- };
-} );
-
-
-
-
 jQuery.expr.pseudos.animated = function( elem ) {
  return jQuery.grep( jQuery.timers, function( fn ) {
  return elem === fn.elem;
@@ -10221,6 +10466,12 @@ jQuery.offset = {
  options.using.call( elem, props );
 
  } else {
+ if ( typeof props.top === "number" ) {
+ props.top += "px";
+ }
+ if ( typeof props.left === "number" ) {
+ props.left += "px";
+ }
  curElem.css( props );
  }
  }
@@ -10371,7 +10622,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
 // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
 // getComputedStyle returns percent when specified for top/left/bottom/right;
 // rather than make the css module depend on the offset module, just check for it here
-jQuery.each( [ "top", "left" ], function( i, prop ) {
+jQuery.each( [ "top", "left" ], function( _i, prop ) {
  jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
  function( elem, computed ) {
  if ( computed ) {
@@ -10434,25 +10685,19 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
 } );
 
 
-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
- jQuery.fn[ name ] = function( data, fn ) {
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
+jQuery.each( [
+ "ajaxStart",
+ "ajaxStop",
+ "ajaxComplete",
+ "ajaxError",
+ "ajaxSuccess",
+ "ajaxSend"
+], function( _i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
  };
 } );
 
-jQuery.fn.extend( {
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-} );
-
 
 
 
@@ -10474,9 +10719,33 @@ jQuery.fn.extend( {
  return arguments.length === 1 ?
  this.off( selector, "**" ) :
  this.off( types, selector || "**", fn );
+ },
+
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
  }
 } );
 
+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
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+ } );
+
+
+
+
+// Support: Android <=4.0 only
+// Make sure we trim BOM and NBSP
+var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
 // Bind a function to a context, optionally partially applying any
 // arguments.
 // jQuery.proxy is deprecated to promote standards (specifically Function#bind)
@@ -10539,6 +10808,11 @@ jQuery.isNumeric = function( obj ) {
  !isNaN( obj - parseFloat( obj ) );
 };
 
+jQuery.trim = function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+};
 
 
 
@@ -10587,7 +10861,7 @@ jQuery.noConflict = function( deep ) {
 // Expose jQuery and $ identifiers, even in AMD
 // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
 // and CommonJS for browser emulators (#13566)
-if ( !noGlobal ) {
+if ( typeof noGlobal === "undefined" ) {
  window.jQuery = window.$ = jQuery;
 }
 
diff --git a/themes/common-theme/webapp/common/js/jquery/jquery-3.5.1.min.js b/themes/common-theme/webapp/common/js/jquery/jquery-3.5.1.min.js
new file mode 100644
index 0000000..b061403
--- /dev/null
+++ b/themes/common-theme/webapp/common/js/jquery/jquery-3.5.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l= [...]
diff --git a/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.0.0.js b/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.0.0.js
deleted file mode 100644
index 05b1a80..0000000
--- a/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.0.0.js
+++ /dev/null
@@ -1,540 +0,0 @@
-/*!
- * jQuery Migrate - v3.0.0 - 2016-06-09
- * Copyright jQuery Foundation and other contributors
- */
-(function( jQuery, window ) {
-"use strict";
-
-
-jQuery.migrateVersion = "3.0.0";
-
-
-( function() {
-
- // Support: IE9 only
- // IE9 only creates console object when dev tools are first opened
- // Also, avoid Function#bind here to simplify PhantomJS usage
- var log = window.console && window.console.log &&
- function() { window.console.log.apply( window.console, arguments ); },
- rbadVersions = /^[12]\./;
-
- if ( !log ) {
- return;
- }
-
- // Need jQuery 3.0.0+ and no older Migrate loaded
- if ( !jQuery || rbadVersions.test( jQuery.fn.jquery ) ) {
- log( "JQMIGRATE: jQuery 3.0.0+ REQUIRED" );
- }
- if ( jQuery.migrateWarnings ) {
- log( "JQMIGRATE: Migrate plugin loaded multiple times" );
- }
-
- // Show a message on the console so devs know we're active
- log( "JQMIGRATE: Migrate is installed" +
- ( jQuery.migrateMute ? "" : " with logging active" ) +
- ", version " + jQuery.migrateVersion );
-
-} )();
-
-var warnedAbout = {};
-
-// 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( 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 ) {
- Object.defineProperty( obj, prop, {
- configurable: true,
- enumerable: true,
- get: function() {
- migrateWarn( msg );
- return value;
- }
- } );
-}
-
-if ( document.compatMode === "BackCompat" ) {
-
- // JQuery has never supported or tested Quirks Mode
- migrateWarn( "jQuery is not compatible with Quirks Mode" );
-}
-
-
-var oldInit = jQuery.fn.init,
- oldIsNumeric = jQuery.isNumeric,
- oldFind = jQuery.find,
- rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
- rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g;
-
-jQuery.fn.init = function( arg1 ) {
- var args = Array.prototype.slice.call( arguments );
-
- if ( typeof arg1 === "string" && arg1 === "#" ) {
-
- // JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0
- migrateWarn( "jQuery( '#' ) is not a valid selector" );
- args[ 0 ] = [];
- }
-
- return oldInit.apply( this, args );
-};
-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 ];
- }
-}
-
-// 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;
-};
-
-jQuery.parseJSON = function() {
- migrateWarn( "jQuery.parseJSON is deprecated; use JSON.parse" );
- return JSON.parse.apply( null, arguments );
-};
-
-jQuery.isNumeric = function( val ) {
-
- // The jQuery 2.2.3 implementation of isNumeric
- function isNumeric2( obj ) {
- var realStringObj = obj && obj.toString();
- return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
- }
-
- var newValue = oldIsNumeric( val ),
- oldValue = isNumeric2( val );
-
- if ( newValue !== oldValue ) {
- migrateWarn( "jQuery.isNumeric() should not be called on constructed objects" );
- }
-
- return oldValue;
-};
-
-migrateWarnProp( jQuery, "unique", jQuery.uniqueSort,
- "jQuery.unique is deprecated, use jQuery.uniqueSort" );
-
-// Now jQuery.expr.pseudos is the standard incantation
-migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos,
- "jQuery.expr.filters is now jQuery.expr.pseudos" );
-migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos,
- "jQuery.expr[\":\"] is now jQuery.expr.pseudos" );
-
-
-var oldAjax = jQuery.ajax;
-
-jQuery.ajax = function( ) {
- var jQXHR = oldAjax.apply( this, arguments );
-
- // Be sure we got a jQXHR (e.g., not sync)
- if ( jQXHR.promise ) {
- migrateWarnProp( jQXHR, "success", jQXHR.done,
- "jQXHR.success is deprecated and removed" );
- migrateWarnProp( jQXHR, "error", jQXHR.fail,
- "jQXHR.error is deprecated and removed" );
- migrateWarnProp( jQXHR, "complete", jQXHR.always,
- "jQXHR.complete is deprecated and removed" );
- }
-
- return jQXHR;
-};
-
-
-var oldRemoveAttr = jQuery.fn.removeAttr,
- oldToggleClass = jQuery.fn.toggleClass,
- rmatchNonSpace = /\S+/g;
-
-jQuery.fn.removeAttr = function( name ) {
- var self = this;
-
- jQuery.each( name.match( rmatchNonSpace ), function( i, attr ) {
- if ( jQuery.expr.match.bool.test( attr ) ) {
- migrateWarn( "jQuery.fn.removeAttr no longer sets boolean properties: " + attr );
- self.prop( attr, false );
- }
- } );
-
- return oldRemoveAttr.apply( this, arguments );
-};
-
-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( "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__" ) || ""
- );
- }
- } );
-};
-
-
-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;
-};
-
-var oldData = jQuery.data;
-
-jQuery.data = function( elem, name, value ) {
- var curData;
-
- // If the name is transformed, look for the un-transformed name in the data object
- if ( name && name !== jQuery.camelCase( name ) ) {
- curData = jQuery.hasData( elem ) && oldData.call( this, elem );
- if ( curData && name in curData ) {
- migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name );
- if ( arguments.length > 2 ) {
- curData[ name ] = value;
- }
- return curData[ name ];
- }
- }
-
- return oldData.apply( this, arguments );
-};
-
-var oldTweenRun = jQuery.Tween.prototype.run;
-
-jQuery.Tween.prototype.run = function( percent ) {
- if ( jQuery.easing[ this.easing ].length > 1 ) {
- migrateWarn(
- "easing function " +
- "\"jQuery.easing." + this.easing.toString() +
- "\" should use only first argument"
- );
-
- jQuery.easing[ this.easing ] = jQuery.easing[ this.easing ].bind(
- jQuery.easing,
- percent, this.options.duration * percent, 0, 1, this.options.duration
- );
- }
-
- oldTweenRun.apply( this, arguments );
-};
-
-var oldLoad = jQuery.fn.load,
- originalFix = jQuery.event.fix;
-
-jQuery.event.props = [];
-jQuery.event.fixHooks = {};
-
-jQuery.event.fix = function( originalEvent ) {
- var event,
- type = originalEvent.type,
- fixHook = this.fixHooks[ type ],
- props = jQuery.event.props;
-
- if ( props.length ) {
- migrateWarn( "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( "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;
-};
-
-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.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;
- };
-
-} );
-
-// Trigger "ready" event only once, on document ready
-jQuery( function() {
- jQuery( document ).triggerHandler( "ready" );
-} );
-
-jQuery.event.special.ready = {
- setup: function() {
- if ( this === document ) {
- migrateWarn( "'ready' event is deprecated" );
- }
- }
-};
-
-jQuery.fn.extend( {
-
- bind: function( types, data, fn ) {
- migrateWarn( "jQuery.fn.bind() is deprecated" );
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- migrateWarn( "jQuery.fn.unbind() is deprecated" );
- return this.off( types, null, fn );
- },
- delegate: function( selector, types, data, fn ) {
- migrateWarn( "jQuery.fn.delegate() is deprecated" );
- return this.on( types, selector, data, fn );
- },
- undelegate: function( selector, types, fn ) {
- migrateWarn( "jQuery.fn.undelegate() is deprecated" );
- return arguments.length === 1 ?
- this.off( selector, "**" ) :
- this.off( types, selector || "**", fn );
- }
-} );
-
-
-var oldOffset = jQuery.fn.offset;
-
-jQuery.fn.offset = function() {
- var docElem,
- elem = this[ 0 ],
- origin = { top: 0, left: 0 };
-
- if ( !elem || !elem.nodeType ) {
- migrateWarn( "jQuery.fn.offset() requires a valid DOM element" );
- return origin;
- }
-
- docElem = ( elem.ownerDocument || document ).documentElement;
- if ( !jQuery.contains( docElem, elem ) ) {
- migrateWarn( "jQuery.fn.offset() requires an element connected to a document" );
- return origin;
- }
-
- return oldOffset.apply( this, arguments );
-};
-
-
-var oldParam = jQuery.param;
-
-jQuery.param = function( data, traditional ) {
- var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
-
- if ( traditional === undefined && ajaxTraditional ) {
-
- migrateWarn( "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" );
- traditional = ajaxTraditional;
- }
-
- return oldParam.call( this, data, traditional );
-};
-
-var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
-
-jQuery.fn.andSelf = function() {
- migrateWarn( "jQuery.fn.andSelf() replaced by jQuery.fn.addBack()" );
- return oldSelf.apply( this, arguments );
-};
-
-
-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();
-
- };
-
- if ( func ) {
- func.call( deferred, deferred );
- }
-
- return deferred;
-};
-
-
-
-})( jQuery, window );
diff --git a/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.0.0.min.js b/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.0.0.min.js
deleted file mode 100644
index a2813c5..0000000
--- a/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.0.0.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery Migrate v3.0.0 | (c) jQuery Foundation and other contributors | jquery.org/license */
-"undefined"==typeof jQuery.migrateMute&&(jQuery.migrateMute=!0),function(a,b){"use strict";function c(c){var d=b.console;e[c]||(e[c]=!0,a.migrateWarnings.push(c),d&&d.warn&&!a.migrateMute&&(d.warn("JQMIGRATE: "+c),a.migrateTrace&&d.trace&&d.trace()))}function d(a,b,d,e){Object.defineProperty(a,b,{configurable:!0,enumerable:!0,get:function(){return c(e),d}})}a.migrateVersion="3.0.0",function(){var c=b.console&&b.console.log&&function(){b.console.log.apply(b.console,arguments)},d=/^[12]\./ [...]
\ No newline at end of file
diff --git a/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.3.0.js b/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.3.0.js
new file mode 100644
index 0000000..d0585ce
--- /dev/null
+++ b/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.3.0.js
@@ -0,0 +1,838 @@
+/*!
+ * jQuery Migrate - v3.3.0 - 2020-05-05T01:57Z
+ * 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.3.0";
+
+// 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;
+}
+
+( 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.0.0+ and no older Migrate loaded
+ if ( !jQuery || !jQueryVersionSince( "3.0.0" ) ) {
+ window.console.log( "JQMIGRATE: jQuery 3.0.0+ 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( msg ) {
+ var console = window.console;
+ if ( !jQuery.migrateDeduplicateWarnings || !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 ) {
+ Object.defineProperty( obj, prop, {
+ configurable: true,
+ enumerable: true,
+ get: function() {
+ migrateWarn( msg );
+ return value;
+ },
+ set: function( newValue ) {
+ migrateWarn( msg );
+ value = newValue;
+ }
+ } );
+}
+
+function migrateWarnFunc( obj, prop, newFunc, msg ) {
+ obj[ prop ] = function() {
+ migrateWarn( msg );
+ return newFunc.apply( this, arguments );
+ };
+}
+
+if ( window.document.compatMode === "BackCompat" ) {
+
+ // JQuery has never supported or tested Quirks Mode
+ migrateWarn( "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,
+
+ // Support: Android <=4.0 only
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
+jQuery.fn.init = function( arg1 ) {
+ var args = Array.prototype.slice.call( arguments );
+
+ if ( typeof arg1 === "string" && arg1 === "#" ) {
+
+ // JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0
+ migrateWarn( "jQuery( '#' ) is not a valid selector" );
+ args[ 0 ] = [];
+ }
+
+ return oldInit.apply( this, args );
+};
+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 {
+ 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( "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)
+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
+migrateWarnFunc( jQuery.fn, "size", function() {
+ return this.length;
+},
+"jQuery.fn.size() is deprecated and removed; use the .length property" );
+
+migrateWarnFunc( jQuery, "parseJSON", function() {
+ return JSON.parse.apply( null, arguments );
+},
+"jQuery.parseJSON is deprecated; use JSON.parse" );
+
+migrateWarnFunc( jQuery, "holdReady", jQuery.holdReady,
+ "jQuery.holdReady is deprecated" );
+
+migrateWarnFunc( jQuery, "unique", jQuery.uniqueSort,
+ "jQuery.unique is deprecated; use jQuery.uniqueSort" );
+
+// Now jQuery.expr.pseudos is the standard incantation
+migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos,
+ "jQuery.expr.filters is deprecated; use jQuery.expr.pseudos" );
+migrateWarnProp( jQuery.expr, ":", jQuery.expr.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" ) ) {
+ migrateWarnFunc( jQuery, "trim", function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+ "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" ) ) {
+ migrateWarnFunc( jQuery, "nodeName", function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+ "jQuery.nodeName is deprecated" );
+}
+
+if ( jQueryVersionSince( "3.3.0" ) ) {
+
+ migrateWarnFunc( 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 ) );
+ },
+ "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();
+ } );
+
+ migrateWarnFunc( 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;
+ },
+ "jQuery.type is deprecated" );
+
+ migrateWarnFunc( jQuery, "isFunction",
+ function( obj ) {
+ return typeof obj === "function";
+ },
+ "jQuery.isFunction() is deprecated" );
+
+ migrateWarnFunc( jQuery, "isWindow",
+ function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+ "jQuery.isWindow() is deprecated"
+ );
+
+ migrateWarnFunc( jQuery, "isArray", Array.isArray,
+ "jQuery.isArray is deprecated; use Array.isArray"
+ );
+}
+
+// Support jQuery slim which excludes the ajax module
+if ( jQuery.ajax ) {
+
+var oldAjax = jQuery.ajax;
+
+jQuery.ajax = function( ) {
+ var jQXHR = oldAjax.apply( this, arguments );
+
+ // Be sure we got a jQXHR (e.g., not sync)
+ if ( jQXHR.promise ) {
+ migrateWarnFunc( jQXHR, "success", jQXHR.done,
+ "jQXHR.success is deprecated and removed" );
+ migrateWarnFunc( jQXHR, "error", jQXHR.fail,
+ "jQXHR.error is deprecated and removed" );
+ migrateWarnFunc( jQXHR, "complete", jQXHR.always,
+ "jQXHR.complete is deprecated and removed" );
+ }
+
+ return jQXHR;
+};
+
+}
+
+var oldRemoveAttr = jQuery.fn.removeAttr,
+ oldToggleClass = jQuery.fn.toggleClass,
+ rmatchNonSpace = /\S+/g;
+
+jQuery.fn.removeAttr = function( name ) {
+ var self = this;
+
+ jQuery.each( name.match( rmatchNonSpace ), function( _i, attr ) {
+ if ( jQuery.expr.match.bool.test( attr ) ) {
+ migrateWarn( "jQuery.fn.removeAttr no longer sets boolean properties: " + attr );
+ self.prop( attr, false );
+ }
+ } );
+
+ return oldRemoveAttr.apply( this, arguments );
+};
+
+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( "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__" ) || ""
+ );
+ }
+ } );
+};
+
+function camelCase( string ) {
+ return string.replace( /-([a-z])/g, function( _, letter ) {
+ return letter.toUpperCase();
+ } );
+}
+
+var oldFnCss,
+ 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;
+ };
+ }
+ } );
+}
+
+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;
+};
+
+if ( jQueryVersionSince( "3.4.0" ) && typeof Proxy !== "undefined" ) {
+
+ jQuery.cssProps = new Proxy( jQuery.cssProps || {}, {
+ set: function() {
+ migrateWarn( "JQMIGRATE: jQuery.cssProps is deprecated" );
+ return Reflect.set.apply( this, arguments );
+ }
+ } );
+}
+
+// Create a dummy jQuery.cssNumber if missing. It won't be used by jQuery but
+// it will prevent code adding new keys to it unconditionally from crashing.
+if ( !jQuery.cssNumber ) {
+ 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 ) );
+}
+
+oldFnCss = jQuery.fn.css;
+
+jQuery.fn.css = function( name, value ) {
+ var origThis = this;
+ if ( typeof name !== "string" ) {
+ jQuery.each( name, function( n, v ) {
+ jQuery.fn.css.call( origThis, n, v );
+ } );
+ }
+ if ( typeof value === "number" && !isAutoPx( camelCase( name ) ) ) {
+ migrateWarn( "Use of number-typed values is deprecated in jQuery.fn.css" );
+ }
+
+ return oldFnCss.apply( this, arguments );
+};
+
+var oldData = jQuery.data;
+
+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 ) && oldData.call( this, elem );
+ sameKeys = {};
+ for ( key in name ) {
+ if ( key !== camelCase( key ) ) {
+ migrateWarn( "jQuery.data() always sets/gets camelCased names: " + key );
+ curData[ key ] = name[ key ];
+ } else {
+ sameKeys[ key ] = name[ key ];
+ }
+ }
+
+ oldData.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 ) && oldData.call( this, elem );
+ if ( curData && name in curData ) {
+ migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name );
+ if ( arguments.length > 2 ) {
+ curData[ name ] = value;
+ }
+ return curData[ name ];
+ }
+ }
+
+ return oldData.apply( this, arguments );
+};
+
+// Support jQuery slim which excludes the effects module
+if ( jQuery.fx ) {
+
+var intervalValue, intervalMsg,
+ oldTweenRun = jQuery.Tween.prototype.run,
+ linearEasing = function( pct ) {
+ return pct;
+ };
+
+jQuery.Tween.prototype.run = function( ) {
+ if ( jQuery.easing[ this.easing ].length > 1 ) {
+ migrateWarn(
+ "'jQuery.easing." + this.easing.toString() + "' should use only one argument"
+ );
+
+ jQuery.easing[ this.easing ] = linearEasing;
+ }
+
+ oldTweenRun.apply( this, arguments );
+};
+
+intervalValue = jQuery.fx.interval || 13;
+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( intervalMsg );
+ }
+ return intervalValue;
+ },
+ set: function( newValue ) {
+ migrateWarn( 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,
+ "jQuery.event.props.concat() is deprecated and removed" );
+
+jQuery.event.fix = function( originalEvent ) {
+ var event,
+ type = originalEvent.type,
+ fixHook = this.fixHooks[ type ],
+ props = jQuery.event.props;
+
+ if ( props.length ) {
+ migrateWarn( "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( "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;
+};
+
+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( "jQuery(window).on('load'...) called after load event occurred" );
+ }
+ return oldEventAdd.apply( this, arguments );
+};
+
+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.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;
+ };
+
+} );
+
+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
+ jQuery.fn[ name ] = function( data, fn ) {
+ migrateWarn( "jQuery.fn." + name + "() event shorthand is deprecated" );
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+} );
+
+// 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 is deprecated" );
+ }
+ }
+};
+
+jQuery.fn.extend( {
+
+ bind: function( types, data, fn ) {
+ migrateWarn( "jQuery.fn.bind() is deprecated" );
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ migrateWarn( "jQuery.fn.unbind() is deprecated" );
+ return this.off( types, null, fn );
+ },
+ delegate: function( selector, types, data, fn ) {
+ migrateWarn( "jQuery.fn.delegate() is deprecated" );
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ migrateWarn( "jQuery.fn.undelegate() is deprecated" );
+ return arguments.length === 1 ?
+ this.off( selector, "**" ) :
+ this.off( types, selector || "**", fn );
+ },
+ hover: function( fnOver, fnOut ) {
+ migrateWarn( "jQuery.fn.hover() is deprecated" );
+ return this.on( "mouseenter", fnOver ).on( "mouseleave", fnOut || fnOver );
+ }
+} );
+
+var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+ origHtmlPrefilter = jQuery.htmlPrefilter,
+ 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( "HTML tags must be properly nested and closed: " + html );
+ }
+ };
+
+jQuery.UNSAFE_restoreLegacyHtmlPrefilter = function() {
+ jQuery.htmlPrefilter = function( html ) {
+ warnIfChanged( html );
+ return html.replace( rxhtmlTag, "<$1></$2>" );
+ };
+};
+
+jQuery.htmlPrefilter = function( html ) {
+ warnIfChanged( html );
+ return origHtmlPrefilter( html );
+};
+
+var oldOffset = jQuery.fn.offset;
+
+jQuery.fn.offset = function() {
+ var docElem,
+ elem = this[ 0 ],
+ bogus = { top: 0, left: 0 };
+
+ if ( !elem || !elem.nodeType ) {
+ migrateWarn( "jQuery.fn.offset() requires a valid DOM element" );
+ return undefined;
+ }
+
+ docElem = ( elem.ownerDocument || window.document ).documentElement;
+ if ( !jQuery.contains( docElem, elem ) ) {
+ migrateWarn( "jQuery.fn.offset() requires an element connected to a document" );
+ return bogus;
+ }
+
+ return oldOffset.apply( this, arguments );
+};
+
+// 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 oldParam = jQuery.param;
+
+jQuery.param = function( data, traditional ) {
+ var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+
+ if ( traditional === undefined && ajaxTraditional ) {
+
+ migrateWarn( "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" );
+ traditional = ajaxTraditional;
+ }
+
+ return oldParam.call( this, data, traditional );
+};
+
+}
+
+var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
+
+jQuery.fn.andSelf = function() {
+ migrateWarn( "jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()" );
+ return oldSelf.apply( this, arguments );
+};
+
+// 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" ) ]
+ ];
+
+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 = 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();
+
+ };
+
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ return deferred;
+};
+
+// Preserve handler of uncaught exceptions in promise chains
+jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook;
+
+}
+
+return jQuery;
+} );
diff --git a/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.3.0.min.js b/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.3.0.min.js
new file mode 100644
index 0000000..411afbd
--- /dev/null
+++ b/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.3.0.min.js
@@ -0,0 +1,2 @@
+/*! jQuery Migrate v3.3.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+"undefined"==typeof jQuery.migrateMute&&(jQuery.migrateMute=!0),function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],function(e){return t(e,window)}):"object"==typeof module&&module.exports?module.exports=t(require("jquery"),window):t(jQuery,window)}(function(s,n){"use strict";function e(e){return 0<=function(e,t){var r,n=/^(\d+)\.(\d+)\.(\d+)/,i=n.exec(e)||[],o=n.exec(t)||[];for(r=1;r<=3;r++){if(+i[r]>+o[r])return 1;if(+i[r]<+o[r])return-1}return 0}(s.fn.jque [...]
diff --git a/themes/common-theme/webapp/common/js/util/application.js b/themes/common-theme/webapp/common/js/util/application.js
index ec6c0db..fbecfef 100644
--- a/themes/common-theme/webapp/common/js/util/application.js
+++ b/themes/common-theme/webapp/common/js/util/application.js
@@ -191,7 +191,7 @@ var FORMALIZE = (function($, window, document, undefined) {
             }
         }
     };
-})(jQuery, this);
+})(jQuery, this, document);
 
 jQuery(document).ready(function() {
     FORMALIZE.go();
diff --git a/themes/common-theme/widget/CommonScreens.xml b/themes/common-theme/widget/CommonScreens.xml
index 9c9172b..2a49029 100644
--- a/themes/common-theme/widget/CommonScreens.xml
+++ b/themes/common-theme/widget/CommonScreens.xml
@@ -358,8 +358,8 @@ under the License.
                         <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/ui/jquery-ui-1.12.1.min.js"/>
                         <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/plugins/validate/jquery.validate.min.js"/>
                         <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/plugins/browser-plugin/jquery.browser-0.1.0.min.js" global="true"/>
-                        <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/jquery-migrate-3.0.0.min.js" global="true"/>
-                        <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/jquery-3.4.1.min.js" global="true"/>
+                        <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/jquery-migrate-3.3.0.min.js" global="true"/>
+                        <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/jquery-3.5.1.min.js" global="true"/>
                         <set field="layoutSettings.javaScripts[]" value="/common/js/util/OfbizUtil.js" global="true"/>
                     </actions>
                     <widgets>
@@ -449,8 +449,8 @@ under the License.
                 <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/plugins/fjTimer/jquerytimer-min.js" global="true"/>
                 <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/plugins/validate/jquery.validate.min.js" global="true"/>
                 <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/plugins/browser-plugin/jquery.browser-0.1.0.min.js" global="true"/>
-                <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/jquery-migrate-3.0.0.min.js" global="true" />
-                <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/jquery-3.4.1.min.js" global="true"/>
+                <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/jquery-migrate-3.3.0.min.js" global="true" />
+                <set field="layoutSettings.javaScripts[+0]" value="/common/js/jquery/jquery-3.5.1.min.js" global="true"/>
                     <!-- jQuery CSSs -->
                 <set field="layoutSettings.styleSheets[+0]" value="/common/js/jquery/plugins/select2/css/select2-4.0.6.css" global="true"/>
                 <set field="layoutSettings.styleSheets[+0]" value="/common/js/jquery/ui/jquery-ui-1.12.1.min.css" global="true" />
diff --git a/themes/common-theme/widget/Theme.xml b/themes/common-theme/widget/Theme.xml
index 3fee75f..a99fde3 100644
--- a/themes/common-theme/widget/Theme.xml
+++ b/themes/common-theme/widget/Theme.xml
@@ -45,7 +45,7 @@ under the License.
     </widget-properties>
 
     <theme-properties> <!--specific properties dedicate to this theme -->
-        <!--jgrowl properties-->    
+        <!--jgrowl properties-->
         <property name="jgrowlPosition" value="center" type="String"/><!--possible value: top-left, top-right, bottom-left, bottom-right, center-->
         <property name="jgrowlWidth" value="800" type="Integer"/>
         <property name="jgrowlHeight" value="" type="Integer"/>
@@ -57,8 +57,8 @@ under the License.
         <property name="VT_NAV_TMPLT_LOC" value="component://flatgrey/template/AppBar.ftl"/>
         <property name="VT_MSG_TMPLT_LOC" value="component://common-theme/template/includes/Messages.ftl"/>
         <!--javascript libs-->
-        <property name="VT_HDR_JAVASCRIPT['add']" value="/common/js/jquery/jquery-3.4.1.min.js"/>
-        <property name="VT_HDR_JAVASCRIPT['add']" value="/common/js/jquery/jquery-migrate-3.0.0.min.js"/>
+        <property name="VT_HDR_JAVASCRIPT['add']" value="/common/js/jquery/jquery-3.5.1.min.js"/>
+        <property name="VT_HDR_JAVASCRIPT['add']" value="/common/js/jquery/jquery-migrate-3.3.0.min.js"/>
         <property name="VT_HDR_JAVASCRIPT['add']" value="/common/js/jquery/plugins/browser-plugin/jquery.browser-0.1.0.min.js"/>
         <property name="VT_HDR_JAVASCRIPT['add']" value="/common/js/jquery/ui/jquery-ui-1.12.1.min.js"/>
         <property name="VT_HDR_JAVASCRIPT['add']" value="/common/js/jquery/plugins/select2/js/select2-4.0.6.js"/>