Repository: wicket
Updated Branches:
  refs/heads/master 320e74ede -> b4f69ac34


http://git-wip-us.apache.org/repos/asf/wicket/blob/b4f69ac3/wicket-examples/src/main/webapp/js-test/lib/jquery.js
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/webapp/js-test/lib/jquery.js 
b/wicket-examples/src/main/webapp/js-test/lib/jquery.js
index 31e1b0e..6feb110 100644
--- a/wicket-examples/src/main/webapp/js-test/lib/jquery.js
+++ b/wicket-examples/src/main/webapp/js-test/lib/jquery.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery JavaScript Library v1.11.2
+ * jQuery JavaScript Library v1.11.3
  * http://jquery.com/
  *
  * Includes Sizzle.js
@@ -9,7 +9,7 @@
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: 2014-12-17T15:27Z
+ * Date: 2015-04-28T16:19Z
  */
 
 (function( global, factory ) {
@@ -43,4079 +43,4084 @@
 // Support: Firefox 18+
 //
 
-       var deletedIds = [];
+var deletedIds = [];
 
-       var slice = deletedIds.slice;
+var slice = deletedIds.slice;
 
-       var concat = deletedIds.concat;
+var concat = deletedIds.concat;
 
-       var push = deletedIds.push;
+var push = deletedIds.push;
 
-       var indexOf = deletedIds.indexOf;
+var indexOf = deletedIds.indexOf;
 
-       var class2type = {};
+var class2type = {};
 
-       var toString = class2type.toString;
+var toString = class2type.toString;
 
-       var hasOwn = class2type.hasOwnProperty;
+var hasOwn = class2type.hasOwnProperty;
 
-       var support = {};
+var support = {};
 
 
 
-       var
-               version = "1.11.2",
+var
+       version = "1.11.3",
 
        // Define a local copy of jQuery
-               jQuery = function( selector, context ) {
-                       // 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 );
-               },
+       jQuery = function( selector, context ) {
+               // 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.1, IE<9
        // Make sure we trim BOM and NBSP
-               rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
 
        // Matches dashed string for camelizing
-               rmsPrefix = /^-ms-/,
-               rdashAlpha = /-([\da-z])/gi,
+       rmsPrefix = /^-ms-/,
+       rdashAlpha = /-([\da-z])/gi,
 
        // Used by jQuery.camelCase as callback to replace()
-               fcamelCase = function( all, letter ) {
-                       return letter.toUpperCase();
-               };
-
-       jQuery.fn = jQuery.prototype = {
-               // The current version of jQuery being used
-               jquery: version,
-
-               constructor: jQuery,
-
-               // Start with an empty selector
-               selector: "",
-
-               // The default length of a jQuery object is 0
-               length: 0,
-
-               toArray: function() {
-                       return slice.call( this );
-               },
-
-               // Get the Nth element in the matched element set OR
-               // Get the whole matched element set as a clean array
-               get: function( num ) {
-                       return num != null ?
-
-                               // Return just the one element from the set
-                               ( num < 0 ? this[ num + this.length ] : this[ 
num ] ) :
-
-                               // Return all the elements in a clean array
-                               slice.call( this );
-               },
+       fcamelCase = function( all, letter ) {
+               return letter.toUpperCase();
+       };
 
-               // Take an array of elements and push it onto the stack
-               // (returning the new matched element set)
-               pushStack: function( elems ) {
+jQuery.fn = jQuery.prototype = {
+       // The current version of jQuery being used
+       jquery: version,
 
-                       // Build a new jQuery matched element set
-                       var ret = jQuery.merge( this.constructor(), elems );
+       constructor: jQuery,
 
-                       // Add the old object onto the stack (as a reference)
-                       ret.prevObject = this;
-                       ret.context = this.context;
+       // Start with an empty selector
+       selector: "",
 
-                       // Return the newly-formed element set
-                       return ret;
-               },
+       // The default length of a jQuery object is 0
+       length: 0,
 
-               // Execute a callback for every element in the matched set.
-               // (You can seed the arguments with an array of args, but this 
is
-               // only used internally.)
-               each: function( callback, args ) {
-                       return jQuery.each( this, callback, args );
-               },
+       toArray: function() {
+               return slice.call( this );
+       },
 
-               map: function( callback ) {
-                       return this.pushStack( jQuery.map(this, function( elem, 
i ) {
-                               return callback.call( elem, i, elem );
-                       }));
-               },
+       // Get the Nth element in the matched element set OR
+       // Get the whole matched element set as a clean array
+       get: function( num ) {
+               return num != null ?
 
-               slice: function() {
-                       return this.pushStack( slice.apply( this, arguments ) );
-               },
+                       // Return just the one element from the set
+                       ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
 
-               first: function() {
-                       return this.eq( 0 );
-               },
+                       // Return all the elements in a clean array
+                       slice.call( this );
+       },
 
-               last: function() {
-                       return this.eq( -1 );
-               },
+       // Take an array of elements and push it onto the stack
+       // (returning the new matched element set)
+       pushStack: function( elems ) {
 
-               eq: function( i ) {
-                       var len = this.length,
-                               j = +i + ( i < 0 ? len : 0 );
-                       return this.pushStack( j >= 0 && j < len ? [ this[j] ] 
: [] );
-               },
+               // Build a new jQuery matched element set
+               var ret = jQuery.merge( this.constructor(), elems );
 
-               end: function() {
-                       return this.prevObject || this.constructor(null);
-               },
+               // Add the old object onto the stack (as a reference)
+               ret.prevObject = this;
+               ret.context = this.context;
 
-               // For internal use only.
-               // Behaves like an Array's method, not like a jQuery method.
-               push: push,
-               sort: deletedIds.sort,
-               splice: deletedIds.splice
-       };
+               // Return the newly-formed element set
+               return ret;
+       },
+
+       // Execute a callback for every element in the matched set.
+       // (You can seed the arguments with an array of args, but this is
+       // only used internally.)
+       each: function( callback, args ) {
+               return jQuery.each( this, callback, args );
+       },
+
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
+       },
+
+       slice: function() {
+               return this.pushStack( slice.apply( this, arguments ) );
+       },
+
+       first: function() {
+               return this.eq( 0 );
+       },
+
+       last: function() {
+               return this.eq( -1 );
+       },
+
+       eq: function( i ) {
+               var len = this.length,
+                       j = +i + ( i < 0 ? len : 0 );
+               return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+       },
+
+       end: function() {
+               return this.prevObject || this.constructor(null);
+       },
+
+       // For internal use only.
+       // Behaves like an Array's method, not like a jQuery method.
+       push: push,
+       sort: deletedIds.sort,
+       splice: deletedIds.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+       var src, copyIsArray, copy, name, options, clone,
+               target = arguments[0] || {},
+               i = 1,
+               length = arguments.length,
+               deep = false;
+
+       // Handle a deep copy situation
+       if ( typeof target === "boolean" ) {
+               deep = target;
+
+               // skip the boolean and the target
+               target = arguments[ i ] || {};
+               i++;
+       }
 
-       jQuery.extend = jQuery.fn.extend = function() {
-               var src, copyIsArray, copy, name, options, clone,
-                       target = arguments[0] || {},
-                       i = 1,
-                       length = arguments.length,
-                       deep = false;
+       // Handle case when target is a string or something (possible in deep 
copy)
+       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+               target = {};
+       }
 
-               // Handle a deep copy situation
-               if ( typeof target === "boolean" ) {
-                       deep = target;
+       // extend jQuery itself if only one argument is passed
+       if ( i === length ) {
+               target = this;
+               i--;
+       }
 
-                       // skip the boolean and the target
-                       target = arguments[ i ] || {};
-                       i++;
-               }
+       for ( ; i < length; i++ ) {
+               // Only deal with non-null/undefined values
+               if ( (options = arguments[ i ]) != null ) {
+                       // Extend the base object
+                       for ( name in options ) {
+                               src = target[ name ];
+                               copy = options[ name ];
 
-               // Handle case when target is a string or something (possible 
in deep copy)
-               if ( typeof target !== "object" && !jQuery.isFunction(target) ) 
{
-                       target = {};
-               }
+                               // Prevent never-ending loop
+                               if ( target === copy ) {
+                                       continue;
+                               }
 
-               // extend jQuery itself if only one argument is passed
-               if ( i === length ) {
-                       target = this;
-                       i--;
-               }
+                               // Recurse if we're merging plain objects or 
arrays
+                               if ( deep && copy && ( 
jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+                                       if ( copyIsArray ) {
+                                               copyIsArray = false;
+                                               clone = src && 
jQuery.isArray(src) ? src : [];
 
-               for ( ; i < length; i++ ) {
-                       // Only deal with non-null/undefined values
-                       if ( (options = arguments[ i ]) != null ) {
-                               // Extend the base object
-                               for ( name in options ) {
-                                       src = target[ name ];
-                                       copy = options[ name ];
-
-                                       // Prevent never-ending loop
-                                       if ( target === copy ) {
-                                               continue;
+                                       } else {
+                                               clone = src && 
jQuery.isPlainObject(src) ? src : {};
                                        }
 
-                                       // Recurse if we're merging plain 
objects or arrays
-                                       if ( deep && copy && ( 
jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
-                                               if ( copyIsArray ) {
-                                                       copyIsArray = false;
-                                                       clone = src && 
jQuery.isArray(src) ? src : [];
-
-                                               } else {
-                                                       clone = src && 
jQuery.isPlainObject(src) ? src : {};
-                                               }
+                                       // Never move original objects, clone 
them
+                                       target[ name ] = jQuery.extend( deep, 
clone, copy );
 
-                                               // Never move original objects, 
clone them
-                                               target[ name ] = jQuery.extend( 
deep, clone, copy );
-
-                                               // Don't bring in undefined 
values
-                                       } else if ( copy !== undefined ) {
-                                               target[ name ] = copy;
-                                       }
+                               // Don't bring in undefined values
+                               } else if ( copy !== undefined ) {
+                                       target[ name ] = copy;
                                }
                        }
                }
+       }
 
-               // Return the modified object
-               return target;
-       };
+       // Return the modified object
+       return target;
+};
 
-       jQuery.extend({
-               // Unique for each copy of jQuery on the page
-               expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, 
"" ),
+jQuery.extend({
+       // Unique for each copy of jQuery on the page
+       expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
 
-               // Assume jQuery is ready without the ready module
-               isReady: true,
+       // Assume jQuery is ready without the ready module
+       isReady: true,
 
-               error: function( msg ) {
-                       throw new Error( msg );
-               },
+       error: function( msg ) {
+               throw new Error( msg );
+       },
 
-               noop: function() {},
+       noop: function() {},
 
-               // See test/unit/core.js for details concerning isFunction.
-               // Since version 1.3, DOM methods and functions like alert
-               // aren't supported. They return false on IE (#2968).
-               isFunction: function( obj ) {
-                       return jQuery.type(obj) === "function";
-               },
+       // See test/unit/core.js for details concerning isFunction.
+       // Since version 1.3, DOM methods and functions like alert
+       // aren't supported. They return false on IE (#2968).
+       isFunction: function( obj ) {
+               return jQuery.type(obj) === "function";
+       },
 
-               isArray: Array.isArray || function( obj ) {
-                       return jQuery.type(obj) === "array";
-               },
+       isArray: Array.isArray || function( obj ) {
+               return jQuery.type(obj) === "array";
+       },
 
-               isWindow: function( obj ) {
-                       /* jshint eqeqeq: false */
-                       return obj != null && obj == obj.window;
-               },
+       isWindow: function( obj ) {
+               /* jshint eqeqeq: false */
+               return obj != null && obj == obj.window;
+       },
 
-               isNumeric: function( obj ) {
-                       // parseFloat NaNs numeric-cast false positives 
(null|true|false|"")
-                       // ...but misinterprets leading-number strings, 
particularly hex literals ("0x...")
-                       // subtraction forces infinities to NaN
-                       // adding 1 corrects loss of precision from parseFloat 
(#15100)
-                       return !jQuery.isArray( obj ) && (obj - parseFloat( obj 
) + 1) >= 0;
-               },
+       isNumeric: function( obj ) {
+               // parseFloat NaNs numeric-cast false positives 
(null|true|false|"")
+               // ...but misinterprets leading-number strings, particularly 
hex literals ("0x...")
+               // subtraction forces infinities to NaN
+               // adding 1 corrects loss of precision from parseFloat (#15100)
+               return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) 
>= 0;
+       },
 
-               isEmptyObject: function( obj ) {
-                       var name;
-                       for ( name in obj ) {
-                               return false;
-                       }
-                       return true;
-               },
+       isEmptyObject: function( obj ) {
+               var name;
+               for ( name in obj ) {
+                       return false;
+               }
+               return true;
+       },
 
-               isPlainObject: function( obj ) {
-                       var key;
+       isPlainObject: function( obj ) {
+               var key;
 
-                       // Must be an Object.
-                       // Because of IE, we also have to check the presence of 
the constructor property.
-                       // Make sure that DOM nodes and window objects don't 
pass through, as well
-                       if ( !obj || jQuery.type(obj) !== "object" || 
obj.nodeType || jQuery.isWindow( obj ) ) {
-                               return false;
-                       }
+               // Must be an Object.
+               // Because of IE, we also have to check the presence of the 
constructor property.
+               // Make sure that DOM nodes and window objects don't pass 
through, as well
+               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || 
jQuery.isWindow( obj ) ) {
+                       return false;
+               }
 
-                       try {
-                               // Not own constructor property must be Object
-                               if ( obj.constructor &&
-                                       !hasOwn.call(obj, "constructor") &&
-                                       !hasOwn.call(obj.constructor.prototype, 
"isPrototypeOf") ) {
-                                       return false;
-                               }
-                       } catch ( e ) {
-                               // IE8,9 Will throw exceptions on certain host 
objects #9897
+               try {
+                       // Not own constructor property must be Object
+                       if ( obj.constructor &&
+                               !hasOwn.call(obj, "constructor") &&
+                               !hasOwn.call(obj.constructor.prototype, 
"isPrototypeOf") ) {
                                return false;
                        }
+               } catch ( e ) {
+                       // IE8,9 Will throw exceptions on certain host objects 
#9897
+                       return false;
+               }
 
-                       // Support: IE<9
-                       // Handle iteration over inherited properties before 
own properties.
-                       if ( support.ownLast ) {
-                               for ( key in obj ) {
-                                       return hasOwn.call( obj, key );
-                               }
+               // Support: IE<9
+               // Handle iteration over inherited properties before own 
properties.
+               if ( support.ownLast ) {
+                       for ( key in obj ) {
+                               return hasOwn.call( obj, key );
                        }
+               }
 
-                       // Own properties are enumerated firstly, so to speed 
up,
-                       // if last one is own, then all properties are own.
-                       for ( key in obj ) {}
+               // Own properties are enumerated firstly, so to speed up,
+               // if last one is own, then all properties are own.
+               for ( key in obj ) {}
 
-                       return key === undefined || hasOwn.call( obj, key );
-               },
+               return key === undefined || hasOwn.call( obj, key );
+       },
 
-               type: function( obj ) {
-                       if ( obj == null ) {
-                               return obj + "";
-                       }
-                       return typeof obj === "object" || typeof obj === 
"function" ?
+       type: function( obj ) {
+               if ( obj == null ) {
+                       return obj + "";
+               }
+               return typeof obj === "object" || typeof obj === "function" ?
                        class2type[ toString.call(obj) ] || "object" :
-                               typeof obj;
-               },
-
-               // Evaluates a script in a global context
-               // Workarounds based on findings by Jim Driscoll
-               // 
http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
-               globalEval: function( data ) {
-                       if ( data && jQuery.trim( data ) ) {
-                               // We use execScript on Internet Explorer
-                               // We use an anonymous function so that context 
is window
-                               // rather than jQuery in Firefox
-                               ( window.execScript || function( data ) {
-                                       window[ "eval" ].call( window, data );
-                               } )( data );
-                       }
-               },
-
-               // Convert dashed to camelCase; used by the css and data modules
-               // Microsoft forgot to hump their vendor prefix (#9572)
-               camelCase: function( string ) {
-                       return string.replace( rmsPrefix, "ms-" ).replace( 
rdashAlpha, fcamelCase );
-               },
-
-               nodeName: function( elem, name ) {
-                       return elem.nodeName && elem.nodeName.toLowerCase() === 
name.toLowerCase();
-               },
-
-               // args is for internal usage only
-               each: function( obj, callback, args ) {
-                       var value,
-                               i = 0,
-                               length = obj.length,
-                               isArray = isArraylike( obj );
+                       typeof obj;
+       },
+
+       // Evaluates a script in a global context
+       // Workarounds based on findings by Jim Driscoll
+       // 
http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+       globalEval: function( data ) {
+               if ( data && jQuery.trim( data ) ) {
+                       // We use execScript on Internet Explorer
+                       // We use an anonymous function so that context is 
window
+                       // rather than jQuery in Firefox
+                       ( window.execScript || function( data ) {
+                               window[ "eval" ].call( window, data );
+                       } )( data );
+               }
+       },
+
+       // Convert dashed to camelCase; used by the css and data modules
+       // Microsoft forgot to hump their vendor prefix (#9572)
+       camelCase: function( string ) {
+               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, 
fcamelCase );
+       },
+
+       nodeName: function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toLowerCase() === 
name.toLowerCase();
+       },
+
+       // args is for internal usage only
+       each: function( obj, callback, args ) {
+               var value,
+                       i = 0,
+                       length = obj.length,
+                       isArray = isArraylike( obj );
 
-                       if ( args ) {
-                               if ( isArray ) {
-                                       for ( ; i < length; i++ ) {
-                                               value = callback.apply( obj[ i 
], args );
+               if ( args ) {
+                       if ( isArray ) {
+                               for ( ; i < length; i++ ) {
+                                       value = callback.apply( obj[ i ], args 
);
 
-                                               if ( value === false ) {
-                                                       break;
-                                               }
+                                       if ( value === false ) {
+                                               break;
                                        }
-                               } else {
-                                       for ( i in obj ) {
-                                               value = callback.apply( obj[ i 
], args );
+                               }
+                       } else {
+                               for ( i in obj ) {
+                                       value = callback.apply( obj[ i ], args 
);
 
-                                               if ( value === false ) {
-                                                       break;
-                                               }
+                                       if ( value === false ) {
+                                               break;
                                        }
                                }
+                       }
 
-                               // A special, fast, case for the most common 
use of each
-                       } else {
-                               if ( isArray ) {
-                                       for ( ; i < length; i++ ) {
-                                               value = callback.call( obj[ i 
], i, obj[ i ] );
+               // A special, fast, case for the most common use of each
+               } else {
+                       if ( isArray ) {
+                               for ( ; i < length; i++ ) {
+                                       value = callback.call( obj[ i ], i, 
obj[ i ] );
 
-                                               if ( value === false ) {
-                                                       break;
-                                               }
+                                       if ( value === false ) {
+                                               break;
                                        }
-                               } else {
-                                       for ( i in obj ) {
-                                               value = callback.call( obj[ i 
], i, obj[ i ] );
+                               }
+                       } else {
+                               for ( i in obj ) {
+                                       value = callback.call( obj[ i ], i, 
obj[ i ] );
 
-                                               if ( value === false ) {
-                                                       break;
-                                               }
+                                       if ( value === false ) {
+                                               break;
                                        }
                                }
                        }
+               }
 
-                       return obj;
-               },
-
-               // Support: Android<4.1, IE<9
-               trim: function( text ) {
-                       return text == null ?
-                               "" :
-                               ( text + "" ).replace( rtrim, "" );
-               },
-
-               // results is for internal usage only
-               makeArray: function( arr, results ) {
-                       var ret = results || [];
+               return obj;
+       },
 
-                       if ( arr != null ) {
-                               if ( isArraylike( Object(arr) ) ) {
-                                       jQuery.merge( ret,
-                                               typeof arr === "string" ?
-                                                       [ arr ] : arr
-                                       );
-                               } else {
-                                       push.call( ret, arr );
-                               }
+       // Support: Android<4.1, IE<9
+       trim: function( text ) {
+               return text == null ?
+                       "" :
+                       ( text + "" ).replace( rtrim, "" );
+       },
+
+       // results is for internal usage only
+       makeArray: function( arr, results ) {
+               var ret = results || [];
+
+               if ( arr != null ) {
+                       if ( isArraylike( Object(arr) ) ) {
+                               jQuery.merge( ret,
+                                       typeof arr === "string" ?
+                                       [ arr ] : arr
+                               );
+                       } else {
+                               push.call( ret, arr );
                        }
+               }
 
-                       return ret;
-               },
+               return ret;
+       },
 
-               inArray: function( elem, arr, i ) {
-                       var len;
+       inArray: function( elem, arr, i ) {
+               var len;
 
-                       if ( arr ) {
-                               if ( indexOf ) {
-                                       return indexOf.call( arr, elem, i );
-                               }
+               if ( arr ) {
+                       if ( indexOf ) {
+                               return indexOf.call( arr, elem, i );
+                       }
 
-                               len = arr.length;
-                               i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+                       len = arr.length;
+                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
 
-                               for ( ; i < len; i++ ) {
-                                       // Skip accessing in sparse arrays
-                                       if ( i in arr && arr[ i ] === elem ) {
-                                               return i;
-                                       }
+                       for ( ; i < len; i++ ) {
+                               // Skip accessing in sparse arrays
+                               if ( i in arr && arr[ i ] === elem ) {
+                                       return i;
                                }
                        }
+               }
 
-                       return -1;
-               },
+               return -1;
+       },
 
-               merge: function( first, second ) {
-                       var len = +second.length,
-                               j = 0,
-                               i = first.length;
+       merge: function( first, second ) {
+               var len = +second.length,
+                       j = 0,
+                       i = first.length;
 
-                       while ( j < len ) {
-                               first[ i++ ] = second[ j++ ];
-                       }
+               while ( j < len ) {
+                       first[ i++ ] = second[ j++ ];
+               }
 
-                       // Support: IE<9
-                       // Workaround casting of .length to NaN on otherwise 
arraylike objects (e.g., NodeLists)
-                       if ( len !== len ) {
-                               while ( second[j] !== undefined ) {
-                                       first[ i++ ] = second[ j++ ];
-                               }
+               // Support: IE<9
+               // Workaround casting of .length to NaN on otherwise arraylike 
objects (e.g., NodeLists)
+               if ( len !== len ) {
+                       while ( second[j] !== undefined ) {
+                               first[ i++ ] = second[ j++ ];
                        }
+               }
 
-                       first.length = i;
+               first.length = i;
 
-                       return first;
-               },
+               return first;
+       },
 
-               grep: function( elems, callback, invert ) {
-                       var callbackInverse,
-                               matches = [],
-                               i = 0,
-                               length = elems.length,
-                               callbackExpect = !invert;
+       grep: function( elems, callback, invert ) {
+               var callbackInverse,
+                       matches = [],
+                       i = 0,
+                       length = elems.length,
+                       callbackExpect = !invert;
 
-                       // Go through the array, only saving the items
-                       // that pass the validator function
-                       for ( ; i < length; i++ ) {
-                               callbackInverse = !callback( elems[ i ], i );
-                               if ( callbackInverse !== callbackExpect ) {
-                                       matches.push( elems[ i ] );
-                               }
+               // Go through the array, only saving the items
+               // that pass the validator function
+               for ( ; i < length; i++ ) {
+                       callbackInverse = !callback( elems[ i ], i );
+                       if ( callbackInverse !== callbackExpect ) {
+                               matches.push( elems[ i ] );
                        }
+               }
 
-                       return matches;
-               },
+               return matches;
+       },
 
-               // arg is for internal usage only
-               map: function( elems, callback, arg ) {
-                       var value,
-                               i = 0,
-                               length = elems.length,
-                               isArray = isArraylike( elems ),
-                               ret = [];
+       // arg is for internal usage only
+       map: function( elems, callback, arg ) {
+               var value,
+                       i = 0,
+                       length = elems.length,
+                       isArray = isArraylike( elems ),
+                       ret = [];
 
-                       // Go through the array, translating each of the items 
to their new values
-                       if ( isArray ) {
-                               for ( ; i < length; i++ ) {
-                                       value = callback( elems[ i ], i, arg );
+               // Go through the array, translating each of the items to their 
new values
+               if ( isArray ) {
+                       for ( ; i < length; i++ ) {
+                               value = callback( elems[ i ], i, arg );
 
-                                       if ( value != null ) {
-                                               ret.push( value );
-                                       }
+                               if ( value != null ) {
+                                       ret.push( value );
                                }
+                       }
 
-                               // Go through every key on the object,
-                       } else {
-                               for ( i in elems ) {
-                                       value = callback( elems[ i ], i, arg );
+               // Go through every key on the object,
+               } else {
+                       for ( i in elems ) {
+                               value = callback( elems[ i ], i, arg );
 
-                                       if ( value != null ) {
-                                               ret.push( value );
-                                       }
+                               if ( value != null ) {
+                                       ret.push( value );
                                }
                        }
+               }
 
-                       // Flatten any nested arrays
-                       return concat.apply( [], ret );
-               },
+               // Flatten any nested arrays
+               return concat.apply( [], ret );
+       },
 
-               // A global GUID counter for objects
-               guid: 1,
+       // A global GUID counter for objects
+       guid: 1,
 
-               // Bind a function to a context, optionally partially applying 
any
-               // arguments.
-               proxy: function( fn, context ) {
-                       var args, proxy, tmp;
+       // Bind a function to a context, optionally partially applying any
+       // arguments.
+       proxy: function( fn, context ) {
+               var args, proxy, tmp;
 
-                       if ( typeof context === "string" ) {
-                               tmp = fn[ context ];
-                               context = fn;
-                               fn = tmp;
-                       }
+               if ( typeof context === "string" ) {
+                       tmp = fn[ context ];
+                       context = fn;
+                       fn = tmp;
+               }
 
-                       // Quick check to determine if target is callable, in 
the spec
-                       // this throws a TypeError, but we will just return 
undefined.
-                       if ( !jQuery.isFunction( fn ) ) {
-                               return undefined;
-                       }
+               // Quick check to determine if target is callable, in the spec
+               // this throws a TypeError, but we will just return undefined.
+               if ( !jQuery.isFunction( fn ) ) {
+                       return undefined;
+               }
 
-                       // Simulated bind
-                       args = slice.call( arguments, 2 );
-                       proxy = function() {
-                               return fn.apply( context || this, args.concat( 
slice.call( arguments ) ) );
-                       };
+               // Simulated bind
+               args = slice.call( arguments, 2 );
+               proxy = function() {
+                       return fn.apply( context || this, args.concat( 
slice.call( arguments ) ) );
+               };
 
-                       // Set the guid of unique handler to the same of 
original handler, so it can be removed
-                       proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+               // Set the guid of unique handler to the same of original 
handler, so it can be removed
+               proxy.guid = fn.guid = fn.guid || jQuery.guid++;
 
-                       return proxy;
-               },
+               return proxy;
+       },
 
-               now: function() {
-                       return +( new Date() );
-               },
+       now: function() {
+               return +( new Date() );
+       },
 
-               // jQuery.support is not used in Core but other projects attach 
their
-               // properties to it so it needs to exist.
-               support: support
-       });
+       // jQuery.support is not used in Core but other projects attach their
+       // properties to it so it needs to exist.
+       support: support
+});
 
 // Populate the class2type map
-       jQuery.each("Boolean Number String Function Array Date RegExp Object 
Error".split(" "), function(i, name) {
-               class2type[ "[object " + name + "]" ] = name.toLowerCase();
-       });
-
-       function isArraylike( obj ) {
-               var length = obj.length,
-                       type = jQuery.type( obj );
-
-               if ( type === "function" || jQuery.isWindow( obj ) ) {
-                       return false;
-               }
+jQuery.each("Boolean Number String Function Array Date RegExp Object 
Error".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
 
-               if ( obj.nodeType === 1 && length ) {
-                       return true;
-               }
-
-               return type === "array" || length === 0 ||
-                       typeof length === "number" && length > 0 && ( length - 
1 ) in obj;
-       }
-       var Sizzle =
-               /*!
-                * Sizzle CSS Selector Engine v2.2.0-pre
-                * http://sizzlejs.com/
-                *
-                * Copyright 2008, 2014 jQuery Foundation, Inc. and other 
contributors
-                * Released under the MIT license
-                * http://jquery.org/license
-                *
-                * Date: 2014-12-16
-                */
-               (function( window ) {
-
-                       var i,
-                               support,
-                               Expr,
-                               getText,
-                               isXML,
-                               tokenize,
-                               compile,
-                               select,
-                               outermostContext,
-                               sortInput,
-                               hasDuplicate,
-
-                       // Local document vars
-                               setDocument,
-                               document,
-                               docElem,
-                               documentIsHTML,
-                               rbuggyQSA,
-                               rbuggyMatches,
-                               matches,
-                               contains,
-
-                       // Instance-specific data
-                               expando = "sizzle" + 1 * new Date(),
-                               preferredDoc = window.document,
-                               dirruns = 0,
-                               done = 0,
-                               classCache = createCache(),
-                               tokenCache = createCache(),
-                               compilerCache = createCache(),
-                               sortOrder = function( a, b ) {
-                                       if ( a === b ) {
-                                               hasDuplicate = true;
-                                       }
-                                       return 0;
-                               },
+function isArraylike( obj ) {
 
-                       // General-purpose constants
-                               MAX_NEGATIVE = 1 << 31,
-
-                       // Instance methods
-                               hasOwn = ({}).hasOwnProperty,
-                               arr = [],
-                               pop = arr.pop,
-                               push_native = arr.push,
-                               push = arr.push,
-                               slice = arr.slice,
-                       // Use a stripped-down indexOf as it's faster than 
native
-                       // http://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 ) {
-                                                       return i;
-                                               }
-                                       }
-                                       return -1;
-                               },
+       // Support: iOS 8.2 (not reproducible in simulator)
+       // `in` check used to prevent JIT error (gh-2145)
+       // hasOwn isn't used here due to false negatives
+       // regarding Nodelist length in IE
+       var length = "length" in obj && obj.length,
+               type = jQuery.type( obj );
 
-                               booleans = 
"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
-
-                       // Regular expressions
-
-                       // Whitespace characters 
http://www.w3.org/TR/css3-selectors/#whitespace
-                               whitespace = "[\\x20\\t\\r\\n\\f]",
-                       // http://www.w3.org/TR/css3-syntax/#characters
-                               characterEncoding = 
"(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
-
-                       // Loosely modeled on CSS identifier characters
-                       // An unquoted value should be a CSS identifier 
http://www.w3.org/TR/css3-selectors/#attribute-selectors
-                       // Proper syntax: 
http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-                               identifier = characterEncoding.replace( "w", 
"w#" ),
-
-                       // Attribute selectors: 
http://www.w3.org/TR/selectors/#attribute-selectors
-                               attributes = "\\[" + whitespace + "*(" + 
characterEncoding + ")(?:" + whitespace +
-                                               // Operator (capture 2)
-                                       "*([*^$|!~]?=)" + whitespace +
-                                               // "Attribute values must be 
CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
-                                       
"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + 
"))|)" + whitespace +
-                                       "*\\]",
-
-                               pseudos = ":(" + characterEncoding + ")(?:\\((" 
+
-                                               // 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" ),
-
-                               rcomma = new RegExp( "^" + whitespace + "*," + 
whitespace + "*" ),
-                               rcombinators = new RegExp( "^" + whitespace + 
"*([>+~]|" + whitespace + ")" + whitespace + "*" ),
-
-                               rattributeQuotes = new RegExp( "=" + whitespace 
+ "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
-
-                               rpseudo = new RegExp( pseudos ),
-                               ridentifier = new RegExp( "^" + identifier + 
"$" ),
-
-                               matchExpr = {
-                                       "ID": new RegExp( "^#(" + 
characterEncoding + ")" ),
-                                       "CLASS": new RegExp( "^\\.(" + 
characterEncoding + ")" ),
-                                       "TAG": new RegExp( "^(" + 
characterEncoding.replace( "w", "w*" ) + ")" ),
-                                       "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" ),
-                                       "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" )
-                               },
+       if ( type === "function" || jQuery.isWindow( obj ) ) {
+               return false;
+       }
 
-                               rinputs = /^(?:input|select|textarea|button)$/i,
-                               rheader = /^h\d$/i,
-
-                               rnative = /^[^{]+\{\s*\[native \w/,
-
-                       // Easily-parseable/retrievable ID or TAG or CLASS 
selectors
-                               rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
-                               rsibling = /[+~]/,
-                               rescape = /'|\\/g,
-
-                       // 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 :
-                                               high < 0 ?
-                                                       // BMP codepoint
-                                                       String.fromCharCode( 
high + 0x10000 ) :
-                                                       // Supplemental Plane 
codepoint (surrogate pair)
-                                                       String.fromCharCode( 
high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-                               },
+       if ( obj.nodeType === 1 && length ) {
+               return true;
+       }
 
-                       // Used for iframes
-                       // See setDocument()
-                       // Removing the function wrapper causes a "Permission 
Denied"
-                       // error in IE
-                               unloadHandler = function() {
-                                       setDocument();
-                               };
+       return type === "array" || length === 0 ||
+               typeof length === "number" && length > 0 && ( length - 1 ) in 
obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.2.0-pre
+ * http://sizzlejs.com/
+ *
+ * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-12-16
+ */
+(function( window ) {
+
+var i,
+       support,
+       Expr,
+       getText,
+       isXML,
+       tokenize,
+       compile,
+       select,
+       outermostContext,
+       sortInput,
+       hasDuplicate,
+
+       // Local document vars
+       setDocument,
+       document,
+       docElem,
+       documentIsHTML,
+       rbuggyQSA,
+       rbuggyMatches,
+       matches,
+       contains,
+
+       // Instance-specific data
+       expando = "sizzle" + 1 * new Date(),
+       preferredDoc = window.document,
+       dirruns = 0,
+       done = 0,
+       classCache = createCache(),
+       tokenCache = createCache(),
+       compilerCache = createCache(),
+       sortOrder = function( a, b ) {
+               if ( a === b ) {
+                       hasDuplicate = true;
+               }
+               return 0;
+       },
+
+       // General-purpose constants
+       MAX_NEGATIVE = 1 << 31,
+
+       // Instance methods
+       hasOwn = ({}).hasOwnProperty,
+       arr = [],
+       pop = arr.pop,
+       push_native = arr.push,
+       push = arr.push,
+       slice = arr.slice,
+       // Use a stripped-down indexOf as it's faster than native
+       // http://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 ) {
+                               return i;
+                       }
+               }
+               return -1;
+       },
+
+       booleans = 
"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+       // Regular expressions
+
+       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+       whitespace = "[\\x20\\t\\r\\n\\f]",
+       // http://www.w3.org/TR/css3-syntax/#characters
+       characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+       // Loosely modeled on CSS identifier characters
+       // An unquoted value should be a CSS identifier 
http://www.w3.org/TR/css3-selectors/#attribute-selectors
+       // Proper syntax: 
http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+       identifier = characterEncoding.replace( "w", "w#" ),
+
+       // Attribute selectors: 
http://www.w3.org/TR/selectors/#attribute-selectors
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + 
whitespace +
+               // Operator (capture 2)
+               "*([*^$|!~]?=)" + whitespace +
+               // "Attribute values must be CSS identifiers [capture 5] or 
strings [capture 3 or capture 4]"
+               "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + 
identifier + "))|)" + whitespace +
+               "*\\]",
+
+       pseudos = ":(" + characterEncoding + ")(?:\\((" +
+               // 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" ),
+
+       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+       rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + 
")" + whitespace + "*" ),
+
+       rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + 
whitespace + "*\\]", "g" ),
+
+       rpseudo = new RegExp( pseudos ),
+       ridentifier = new RegExp( "^" + identifier + "$" ),
+
+       matchExpr = {
+               "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" 
) + ")" ),
+               "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" ),
+               "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" )
+       },
+
+       rinputs = /^(?:input|select|textarea|button)$/i,
+       rheader = /^h\d$/i,
+
+       rnative = /^[^{]+\{\s*\[native \w/,
+
+       // Easily-parseable/retrievable ID or TAG or CLASS selectors
+       rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+       rsibling = /[+~]/,
+       rescape = /'|\\/g,
+
+       // 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 :
+                       high < 0 ?
+                               // BMP codepoint
+                               String.fromCharCode( high + 0x10000 ) :
+                               // Supplemental Plane codepoint (surrogate pair)
+                               String.fromCharCode( high >> 10 | 0xD800, high 
& 0x3FF | 0xDC00 );
+       },
+
+       // Used for iframes
+       // See setDocument()
+       // Removing the function wrapper causes a "Permission Denied"
+       // error in IE
+       unloadHandler = function() {
+               setDocument();
+       };
 
 // Optimize for push.apply( _, NodeList )
-                       try {
-                               push.apply(
-                                       (arr = slice.call( 
preferredDoc.childNodes )),
-                                       preferredDoc.childNodes
-                               );
-                               // Support: Android<4.0
-                               // Detect silently failing push.apply
-                               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) );
-                                       } :
-
-                                       // Support: IE<9
-                                       // Otherwise append directly
-                                       function( target, els ) {
-                                               var j = target.length,
-                                                       i = 0;
-                                               // Can't trust NodeList.length
-                                               while ( (target[j++] = 
els[i++]) ) {}
-                                               target.length = j - 1;
-                                       }
-                               };
-                       }
-
-                       function Sizzle( selector, context, results, seed ) {
-                               var match, elem, m, nodeType,
-                               // QSA vars
-                                       i, groups, old, nid, newContext, 
newSelector;
+try {
+       push.apply(
+               (arr = slice.call( preferredDoc.childNodes )),
+               preferredDoc.childNodes
+       );
+       // Support: Android<4.0
+       // Detect silently failing push.apply
+       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) );
+               } :
 
-                               if ( ( context ? context.ownerDocument || 
context : preferredDoc ) !== document ) {
-                                       setDocument( context );
-                               }
+               // Support: IE<9
+               // Otherwise append directly
+               function( target, els ) {
+                       var j = target.length,
+                               i = 0;
+                       // Can't trust NodeList.length
+                       while ( (target[j++] = els[i++]) ) {}
+                       target.length = j - 1;
+               }
+       };
+}
 
-                               context = context || document;
-                               results = results || [];
-                               nodeType = context.nodeType;
+function Sizzle( selector, context, results, seed ) {
+       var match, elem, m, nodeType,
+               // QSA vars
+               i, groups, old, nid, newContext, newSelector;
 
-                               if ( typeof selector !== "string" || !selector 
||
-                                       nodeType !== 1 && nodeType !== 9 && 
nodeType !== 11 ) {
+       if ( ( context ? context.ownerDocument || context : preferredDoc ) !== 
document ) {
+               setDocument( context );
+       }
 
-                                       return results;
-                               }
+       context = context || document;
+       results = results || [];
+       nodeType = context.nodeType;
 
-                               if ( !seed && documentIsHTML ) {
-
-                                       // Try to shortcut find operations when 
possible (e.g., not under DocumentFragment)
-                                       if ( nodeType !== 11 && (match = 
rquickExpr.exec( selector )) ) {
-                                               // Speed-up: Sizzle("#ID")
-                                               if ( (m = match[1]) ) {
-                                                       if ( nodeType === 9 ) {
-                                                               elem = 
context.getElementById( m );
-                                                               // Check 
parentNode to catch when Blackberry 4.6 returns
-                                                               // nodes that 
are no longer in the document (jQuery #6963)
-                                                               if ( elem && 
elem.parentNode ) {
-                                                                       // 
Handle the case where IE, Opera, and Webkit return items
-                                                                       // by 
name instead of ID
-                                                                       if ( 
elem.id === m ) {
-                                                                               
results.push( elem );
-                                                                               
return results;
-                                                                       }
-                                                               } else {
-                                                                       return 
results;
-                                                               }
-                                                       } else {
-                                                               // Context is 
not a document
-                                                               if ( 
context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
-                                                                       
contains( context, elem ) && elem.id === m ) {
-                                                                       
results.push( elem );
-                                                                       return 
results;
-                                                               }
-                                                       }
+       if ( typeof selector !== "string" || !selector ||
+               nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
 
-                                                       // Speed-up: 
Sizzle("TAG")
-                                               } else if ( match[2] ) {
-                                                       push.apply( results, 
context.getElementsByTagName( selector ) );
-                                                       return results;
+               return results;
+       }
 
-                                                       // Speed-up: 
Sizzle(".CLASS")
-                                               } else if ( (m = match[3]) && 
support.getElementsByClassName ) {
-                                                       push.apply( results, 
context.getElementsByClassName( m ) );
+       if ( !seed && documentIsHTML ) {
+
+               // Try to shortcut find operations when possible (e.g., not 
under DocumentFragment)
+               if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) 
{
+                       // Speed-up: Sizzle("#ID")
+                       if ( (m = match[1]) ) {
+                               if ( nodeType === 9 ) {
+                                       elem = context.getElementById( m );
+                                       // Check parentNode to catch when 
Blackberry 4.6 returns
+                                       // nodes that are no longer in the 
document (jQuery #6963)
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE, 
Opera, and Webkit return items
+                                               // by name instead of ID
+                                               if ( elem.id === m ) {
+                                                       results.push( elem );
                                                        return results;
                                                }
+                                       } else {
+                                               return results;
                                        }
-
-                                       // QSA path
-                                       if ( support.qsa && (!rbuggyQSA || 
!rbuggyQSA.test( selector )) ) {
-                                               nid = old = expando;
-                                               newContext = context;
-                                               newSelector = nodeType !== 1 && 
selector;
-
-                                               // qSA works strangely on 
Element-rooted queries
-                                               // We can work around this by 
specifying an extra ID on the root
-                                               // and working up from there 
(Thanks to Andrew Dupont for the technique)
-                                               // IE 8 doesn't work on object 
elements
-                                               if ( nodeType === 1 && 
context.nodeName.toLowerCase() !== "object" ) {
-                                                       groups = tokenize( 
selector );
-
-                                                       if ( (old = 
context.getAttribute("id")) ) {
-                                                               nid = 
old.replace( rescape, "\\$&" );
-                                                       } else {
-                                                               
context.setAttribute( "id", nid );
-                                                       }
-                                                       nid = "[id='" + nid + 
"'] ";
-
-                                                       i = groups.length;
-                                                       while ( i-- ) {
-                                                               groups[i] = nid 
+ toSelector( groups[i] );
-                                                       }
-                                                       newContext = 
rsibling.test( selector ) && testContext( context.parentNode ) || context;
-                                                       newSelector = 
groups.join(",");
-                                               }
-
-                                               if ( newSelector ) {
-                                                       try {
-                                                               push.apply( 
results,
-                                                                       
newContext.querySelectorAll( newSelector )
-                                                               );
-                                                               return results;
-                                                       } catch(qsaError) {
-                                                       } finally {
-                                                               if ( !old ) {
-                                                                       
context.removeAttribute("id");
-                                                               }
-                                                       }
-                                               }
+                               } else {
+                                       // Context is not a document
+                                       if ( context.ownerDocument && (elem = 
context.ownerDocument.getElementById( m )) &&
+                                               contains( context, elem ) && 
elem.id === m ) {
+                                               results.push( elem );
+                                               return results;
                                        }
                                }
 
-                               // All others
-                               return select( selector.replace( rtrim, "$1" ), 
context, results, seed );
+                       // Speed-up: Sizzle("TAG")
+                       } else if ( match[2] ) {
+                               push.apply( results, 
context.getElementsByTagName( selector ) );
+                               return results;
+
+                       // Speed-up: Sizzle(".CLASS")
+                       } else if ( (m = match[3]) && 
support.getElementsByClassName ) {
+                               push.apply( results, 
context.getElementsByClassName( m ) );
+                               return results;
                        }
+               }
 
-                       /**
-                        * Create key-value caches of limited size
-                        * @returns {Function(string, Object)} Returns the 
Object data after storing it on itself with
-                        *      property name the (space-suffixed) string and 
(if the cache is larger than Expr.cacheLength)
-                        *      deleting the oldest entry
-                        */
-                       function createCache() {
-                               var keys = [];
+               // QSA path
+               if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) 
) {
+                       nid = old = expando;
+                       newContext = context;
+                       newSelector = nodeType !== 1 && selector;
 
-                               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);
+                       // qSA works strangely on Element-rooted queries
+                       // We can work around this by specifying an extra ID on 
the root
+                       // and working up from there (Thanks to Andrew Dupont 
for the technique)
+                       // IE 8 doesn't work on object elements
+                       if ( nodeType === 1 && context.nodeName.toLowerCase() 
!== "object" ) {
+                               groups = tokenize( selector );
+
+                               if ( (old = context.getAttribute("id")) ) {
+                                       nid = old.replace( rescape, "\\$&" );
+                               } else {
+                                       context.setAttribute( "id", nid );
                                }
-                               return cache;
-                       }
+                               nid = "[id='" + nid + "'] ";
 
-                       /**
-                        * Mark a function for special use by Sizzle
-                        * @param {Function} fn The function to mark
-                        */
-                       function markFunction( fn ) {
-                               fn[ expando ] = true;
-                               return fn;
+                               i = groups.length;
+                               while ( i-- ) {
+                                       groups[i] = nid + toSelector( groups[i] 
);
+                               }
+                               newContext = rsibling.test( selector ) && 
testContext( context.parentNode ) || context;
+                               newSelector = groups.join(",");
                        }
 
-                       /**
-                        * Support testing using an element
-                        * @param {Function} fn Passed the created div and 
expects a boolean result
-                        */
-                       function assert( fn ) {
-                               var div = document.createElement("div");
-
+                       if ( newSelector ) {
                                try {
-                                       return !!fn( div );
-                               } catch (e) {
-                                       return false;
+                                       push.apply( results,
+                                               newContext.querySelectorAll( 
newSelector )
+                                       );
+                                       return results;
+                               } catch(qsaError) {
                                } finally {
-                                       // Remove from its parent by default
-                                       if ( div.parentNode ) {
-                                               div.parentNode.removeChild( div 
);
+                                       if ( !old ) {
+                                               context.removeAttribute("id");
                                        }
-                                       // release memory in IE
-                                       div = null;
                                }
                        }
+               }
+       }
 
-                       /**
-                        * Adds the same handler for all of the specified attrs
-                        * @param {String} attrs Pipe-separated list of 
attributes
-                        * @param {Function} handler The method that will be 
applied
-                        */
-                       function addHandle( attrs, handler ) {
-                               var arr = attrs.split("|"),
-                                       i = attrs.length;
+       // All others
+       return select( selector.replace( rtrim, "$1" ), context, results, seed 
);
+}
 
-                               while ( i-- ) {
-                                       Expr.attrHandle[ arr[i] ] = handler;
-                               }
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing 
it on itself with
+ *     property name the (space-suffixed) string and (if the cache is larger 
than Expr.cacheLength)
+ *     deleting the oldest entry
+ */
+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;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+       fn[ expando ] = true;
+       return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+       var div = document.createElement("div");
+
+       try {
+               return !!fn( div );
+       } catch (e) {
+               return false;
+       } finally {
+               // Remove from its parent by default
+               if ( div.parentNode ) {
+                       div.parentNode.removeChild( div );
+               }
+               // release memory in IE
+               div = null;
+       }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+       var arr = attrs.split("|"),
+               i = attrs.length;
+
+       while ( i-- ) {
+               Expr.attrHandle[ arr[i] ] = handler;
+       }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a 
follows b
+ */
+function siblingCheck( a, b ) {
+       var cur = b && a,
+               diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+                       ( ~b.sourceIndex || MAX_NEGATIVE ) -
+                       ( ~a.sourceIndex || MAX_NEGATIVE );
+
+       // Use IE sourceIndex if available on both nodes
+       if ( diff ) {
+               return diff;
+       }
+
+       // Check if b follows a
+       if ( cur ) {
+               while ( (cur = cur.nextSibling) ) {
+                       if ( cur === b ) {
+                               return -1;
                        }
+               }
+       }
+
+       return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return name === "input" && elem.type === type;
+       };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return (name === "input" || name === "button") && elem.type === 
type;
+       };
+}
 
-                       /**
-                        * Checks document order of two siblings
-                        * @param {Element} a
-                        * @param {Element} b
-                        * @returns {Number} Returns less than 0 if a precedes 
b, greater than 0 if a follows b
-                        */
-                       function siblingCheck( a, b ) {
-                               var cur = b && a,
-                                       diff = cur && a.nodeType === 1 && 
b.nodeType === 1 &&
-                                               ( ~b.sourceIndex || 
MAX_NEGATIVE ) -
-                                               ( ~a.sourceIndex || 
MAX_NEGATIVE );
-
-                               // Use IE sourceIndex if available on both nodes
-                               if ( diff ) {
-                                       return diff;
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+       return markFunction(function( argument ) {
+               argument = +argument;
+               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]);
                                }
+                       }
+               });
+       });
+}
 
-                               // Check if b follows a
-                               if ( cur ) {
-                                       while ( (cur = cur.nextSibling) ) {
-                                               if ( cur === b ) {
-                                                       return -1;
-                                               }
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a 
falsy value
+ */
+function testContext( context ) {
+       return context && typeof context.getElementsByTagName !== "undefined" 
&& context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+       // documentElement is verified for cases where it doesn't yet exist
+       // (such as loading iframes in IE - #4833)
+       var documentElement = elem && (elem.ownerDocument || 
elem).documentElement;
+       return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set 
the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+       var hasCompare, parent,
+               doc = node ? node.ownerDocument || node : preferredDoc;
+
+       // If no document and documentElement is available, return
+       if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+               return document;
+       }
+
+       // Set our document
+       document = doc;
+       docElem = doc.documentElement;
+       parent = doc.defaultView;
+
+       // Support: IE>8
+       // If iframe document is assigned to "document" variable and if iframe 
has been reloaded,
+       // IE will throw "permission denied" error when accessing "document" 
variable, see jQuery #13936
+       // IE6-8 do not support the defaultView property so parent will be 
undefined
+       if ( parent && parent !== parent.top ) {
+               // IE11 does not have attachEvent, so all must suffer
+               if ( parent.addEventListener ) {
+                       parent.addEventListener( "unload", unloadHandler, false 
);
+               } else if ( parent.attachEvent ) {
+                       parent.attachEvent( "onunload", unloadHandler );
+               }
+       }
+
+       /* Support tests
+       ---------------------------------------------------------------------- 
*/
+       documentIsHTML = !isXML( doc );
+
+       /* Attributes
+       ---------------------------------------------------------------------- 
*/
+
+       // Support: IE<8
+       // Verify that getAttribute really returns attributes and not properties
+       // (excepting IE8 booleans)
+       support.attributes = assert(function( div ) {
+               div.className = "i";
+               return !div.getAttribute("className");
+       });
+
+       /* getElement(s)By*
+       ---------------------------------------------------------------------- 
*/
+
+       // Check if getElementsByTagName("*") returns only elements
+       support.getElementsByTagName = assert(function( div ) {
+               div.appendChild( doc.createComment("") );
+               return !div.getElementsByTagName("*").length;
+       });
+
+       // Support: IE<9
+       support.getElementsByClassName = rnative.test( 
doc.getElementsByClassName );
+
+       // Support: IE<10
+       // Check if getElementById returns elements by name
+       // The broken getElementById methods don't pick up programatically-set 
names,
+       // so use a roundabout getElementsByName test
+       support.getById = assert(function( div ) {
+               docElem.appendChild( div ).id = expando;
+               return !doc.getElementsByName || !doc.getElementsByName( 
expando ).length;
+       });
+
+       // ID find and filter
+       if ( support.getById ) {
+               Expr.find["ID"] = function( id, context ) {
+                       if ( typeof context.getElementById !== "undefined" && 
documentIsHTML ) {
+                               var m = context.getElementById( id );
+                               // Check parentNode to catch when Blackberry 
4.6 returns
+                               // nodes that are no longer in the document 
#6963
+                               return m && m.parentNode ? [ m ] : [];
+                       }
+               };
+               Expr.filter["ID"] = function( id ) {
+                       var attrId = id.replace( runescape, funescape );
+                       return function( elem ) {
+                               return elem.getAttribute("id") === attrId;
+                       };
+               };
+       } else {
+               // Support: IE6/7
+               // getElementById is not reliable as a find shortcut
+               delete Expr.find["ID"];
+
+               Expr.filter["ID"] =  function( id ) {
+                       var attrId = id.replace( runescape, funescape );
+                       return function( elem ) {
+                               var node = typeof elem.getAttributeNode !== 
"undefined" && elem.getAttributeNode("id");
+                               return node && node.value === attrId;
+                       };
+               };
+       }
+
+       // Tag
+       Expr.find["TAG"] = support.getElementsByTagName ?
+               function( tag, context ) {
+                       if ( typeof context.getElementsByTagName !== 
"undefined" ) {
+                               return context.getElementsByTagName( tag );
+
+                       // DocumentFragment nodes don't have gEBTN
+                       } else if ( support.qsa ) {
+                               return context.querySelectorAll( tag );
+                       }
+               } :
+
+               function( tag, context ) {
+                       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++]) ) {
+                                       if ( elem.nodeType === 1 ) {
+                                               tmp.push( elem );
                                        }
                                }
 
-                               return a ? 1 : -1;
+                               return tmp;
                        }
+                       return results;
+               };
 
-                       /**
-                        * Returns a function to use in pseudos for input types
-                        * @param {String} type
-                        */
-                       function createInputPseudo( type ) {
-                               return function( elem ) {
-                                       var name = elem.nodeName.toLowerCase();
-                                       return name === "input" && elem.type 
=== type;
-                               };
+       // Class
+       Expr.find["CLASS"] = support.getElementsByClassName && function( 
className, context ) {
+               if ( documentIsHTML ) {
+                       return context.getElementsByClassName( className );
+               }
+       };
+
+       /* QSA/matchesSelector
+       ---------------------------------------------------------------------- 
*/
+
+       // QSA and matchesSelector support
+
+       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+       rbuggyMatches = [];
+
+       // qSa(:focus) reports false when true (Chrome 21)
+       // We allow this because of a bug in IE8/9 that throws an error
+       // whenever `document.activeElement` is accessed on an iframe
+       // So, we allow :focus to pass through QSA all the time to avoid the IE 
error
+       // See http://bugs.jquery.com/ticket/13378
+       rbuggyQSA = [];
+
+       if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+               // Build QSA regex
+               // Regex strategy adopted from Diego Perini
+               assert(function( div ) {
+                       // Select is set to empty string on purpose
+                       // This is to test IE's treatment of not explicitly
+                       // setting a boolean content attribute,
+                       // since its presence should be enough
+                       // http://bugs.jquery.com/ticket/12359
+                       docElem.appendChild( div ).innerHTML = "<a id='" + 
expando + "'></a>" +
+                               "<select id='" + expando + "-\f]' 
msallowcapture=''>" +
+                               "<option selected=''></option></select>";
+
+                       // Support: IE8, Opera 11-12.16
+                       // Nothing should be selected when empty strings follow 
^= or $= or *=
+                       // The test attribute must be unknown in Opera but 
"safe" for WinRT
+                       // 
http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+                       if ( 
div.querySelectorAll("[msallowcapture^='']").length ) {
+                               rbuggyQSA.push( "[*^$]=" + whitespace + 
"*(?:''|\"\")" );
                        }
 
-                       /**
-                        * Returns a function to use in pseudos for buttons
-                        * @param {String} type
-                        */
-                       function createButtonPseudo( type ) {
-                               return function( elem ) {
-                                       var name = elem.nodeName.toLowerCase();
-                                       return (name === "input" || name === 
"button") && elem.type === type;
-                               };
+                       // Support: IE8
+                       // Boolean attributes and "value" are not treated 
correctly
+                       if ( !div.querySelectorAll("[selected]").length ) {
+                               rbuggyQSA.push( "\\[" + whitespace + 
"*(?:value|" + booleans + ")" );
                        }
 
-                       /**
-                        * Returns a function to use in pseudos for positionals
-                        * @param {Function} fn
-                        */
-                       function createPositionalPseudo( fn ) {
-                               return markFunction(function( argument ) {
-                                       argument = +argument;
-                                       return markFunction(function( seed, 
matches ) {
-                                               var j,
-                                                       matchIndexes = fn( [], 
seed.length, argument ),
-                                                       i = matchIndexes.length;
+                       // Support: Chrome<29, Android<4.2+, Safari<7.0+, 
iOS<7.0+, PhantomJS<1.9.7+
+                       if ( !div.querySelectorAll( "[id~=" + expando + "-]" 
).length ) {
+                               rbuggyQSA.push("~=");
+                       }
 
-                                               // Match elements found at the 
specified indexes
-                                               while ( i-- ) {
-                                                       if ( seed[ (j = 
matchIndexes[i]) ] ) {
-                                                               seed[j] = 
!(matches[j] = seed[j]);
-                                                       }
-                                               }
-                                       });
-                               });
+                       // 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 ( !div.querySelectorAll(":checked").length ) {
+                               rbuggyQSA.push(":checked");
                        }
 
-                       /**
-                        * Checks a node for validity as a Sizzle context
-                        * @param {Element|Object=} context
-                        * @returns {Element|Object|Boolean} The input node if 
acceptable, otherwise a falsy value
-                        */
-                       function testContext( context ) {
-                               return context && typeof 
context.getElementsByTagName !== "undefined" && context;
+                       // Support: Safari 8+, iOS 8+
+                       // https://bugs.webkit.org/show_bug.cgi?id=136851
+                       // In-page `selector#id sibing-combinator selector` 
fails
+                       if ( !div.querySelectorAll( "a#" + expando + "+*" 
).length ) {
+                               rbuggyQSA.push(".#.+[+~]");
                        }
+               });
 
-// Expose support vars for convenience
-                       support = Sizzle.support = {};
-
-                       /**
-                        * Detects XML nodes
-                        * @param {Element|Object} elem An element or a document
-                        * @returns {Boolean} True iff elem is a non-HTML XML 
node
-                        */
-                       isXML = Sizzle.isXML = function( elem ) {
-                               // documentElement is verified for cases where 
it doesn't yet exist
-                               // (such as loading iframes in IE - #4833)
-                               var documentElement = elem && 
(elem.ownerDocument || elem).documentElement;
-                               return documentElement ? 
documentElement.nodeName !== "HTML" : false;
-                       };
+               assert(function( div ) {
+                       // Support: Windows 8 Native Apps
+                       // The type and name attributes are restricted during 
.innerHTML assignment
+                       var input = doc.createElement("input");
+                       input.setAttribute( "type", "hidden" );
+                       div.appendChild( input ).setAttribute( "name", "D" );
 
-                       /**
-                        * Sets document-related variables once based on the 
current document
-                        * @param {Element|Object} [doc] An element or document 
object to use to set the document
-                        * @returns {Object} Returns the current document
-                        */
-                       setDocument = Sizzle.setDocument = function( node ) {
-                               var hasCompare, parent,
-                                       doc = node ? node.ownerDocument || node 
: preferredDoc;
-
-                               // If no document and documentElement is 
available, return
-                               if ( doc === document || doc.nodeType !== 9 || 
!doc.documentElement ) {
-                                       return document;
-                               }
+                       // Support: IE8
+                       // Enforce case-sensitivity of name attribute
+                       if ( div.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 ( !div.querySelectorAll(":enabled").length ) {
+                               rbuggyQSA.push( ":enabled", ":disabled" );
+                       }
+
+                       // Opera 10-11 does not throw on post-comma invalid 
pseudos
+                       div.querySelectorAll("*,:x");
+                       rbuggyQSA.push(",.*:");
+               });
+       }
+
+       if ( (support.matchesSelector = rnative.test( (matches = 
docElem.matches ||
+               docElem.webkitMatchesSelector ||
+               docElem.mozMatchesSelector ||
+               docElem.oMatchesSelector ||
+               docElem.msMatchesSelector) )) ) {
+
+               assert(function( div ) {
+                       // Check to see if it's possible to do matchesSelector
+                       // on a disconnected node (IE 9)
+                       support.disconnectedMatch = matches.call( div, "div" );
+
+                       // This should fail with an exception
+                       // Gecko does not error, returns false instead
+                       matches.call( div, "[s!='']:x" );
+                       rbuggyMatches.push( "!=", pseudos );
+               });
+       }
 
-                               // Set our document
-                               document = doc;
-                               docElem = doc.documentElement;
-                               parent = doc.defaultView;
-
-                               // Support: IE>8
-                               // If iframe document is assigned to "document" 
variable and if iframe has been reloaded,
-                               // IE will throw "permission denied" error when 
accessing "document" variable, see jQuery #13936
-                               // IE6-8 do not support the defaultView 
property so parent will be undefined
-                               if ( parent && parent !== parent.top ) {
-                                       // IE11 does not have attachEvent, so 
all must suffer
-                                       if ( parent.addEventListener ) {
-                                               parent.addEventListener( 
"unload", unloadHandler, false );
-                                       } else if ( parent.attachEvent ) {
-                                               parent.attachEvent( "onunload", 
unloadHandler );
+       rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+       rbuggyMatches = rbuggyMatches.length && new RegExp( 
rbuggyMatches.join("|") );
+
+       /* Contains
+       ---------------------------------------------------------------------- 
*/
+       hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+       // Element contains another
+       // Purposefully does not implement inclusive descendent
+       // As in, an element does not contain itself
+       contains = hasCompare || rnative.test( docElem.contains ) ?
+               function( a, b ) {
+                       var adown = a.nodeType === 9 ? a.documentElement : a,
+                               bup = b && b.parentNode;
+                       return a === bup || !!( bup && bup.nodeType === 1 && (
+                               adown.contains ?
+                                       adown.contains( bup ) :
+                                       a.compareDocumentPosition && 
a.compareDocumentPosition( bup ) & 16
+                       ));
+               } :
+               function( a, b ) {
+                       if ( b ) {
+                               while ( (b = b.parentNode) ) {
+                                       if ( b === a ) {
+                                               return true;
                                        }
                                }
+                       }
+                       return false;
+               };
 
-                               /* Support tests
-                                
---------------------------------------------------------------------- */
-                               documentIsHTML = !isXML( doc );
+       /* Sorting
+       ---------------------------------------------------------------------- 
*/
 
-                               /* Attributes
-                                
---------------------------------------------------------------------- */
+       // Document order sorting
+       sortOrder = hasCompare ?
+       function( a, b ) {
 
-                               // Support: IE<8
-                               // Verify that getAttribute really returns 
attributes and not properties
-                               // (excepting IE8 booleans)
-                               support.attributes = assert(function( div ) {
-                                       div.className = "i";
-                                       return !div.getAttribute("className");
-                               });
+               // Flag for duplicate removal
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
 
-                               /* getElement(s)By*
-                                
---------------------------------------------------------------------- */
+               // Sort on method existence if only one input has 
compareDocumentPosition
+               var compare = !a.compareDocumentPosition - 
!b.compareDocumentPosition;
+               if ( compare ) {
+                       return compare;
+               }
 
-                               // Check if getElementsByTagName("*") returns 
only elements
-                               support.getElementsByTagName = assert(function( 
div ) {
-                                       div.appendChild( doc.createComment("") 
);
-                                       return 
!div.getElementsByTagName("*").length;
-                               });
+               // Calculate position if both inputs belong to the same document
+               compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) 
?
+                       a.compareDocumentPosition( b ) :
 
-                               // Support: IE<9
-                               support.getElementsByClassName = rnative.test( 
doc.getElementsByClassName );
+                       // Otherwise we know they are disconnected
+                       1;
 
-                               // Support: IE<10
-                               // Check if getElementById returns elements by 
name
-                               // The broken getElementById methods don't pick 
up programatically-set names,
-                               // so use a roundabout getElementsByName test
-                               support.getById = assert(function( div ) {
-                                       docElem.appendChild( div ).id = expando;
-                                       return !doc.getElementsByName || 
!doc.getElementsByName( expando ).length;
-                               });
+               // Disconnected nodes
+               if ( compare & 1 ||
+                       (!support.sortDetached && b.compareDocumentPosition( a 
) === compare) ) {
 
-                               // ID find and filter
-                               if ( support.getById ) {
-                                       Expr.find["ID"] = function( id, context 
) {
-                                               if ( typeof 
context.getElementById !== "undefined" && documentIsHTML ) {
-                                                       var m = 
context.getElementById( id );
-                                                       // Check parentNode to 
catch when Blackberry 4.6 returns
-                                                       // nodes that are no 
longer in the document #6963
-                                                       return m && 
m.parentNode ? [ m ] : [];
-                                               }
-                                       };
-                                       Expr.filter["ID"] = function( id ) {
-                                               var attrId = id.replace( 
runescape, funescape );
-                                               return function( elem ) {
-                                                       return 
elem.getAttribute("id") === attrId;
-                                               };
-                                       };
-                               } else {
-                                       // Support: IE6/7
-                                       // getElementById is not reliable as a 
find shortcut
-                                       delete Expr.find["ID"];
-
-                                       Expr.filter["ID"] =  function( id ) {
-                                               var attrId = id.replace( 
runescape, funescape );
-                                               return function( elem ) {
-                                                       var node = typeof 
elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
-                                                       return node && 
node.value === attrId;
-                                               };
-                                       };
-                               }
+                       // Choose the first element that is related to our 
preferred document
+                       if ( a === doc || a.ownerDocument === preferredDoc && 
contains(preferredDoc, a) ) {
+                               return -1;
+                       }
+                       if ( b === doc || b.ownerDocument === preferredDoc && 
contains(preferredDoc, b) ) {
+                               return 1;
+                       }
 
-                               // Tag
-                               Expr.find["TAG"] = support.getElementsByTagName 
?
-                                       function( tag, context ) {
-                                               if ( typeof 
context.getElementsByTagName !== "undefined" ) {
-                                                       return 
context.getElementsByTagName( tag );
+                       // Maintain original order
+                       return sortInput ?
+                               ( indexOf( sortInput, a ) - indexOf( sortInput, 
b ) ) :
+                               0;
+               }
 
-                                                       // DocumentFragment 
nodes don't have gEBTN
-                                               } else if ( support.qsa ) {
-                                                       return 
context.querySelectorAll( tag );
-                                               }
-                                       } :
-
-                                       function( tag, context ) {
-                                               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++]) ) {
-                                                               if ( 
elem.nodeType === 1 ) {
-                                                                       
tmp.push( elem );
-                                                               }
-                                                       }
+               return compare & 4 ? -1 : 1;
+       } :
+       function( a, b ) {
+               // Exit early if the nodes are identical
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
 
-                                                       return tmp;
-                                               }
-                                               return results;
-                                       };
+               var cur,
+                       i = 0,
+                       aup = a.parentNode,
+                       bup = b.parentNode,
+                       ap = [ a ],
+                       bp = [ b ];
+
+               // Parentless nodes are either documents or disconnected
+               if ( !aup || !bup ) {
+                       return a === doc ? -1 :
+                               b === doc ? 1 :
+                               aup ? -1 :
+                               bup ? 1 :
+                               sortInput ?
+                               ( indexOf( sortInput, a ) - indexOf( sortInput, 
b ) ) :
+                               0;
+
+               // If the nodes are siblings, we can do a quick check
+               } else if ( aup === bup ) {
+                       return siblingCheck( a, b );
+               }
+
+               // Otherwise we need full lists of their ancestors for 
comparison
+               cur = a;
+               while ( (cur = cur.parentNode) ) {
+                       ap.unshift( cur );
+               }
+               cur = b;
+               while ( (cur = cur.parentNode) ) {
+                       bp.unshift( cur );
+               }
+
+               // Walk down the tree looking for a discrepancy
+               while ( ap[i] === bp[i] ) {
+                       i++;
+               }
 
-                               // Class
-                               Expr.find["CLASS"] = 
support.getElementsByClassName && function( className, context ) {
-                                       if ( documentIsHTML ) {
-                                               return 
context.getElementsByClassName( className );
-                                       }
-                               };
+               return i ?
+                       // Do a sibling check if the nodes have a common 
ancestor
+                       siblingCheck( ap[i], bp[i] ) :
 
-                               /* QSA/matchesSelector
-                                
---------------------------------------------------------------------- */
-
-                               // QSA and matchesSelector support
-
-                               // matchesSelector(:active) reports false when 
true (IE9/Opera 11.5)
-                               rbuggyMatches = [];
-
-                               // qSa(:focus) reports false when true (Chrome 
21)
-                               // We allow this because of a bug in IE8/9 that 
throws an error
-                               // whenever `document.activeElement` is 
accessed on an iframe
-                               // So, we allow :focus to pass through QSA all 
the time to avoid the IE error
-                               // See http://bugs.jquery.com/ticket/13378
-                               rbuggyQSA = [];
-
-                               if ( (support.qsa = rnative.test( 
doc.querySelectorAll )) ) {
-                                       // Build QSA regex
-                                       // Regex strategy adopted from Diego 
Perini
-                                       assert(function( div ) {
-                                               // Select is set to empty 
string on purpose
-                                               // This is to test IE's 
treatment of not explicitly
-                                               // setting a boolean content 
attribute,
-                                               // since its presence should be 
enough
-                                               // 
http://bugs.jquery.com/ticket/12359
-                                               docElem.appendChild( div 
).innerHTML = "<a id='" + expando + "'></a>" +
-                                               "<select id='" + expando + 
"-\f]' msallowcapture=''>" +
-                                               "<option 
selected=''></option></select>";
-
-                                               // Support: IE8, Opera 11-12.16
-                                               // Nothing should be selected 
when empty strings follow ^= or $= or *=
-                                               // The test attribute must be 
unknown in Opera but "safe" for WinRT
-                                               // 
http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
-                                               if ( 
div.querySelectorAll("[msallowcapture^='']").length ) {
-                                                       rbuggyQSA.push( 
"[*^$]=" + whitespace + "*(?:''|\"\")" );
-                                               }
+                       // Otherwise nodes in our document sort first
+                       ap[i] === preferredDoc ? -1 :
+                       bp[i] === preferredDoc ? 1 :
+                       0;
+       };
 
-                                               // Support: IE8
-                                               // Boolean attributes and 
"value" are not treated correctly
-                                               if ( 
!div.querySelectorAll("[selected]").length ) {
-                                                       rbuggyQSA.push( "\\[" + 
whitespace + "*(?:value|" + booleans + ")" );
-                                               }
+       return doc;
+};
 
-                                               // Support: Chrome<29, 
Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
-                                               if ( !div.querySelectorAll( 
"[id~=" + expando + "-]" ).length ) {
-                                                       rbuggyQSA.push("~=");
-                                               }
+Sizzle.matches = function( expr, elements ) {
+       return Sizzle( expr, null, null, elements );
+};
 
-                                               // 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 ( 
!div.querySelectorAll(":checked").length ) {
-                                                       
rbuggyQSA.push(":checked");
-                                               }
+Sizzle.matchesSelector = function( elem, expr ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
 
-                                               // Support: Safari 8+, iOS 8+
-                                               // 
https://bugs.webkit.org/show_bug.cgi?id=136851
-                                               // In-page `selector#id 
sibing-combinator selector` fails
-                                               if ( !div.querySelectorAll( 
"a#" + expando + "+*" ).length ) {
-                                                       
rbuggyQSA.push(".#.+[+~]");
-                                               }
-                                       });
+       // Make sure that attribute selectors are quoted
+       expr = expr.replace( rattributeQuotes, "='$1']" );
 
-                                       assert(function( div ) {
-                                               // Support: Windows 8 Native 
Apps
-                                               // The type and name attributes 
are restricted during .innerHTML assignment
-                                               var input = 
doc.createElement("input");
-                                               input.setAttribute( "type", 
"hidden" );
-                                               div.appendChild( input 
).setAttribute( "name", "D" );
-
-                                               // Support: IE8
-                                               // Enforce case-sensitivity of 
name attribute
-                                               if ( 
div.querySelectorAll("[name=d]").length ) {
-                                                       rbuggyQSA.push( "name" 
+ whitespace + "*[*^$|!~]?=" );
-                                               }
+       if ( support.matchesSelector && documentIsHTML &&
+               ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+               ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
 
-                                               // FF 3.5 - :enabled/:disabled 
and hidden elements (hidden elements are still enabled)
-                                               // IE8 throws error here and 
will not see later tests
-                                               if ( 
!div.querySelectorAll(":enabled").length ) {
-                                                       rbuggyQSA.push( 
":enabled", ":disabled" );
-                                               }
+               try {
+                       var ret = matches.call( elem, expr );
 
-                                               // Opera 10-11 does not throw 
on post-comma invalid pseudos
-                                               div.querySelectorAll("*,:x");
-                                               rbuggyQSA.push(",.*:");
-                                       });
-                               }
+                       // 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 ) {
+                               return ret;
+                       }
+               } catch (e) {}
+       }
 
-                               if ( (support.matchesSelector = rnative.test( 
(matches = docElem.matches ||
-                                       docElem.webkitMatchesSelector ||
-                                       docElem.mozMatchesSelector ||
-                                       docElem.oMatchesSelector ||
-                                       docElem.msMatchesSelector) )) ) {
-
-                                       assert(function( div ) {
-                                               // Check to see if it's 
possible to do matchesSelector
-                                               // on a disconnected node (IE 9)
-                                               support.disconnectedMatch = 
matches.call( div, "div" );
-
-                                               // This should fail with an 
exception
-                                               // Gecko does not error, 
returns false instead
-                                               matches.call( div, "[s!='']:x" 
);
-                                               rbuggyMatches.push( "!=", 
pseudos );
-                                       });
-                               }
+       return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
 
-                               rbuggyQSA = rbuggyQSA.length && new RegExp( 
rbuggyQSA.join("|") );
-                               rbuggyMatches = rbuggyMatches.length && new 
RegExp( rbuggyMatches.join("|") );
-
-                               /* Contains
-                                
---------------------------------------------------------------------- */
-                               hasCompare = rnative.test( 
docElem.compareDocumentPosition );
-
-                               // Element contains another
-                               // Purposefully does not implement inclusive 
descendent
-                               // As in, an element does not contain itself
-                               contains = hasCompare || rnative.test( 
docElem.contains ) ?
-                                       function( a, b ) {
-                                               var adown = a.nodeType === 9 ? 
a.documentElement : a,
-                                                       bup = b && b.parentNode;
-                                               return a === bup || !!( bup && 
bup.nodeType === 1 && (
-                                                               adown.contains ?
-                                                                       
adown.contains( bup ) :
-                                                               
a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
-                                                       ));
-                                       } :
-                                       function( a, b ) {
-                                               if ( b ) {
-                                                       while ( (b = 
b.parentNode) ) {
-                                                               if ( b === a ) {
-                                                                       return 
true;
-                                                               }
-                                                       }
-                                               }
-                                               return false;
-                                       };
+Sizzle.contains = function( context, elem ) {
+       // Set document vars if needed
+       if ( ( context.ownerDocument || context ) !== document ) {
+               setDocument( context );
+       }
+       return contains( context, elem );
+};
 
-                               /* Sorting
-                                
---------------------------------------------------------------------- */
+Sizzle.attr = function( elem, name ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
 
-                               // Document order sorting
-                               sortOrder = hasCompare ?
-                                       function( a, b ) {
+       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 ) :
+                       undefined;
+
+       return val !== undefined ?
+               val :
+               support.attributes || !documentIsHTML ?
+                       elem.getAttribute( name ) :
+                       (val = elem.getAttributeNode(name)) && val.specified ?
+                               val.value :
+                               null;
+};
 
-                                               // Flag for duplicate removal
-                                               if ( a === b ) {
-                                                       hasDuplicate = true;
-                                                       return 0;
-                                               }
+Sizzle.error = function( msg ) {
+       throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
 
-                                               // Sort on method existence if 
only one input has compareDocumentPosition
-                                               var compare = 
!a.compareDocumentPosition - !b.compareDocumentPosition;
-                                               if ( compare ) {
-                                                       return compare;
-                                               }
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+       var elem,
+               duplicates = [],
+               j = 0,
+               i = 0;
 
-                                               // Calculate position if both 
inputs belong to the same document
-                                               compare = ( a.ownerDocument || 
a ) === ( b.ownerDocument || b ) ?
-                                                       
a.compareDocumentPosition( b ) :
+       // Unless we *know* we can detect duplicates, assume their presence
+       hasDuplicate = !support.detectDuplicates;
+       sortInput = !support.sortStable && results.slice( 0 );
+       results.sort( sortOrder );
 
-                                                       // Otherwise we know 
they are disconnected
-                                                       1;
+       if ( hasDuplicate ) {
+               while ( (elem = results[i++]) ) {
+                       if ( elem === results[ i ] ) {
+                               j = duplicates.push( i );
+                       }
+               }
+               while ( j-- ) {
+                       results.splice( duplicates[ j ], 1 );
+               }
+       }
 
-                                               // Disconnected nodes
-                                               if ( compare & 1 ||
-                                                       (!support.sortDetached 
&& b.compareDocumentPosition( a ) === compare) ) {
+       // Clear input after sorting to release objects
+       // See https://github.com/jquery/sizzle/pull/225
+       sortInput = null;
 
-                                                       // Choose the first 
element that is related to our preferred document
-                                                       if ( a === doc || 
a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
-                                                               return -1;
-                                                       }
-                                                       if ( b === doc || 
b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
-                                                               return 1;
-                                                       }
+       return results;
+};
 
-                                                       // Maintain original 
order
-                                                       return sortInput ?
-                                                               ( indexOf( 
sortInput, a ) - indexOf( sortInput, b ) ) :
-                                                               0;
-                                               }
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+       var node,
+               ret = "",
+               i = 0,
+               nodeType = elem.nodeType;
+
+       if ( !nodeType ) {
+               // If no nodeType, this is expected to be an array
+               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 );
+                       }
+               }
+       } else if ( nodeType === 3 || nodeType === 4 ) {
+               return elem.nodeValue;
+       }
+       // Do not include comment or processing instruction nodes
 
-                                               return compare & 4 ? -1 : 1;
-                                       } :
-                                       function( a, b ) {
-                                               // Exit early if the nodes are 
identical
-                                               if ( a === b ) {
-                                                       hasDuplicate = true;
-                                                       return 0;
-                                               }
+       return ret;
+};
 
-                                               var cur,
-                                                       i = 0,
-                                                       aup = a.parentNode,
-                                                       bup = b.parentNode,
-                                                       ap = [ a ],
-                                                       bp = [ b ];
-
-                                               // Parentless nodes are either 
documents or disconnected
-                                               if ( !aup || !bup ) {
-                                                       return a === doc ? -1 :
-                                                               b === doc ? 1 :
-                                                                       aup ? 
-1 :
-                                                                               
bup ? 1 :
-                                                                               
        sortInput ?
-                                                                               
                ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-                                                                               
                0;
-
-                                                       // If the nodes are 
siblings, we can do a quick check
-                                               } else if ( aup === bup ) {
-                                                       return siblingCheck( a, 
b );
-                                               }
+Expr = Sizzle.selectors = {
 
-                                               // Otherwise we need full lists 
of their ancestors for comparison
-                                               cur = a;
-                                               while ( (cur = cur.parentNode) 
) {
-                                                       ap.unshift( cur );
-                                               }
-                                               cur = b;
-                                               while ( (cur = cur.parentNode) 
) {
-                                                       bp.unshift( cur );
-                                               }
+       // Can be adjusted by the user
+       cacheLength: 50,
 
-                                               // Walk down the tree looking 
for a discrepancy
-                                               while ( ap[i] === bp[i] ) {
-                                                       i++;
-                                               }
+       createPseudo: markFunction,
 
-                                               return i ?
-                                                       // Do a sibling check 
if the nodes have a common ancestor
-                                                       siblingCheck( ap[i], 
bp[i] ) :
+       match: matchExpr,
 
-                                                       // Otherwise nodes in 
our document sort first
-                                                       ap[i] === preferredDoc 
? -1 :
-                                                               bp[i] === 
preferredDoc ? 1 :
-                                                                       0;
-                                       };
+       attrHandle: {},
 
-                               return doc;
-                       };
+       find: {},
 
-                       Sizzle.matches = function( expr, elements ) {
-                               return Sizzle( expr, null, null, elements );
-                       };
+       relative: {
+               ">": { dir: "parentNode", first: true },
+               " ": { dir: "parentNode" },
+               "+": { dir: "previousSibling", first: true },
+               "~": { dir: "previousSibling" }
+       },
 
-                       Sizzle.matchesSelector = function( elem, expr ) {
-                               // Set document vars if needed
-                               if ( ( elem.ownerDocument || elem ) !== 
document ) {
-                                       setDocument( elem );
-                               }
+       preFilter: {
+               "ATTR": function( match ) {
+                       match[1] = match[1].replace( runescape, funescape );
 
-                               // Make sure that attribute selectors are quoted
-                               expr = expr.replace( rattributeQuotes, "='$1']" 
);
+                       // Move the given value to match[3] whether quoted or 
unquoted
+                       match[3] = ( match[3] || match[4] || match[5] || "" 
).replace( runescape, funescape );
 
-                               if ( support.matchesSelector && documentIsHTML 
&&
-                                       ( !rbuggyMatches || 
!rbuggyMatches.test( expr ) ) &&
-                                       ( !rbuggyQSA     || !rbuggyQSA.test( 
expr ) ) ) {
+                       if ( match[2] === "~=" ) {
+                               match[3] = " " + match[3] + " ";
+                       }
 
-                                       try {
-                                               var ret = matches.call( 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 ) {
-                                                       return ret;
-                                               }
-                                       } catch (e) {}
-                               }
+                       return match.slice( 0, 4 );
+               },
 
-                               return Sizzle( expr, document, null, [ elem ] 
).length > 0;
-                       };
+               "CHILD": function( match ) {
+                       /* matches from matchExpr["CHILD"]
+                               1 type (only|nth|...)
+                               2 what (child|of-type)
+                               3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+                               4 xn-component of xn+y argument ([+-]?\d*n|)
+                               5 sign of xn-component
+                               6 x of xn-component
+                               7 sign of y-component
+                               8 y of y-component
+                       */
+                       match[1] = match[1].toLowerCase();
 
-                       Sizzle.contains = function( context, elem ) {
-                               // Set document vars if needed
-                               if ( ( context.ownerDocument || context ) !== 
document ) {
-                                       setDocument( context );
+                       if ( match[1].slice( 0, 3 ) === "nth" ) {
+                               // nth-* requires argument
+                               if ( !match[3] ) {
+                                       Sizzle.error( match[0] );
                                }
-                               return contains( context, elem );
-                       };
 
-                       Sizzle.attr = function( elem, name ) {
-                               // Set document vars if needed
-                               if ( ( elem.ownerDocument || elem ) !== 
document ) {
-                                       setDocument( elem );
-                               }
+                               // 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" );
 
-                               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 
) :
-                                               undefined;
+                       // other types prohibit arguments
+                       } else if ( match[3] ) {
+                               Sizzle.error( match[0] );
+                       }
 
-                               return val !== undefined ?
-                                       val :
-                                       support.attributes || !documentIsHTML ?
-                                               elem.getAttribute( name ) :
-                                               (val = 
elem.getAttributeNode(name)) && val.specified ?
-                                                       val.value :
-                                                       null;
-                       };
+                       return match;
+               },
 
-                       Sizzle.error = function( msg ) {
-                               throw new Error( "Syntax error, unrecognized 
expression: " + msg );
-                       };
+               "PSEUDO": function( match ) {
+                       var excess,
+                               unquoted = !match[6] && match[2];
 
-                       /**
-                        * Document sorting and removing duplicates
-                        * @param {ArrayLike} results
-                        */
-                       Sizzle.uniqueSort = function( results ) {
-                               var elem,
-                                       duplicates = [],
-                                       j = 0,
-                                       i = 0;
-
-                               // Unless we *know* we can detect duplicates, 
assume their presence
-                               hasDuplicate = !support.detectDuplicates;
-                               sortInput = !support.sortStable && 
results.slice( 0 );
-                               results.sort( sortOrder );
-
-                               if ( hasDuplicate ) {
-                                       while ( (elem = results[i++]) ) {
-                                               if ( elem === results[ i ] ) {
-                                                       j = duplicates.push( i 
);
-                                               }
-                                       }
-                                       while ( j-- ) {
-                                               results.splice( duplicates[ j 
], 1 );
-                                       }
-                               }
+                       if ( matchExpr["CHILD"].test( match[0] ) ) {
+                               return null;
+                       }
 
-                               // Clear input after sorting to release objects
-                               // See https://github.com/jquery/sizzle/pull/225
-                               sortInput = null;
+                       // Accept quoted arguments as-is
+                       if ( match[3] ) {
+                               match[2] = match[4] || match[5] || "";
 
-                               return results;
-                       };
+                       // Strip excess characters from unquoted arguments
+                       } else if ( unquoted && rpseudo.test( unquoted ) &&
+                               // Get excess from tokenize (recursively)
+                               (excess = tokenize( unquoted, true )) &&
+                               // advance to the next closing parenthesis
+                               (excess = unquoted.indexOf( ")", 
unquoted.length - excess ) - unquoted.length) ) {
 
-                       /**
-                        * Utility function for retrieving the text value of an 
array of DOM nodes
-                        * @param {Array|Element} elem
-                        */
-                       getText = Sizzle.getText = function( elem ) {
-                               var node,
-                                       ret = "",
-                                       i = 0,
-                                       nodeType = elem.nodeType;
+                               // excess is a negative index
+                               match[0] = match[0].slice( 0, excess );
+                               match[2] = unquoted.slice( 0, excess );
+                       }
 
-                               if ( !nodeType ) {
-                                       // If no nodeType, this is expected to 
be an array
-                                       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 ) 

<TRUNCATED>

Reply via email to