| define( [ | 
 | 	"./core", | 
 | 	"./var/document", | 
 | 	"./var/documentElement", | 
 | 	"./var/hasOwn", | 
 | 	"./var/indexOf" | 
 | ], function( jQuery, document, documentElement, hasOwn, indexOf ) { | 
 |  | 
 | "use strict"; | 
 |  | 
 | /* | 
 |  * Optional (non-Sizzle) selector module for custom builds. | 
 |  * | 
 |  * Note that this DOES NOT SUPPORT many documented jQuery | 
 |  * features in exchange for its smaller size: | 
 |  * | 
 |  * Attribute not equal selector | 
 |  * Positional selectors (:first; :eq(n); :odd; etc.) | 
 |  * Type selectors (:input; :checkbox; :button; etc.) | 
 |  * State-based selectors (:animated; :visible; :hidden; etc.) | 
 |  * :has(selector) | 
 |  * :not(complex selector) | 
 |  * custom selectors via Sizzle extensions | 
 |  * Leading combinators (e.g., $collection.find("> *")) | 
 |  * Reliable functionality on XML fragments | 
 |  * Requiring all parts of a selector to match elements under context | 
 |  *   (e.g., $div.find("div > *") now matches children of $div) | 
 |  * Matching against non-elements | 
 |  * Reliable sorting of disconnected nodes | 
 |  * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit) | 
 |  * | 
 |  * If any of these are unacceptable tradeoffs, either use Sizzle or | 
 |  * customize this stub for the project's specific needs. | 
 |  */ | 
 |  | 
 | var hasDuplicate, sortInput, | 
 | 	rhtmlSuffix = /HTML$/i, | 
 | 	sortStable = jQuery.expando.split( "" ).sort( sortOrder ).join( "" ) === jQuery.expando, | 
 | 	matches = documentElement.matches || | 
 | 		documentElement.webkitMatchesSelector || | 
 | 		documentElement.mozMatchesSelector || | 
 | 		documentElement.oMatchesSelector || | 
 | 		documentElement.msMatchesSelector, | 
 |  | 
 | 	// CSS string/identifier serialization | 
 | 	// https://drafts.csswg.org/cssom/#common-serializing-idioms | 
 | 	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, | 
 | 	fcssescape = function( ch, asCodePoint ) { | 
 | 		if ( asCodePoint ) { | 
 |  | 
 | 			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER | 
 | 			if ( ch === "\0" ) { | 
 | 				return "\uFFFD"; | 
 | 			} | 
 |  | 
 | 			// Control characters and (dependent upon position) numbers get escaped as code points | 
 | 			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; | 
 | 		} | 
 |  | 
 | 		// Other potentially-special ASCII characters get backslash-escaped | 
 | 		return "\\" + ch; | 
 | 	}; | 
 |  | 
 | function sortOrder( a, b ) { | 
 |  | 
 | 	// Flag for duplicate removal | 
 | 	if ( a === b ) { | 
 | 		hasDuplicate = true; | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | 	// Sort on method existence if only one input has compareDocumentPosition | 
 | 	var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; | 
 | 	if ( compare ) { | 
 | 		return compare; | 
 | 	} | 
 |  | 
 | 	// Calculate position if both inputs belong to the same document | 
 | 	compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? | 
 | 		a.compareDocumentPosition( b ) : | 
 |  | 
 | 		// Otherwise we know they are disconnected | 
 | 		1; | 
 |  | 
 | 	// Disconnected nodes | 
 | 	if ( compare & 1 ) { | 
 |  | 
 | 		// Choose the first element that is related to our preferred document | 
 | 		if ( a === document || a.ownerDocument === document && | 
 | 			jQuery.contains( document, a ) ) { | 
 | 			return -1; | 
 | 		} | 
 | 		if ( b === document || b.ownerDocument === document && | 
 | 			jQuery.contains( document, b ) ) { | 
 | 			return 1; | 
 | 		} | 
 |  | 
 | 		// Maintain original order | 
 | 		return sortInput ? | 
 | 			( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : | 
 | 			0; | 
 | 	} | 
 |  | 
 | 	return compare & 4 ? -1 : 1; | 
 | } | 
 |  | 
 | function uniqueSort( results ) { | 
 | 	var elem, | 
 | 		duplicates = [], | 
 | 		j = 0, | 
 | 		i = 0; | 
 |  | 
 | 	hasDuplicate = false; | 
 | 	sortInput = !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 ); | 
 | 		} | 
 | 	} | 
 |  | 
 | 	// Clear input after sorting to release objects | 
 | 	// See https://github.com/jquery/sizzle/pull/225 | 
 | 	sortInput = null; | 
 |  | 
 | 	return results; | 
 | } | 
 |  | 
 | function escape( sel ) { | 
 | 	return ( sel + "" ).replace( rcssescape, fcssescape ); | 
 | } | 
 |  | 
 | jQuery.extend( { | 
 | 	uniqueSort: uniqueSort, | 
 | 	unique: uniqueSort, | 
 | 	escapeSelector: escape, | 
 | 	find: function( selector, context, results, seed ) { | 
 | 		var elem, nodeType, | 
 | 			i = 0; | 
 |  | 
 | 		results = results || []; | 
 | 		context = context || document; | 
 |  | 
 | 		// Same basic safeguard as Sizzle | 
 | 		if ( !selector || typeof selector !== "string" ) { | 
 | 			return results; | 
 | 		} | 
 |  | 
 | 		// Early return if context is not an element or document | 
 | 		if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 ) { | 
 | 			return []; | 
 | 		} | 
 |  | 
 | 		if ( seed ) { | 
 | 			while ( ( elem = seed[ i++ ] ) ) { | 
 | 				if ( jQuery.find.matchesSelector( elem, selector ) ) { | 
 | 					results.push( elem ); | 
 | 				} | 
 | 			} | 
 | 		} else { | 
 | 			jQuery.merge( results, context.querySelectorAll( selector ) ); | 
 | 		} | 
 |  | 
 | 		return results; | 
 | 	}, | 
 | 	text: 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 += jQuery.text( node ); | 
 | 			} | 
 | 		} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { | 
 |  | 
 | 			// Use textContent for elements | 
 | 			return elem.textContent; | 
 | 		} else if ( nodeType === 3 || nodeType === 4 ) { | 
 | 			return elem.nodeValue; | 
 | 		} | 
 |  | 
 | 		// Do not include comment or processing instruction nodes | 
 |  | 
 | 		return ret; | 
 | 	}, | 
 | 	contains: function( a, b ) { | 
 | 		var bup = b && b.parentNode; | 
 | 		return a === bup || !!( bup && bup.nodeType === 1 && a.contains( bup ) ); | 
 | 	}, | 
 | 	isXMLDoc: function( elem ) { | 
 | 		var namespace = elem.namespaceURI, | 
 | 			documentElement = ( elem.ownerDocument || elem ).documentElement; | 
 |  | 
 | 		// Assume HTML when documentElement doesn't yet exist, such as inside | 
 | 		// document fragments. | 
 | 		return !rhtmlSuffix.test( namespace || | 
 | 			documentElement && documentElement.nodeName || | 
 | 			"HTML" ); | 
 | 	}, | 
 | 	expr: { | 
 | 		attrHandle: {}, | 
 | 		match: { | 
 | 			bool: new RegExp( "^(?:checked|selected|async|autofocus|autoplay|controls|defer" + | 
 | 				"|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$", "i" ), | 
 | 			needsContext: /^[\x20\t\r\n\f]*[>+~]/ | 
 | 		} | 
 | 	} | 
 | } ); | 
 |  | 
 | jQuery.extend( jQuery.find, { | 
 | 	matches: function( expr, elements ) { | 
 | 		return jQuery.find( expr, null, null, elements ); | 
 | 	}, | 
 | 	matchesSelector: function( elem, expr ) { | 
 | 		return matches.call( elem, expr ); | 
 | 	}, | 
 | 	attr: function( elem, name ) { | 
 | 		var fn = jQuery.expr.attrHandle[ name.toLowerCase() ], | 
 |  | 
 | 			// Don't get fooled by Object.prototype properties (jQuery trac-13807) | 
 | 			value = fn && hasOwn.call( jQuery.expr.attrHandle, name.toLowerCase() ) ? | 
 | 				fn( elem, name, jQuery.isXMLDoc( elem ) ) : | 
 | 				undefined; | 
 | 		return value !== undefined ? value : elem.getAttribute( name ); | 
 | 	} | 
 | } ); | 
 |  | 
 | } ); |