http://git-wip-us.apache.org/repos/asf/struts/blob/810711cc/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-scenario.js
----------------------------------------------------------------------
diff --git 
a/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-scenario.js
 
b/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-scenario.js
index 577093f..6d2e023 100644
--- 
a/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-scenario.js
+++ 
b/archetypes/struts2-archetype-angularjs/src/main/resources/archetype-resources/src/main/webapp/js/lib/angular/angular-scenario.js
@@ -1,32 +1,39 @@
 /*!
- * jQuery JavaScript Library v1.7.2
+ * jQuery JavaScript Library v1.10.2
  * http://jquery.com/
  *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
  * Includes Sizzle.js
  * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
  *
- * Date: Wed Mar 21 12:46:34 2012 -0700
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03T13:48Z
  */
-(function( window, undefined ) {
-'use strict';
+(function( window, undefined ) {'use strict';
 
-// Use the correct document accordingly with window argument (sandbox)
-var document = window.document,
-       navigator = window.navigator,
-       location = window.location;
-var jQuery = (function() {
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//
 
-// Define a local copy of jQuery
-var jQuery = function( selector, context ) {
-               // The jQuery object is actually just the init constructor 
'enhanced'
-               return new jQuery.fn.init( selector, context, rootjQuery );
-       },
+var
+       // The deferred used on DOM ready
+       readyList,
+
+       // A central reference to the root jQuery(document)
+       rootjQuery,
+
+       // Support: IE<10
+       // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
+       core_strundefined = typeof undefined,
+
+       // Use the correct document accordingly with window argument (sandbox)
+       location = window.location,
+       document = window.document,
+       docElem = document.documentElement,
 
        // Map over jQuery in case of overwrite
        _jQuery = window.jQuery,
@@ -34,133 +41,136 @@ var jQuery = function( selector, context ) {
        // Map over the $ in case of overwrite
        _$ = window.$,
 
-       // A central reference to the root jQuery(document)
-       rootjQuery,
+       // [[Class]] -> type pairs
+       class2type = {},
 
-       // A simple way to check for HTML strings or ID strings
-       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-       quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+       // List of deleted data cache ids, so we can reuse them
+       core_deletedIds = [],
+
+       core_version = "1.10.2",
+
+       // Save a reference to some core methods
+       core_concat = core_deletedIds.concat,
+       core_push = core_deletedIds.push,
+       core_slice = core_deletedIds.slice,
+       core_indexOf = core_deletedIds.indexOf,
+       core_toString = class2type.toString,
+       core_hasOwn = class2type.hasOwnProperty,
+       core_trim = core_version.trim,
+
+       // Define a local copy of jQuery
+       jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 
'enhanced'
+               return new jQuery.fn.init( selector, context, rootjQuery );
+       },
+
+       // Used for matching numbers
+       core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+
+       // Used for splitting on whitespace
+       core_rnotwhite = /\S+/g,
 
-       // Check if a string has a non-whitespace character in it
-       rnotwhite = /\S/,
+       // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 
and IE)
+       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
 
-       // Used for trimming whitespace
-       trimLeft = /^\s+/,
-       trimRight = /\s+$/,
+       // A simple way to check for HTML strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       // Strict HTML recognition (#11290: must start with <)
+       rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
 
        // Match a standalone tag
-       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
 
        // JSON RegExp
        rvalidchars = /^[\],:{}\s]*$/,
-       rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
-       rvalidtokens = 
/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
        rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
-       // Useragent RegExp
-       rwebkit = /(webkit)[ \/]([\w.]+)/,
-       ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
-       rmsie = /(msie) ([\w.]+)/,
-       rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+       rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+       rvalidtokens = 
/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
 
        // Matches dashed string for camelizing
-       rdashAlpha = /-([a-z]|[0-9])/ig,
        rmsPrefix = /^-ms-/,
+       rdashAlpha = /-([\da-z])/gi,
 
        // Used by jQuery.camelCase as callback to replace()
        fcamelCase = function( all, letter ) {
-               return ( letter + "" ).toUpperCase();
+               return letter.toUpperCase();
        },
 
-       // Keep a UserAgent string for use with jQuery.browser
-       userAgent = navigator.userAgent,
-
-       // For matching the engine and version of the browser
-       browserMatch,
-
-       // The deferred used on DOM ready
-       readyList,
-
        // The ready event handler
-       DOMContentLoaded,
+       completed = function( event ) {
 
-       // Save a reference to some core methods
-       toString = Object.prototype.toString,
-       hasOwn = Object.prototype.hasOwnProperty,
-       push = Array.prototype.push,
-       slice = Array.prototype.slice,
-       trim = String.prototype.trim,
-       indexOf = Array.prototype.indexOf,
+               // readyState === "complete" is good enough for us to call the 
dom ready in oldIE
+               if ( document.addEventListener || event.type === "load" || 
document.readyState === "complete" ) {
+                       detach();
+                       jQuery.ready();
+               }
+       },
+       // Clean-up method for dom ready events
+       detach = function() {
+               if ( document.addEventListener ) {
+                       document.removeEventListener( "DOMContentLoaded", 
completed, false );
+                       window.removeEventListener( "load", completed, false );
 
-       // [[Class]] -> type pairs
-       class2type = {};
+               } else {
+                       document.detachEvent( "onreadystatechange", completed );
+                       window.detachEvent( "onload", completed );
+               }
+       };
 
 jQuery.fn = jQuery.prototype = {
+       // The current version of jQuery being used
+       jquery: core_version,
+
        constructor: jQuery,
        init: function( selector, context, rootjQuery ) {
-               var match, elem, ret, doc;
+               var match, elem;
 
-               // Handle $(""), $(null), or $(undefined)
+               // HANDLE: $(""), $(null), $(undefined), $(false)
                if ( !selector ) {
                        return this;
                }
 
-               // Handle $(DOMElement)
-               if ( selector.nodeType ) {
-                       this.context = this[0] = selector;
-                       this.length = 1;
-                       return this;
-               }
-
-               // The body element only exists once, optimize finding it
-               if ( selector === "body" && !context && document.body ) {
-                       this.context = document;
-                       this[0] = document.body;
-                       this.selector = selector;
-                       this.length = 1;
-                       return this;
-               }
-
                // Handle HTML strings
                if ( typeof selector === "string" ) {
-                       // Are we dealing with HTML string or an ID?
                        if ( selector.charAt(0) === "<" && selector.charAt( 
selector.length - 1 ) === ">" && selector.length >= 3 ) {
                                // Assume that strings that start and end with 
<> are HTML and skip the regex check
                                match = [ null, selector, null ];
 
                        } else {
-                               match = quickExpr.exec( selector );
+                               match = rquickExpr.exec( selector );
                        }
 
-                       // Verify a match, and that no context was specified 
for #id
+                       // Match html or make sure no context is specified for 
#id
                        if ( match && (match[1] || !context) ) {
 
                                // HANDLE: $(html) -> $(array)
                                if ( match[1] ) {
                                        context = context instanceof jQuery ? 
context[0] : context;
-                                       doc = ( context ? context.ownerDocument 
|| context : document );
-
-                                       // If a single string is passed in and 
it's a single tag
-                                       // just do a createElement and skip the 
rest
-                                       ret = rsingleTag.exec( selector );
 
-                                       if ( ret ) {
-                                               if ( jQuery.isPlainObject( 
context ) ) {
-                                                       selector = [ 
document.createElement( ret[1] ) ];
-                                                       jQuery.fn.attr.call( 
selector, context, true );
-
-                                               } else {
-                                                       selector = [ 
doc.createElement( ret[1] ) ];
+                                       // scripts is true for back-compat
+                                       jQuery.merge( this, jQuery.parseHTML(
+                                               match[1],
+                                               context && context.nodeType ? 
context.ownerDocument || context : document,
+                                               true
+                                       ) );
+
+                                       // HANDLE: $(html, props)
+                                       if ( rsingleTag.test( match[1] ) && 
jQuery.isPlainObject( context ) ) {
+                                               for ( match in context ) {
+                                                       // Properties of 
context are called as methods if possible
+                                                       if ( jQuery.isFunction( 
this[ match ] ) ) {
+                                                               this[ match ]( 
context[ match ] );
+
+                                                       // ...and otherwise set 
as attributes
+                                                       } else {
+                                                               this.attr( 
match, context[ match ] );
+                                                       }
                                                }
-
-                                       } else {
-                                               ret = jQuery.buildFragment( [ 
match[1] ], [ doc ] );
-                                               selector = ( ret.cacheable ? 
jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
                                        }
 
-                                       return jQuery.merge( this, selector );
+                                       return this;
 
-                               // HANDLE: $("#id")
+                               // HANDLE: $(#id)
                                } else {
                                        elem = document.getElementById( 
match[2] );
 
@@ -193,6 +203,12 @@ jQuery.fn = jQuery.prototype = {
                                return this.constructor( context ).find( 
selector );
                        }
 
+               // HANDLE: $(DOMElement)
+               } else if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+
                // HANDLE: $(function)
                // Shortcut for document ready
                } else if ( jQuery.isFunction( selector ) ) {
@@ -210,19 +226,11 @@ jQuery.fn = jQuery.prototype = {
        // Start with an empty selector
        selector: "",
 
-       // The current version of jQuery being used
-       jquery: "1.7.2",
-
        // The default length of a jQuery object is 0
        length: 0,
 
-       // The number of elements contained in the matched element set
-       size: function() {
-               return this.length;
-       },
-
        toArray: function() {
-               return slice.call( this, 0 );
+               return core_slice.call( this );
        },
 
        // Get the Nth element in the matched element set OR
@@ -239,28 +247,15 @@ jQuery.fn = jQuery.prototype = {
 
        // Take an array of elements and push it onto the stack
        // (returning the new matched element set)
-       pushStack: function( elems, name, selector ) {
-               // Build a new jQuery matched element set
-               var ret = this.constructor();
+       pushStack: function( elems ) {
 
-               if ( jQuery.isArray( elems ) ) {
-                       push.apply( ret, elems );
-
-               } else {
-                       jQuery.merge( ret, elems );
-               }
+               // Build a new jQuery matched element set
+               var ret = jQuery.merge( this.constructor(), elems );
 
                // Add the old object onto the stack (as a reference)
                ret.prevObject = this;
-
                ret.context = this.context;
 
-               if ( name === "find" ) {
-                       ret.selector = this.selector + ( this.selector ? " " : 
"" ) + selector;
-               } else if ( name ) {
-                       ret.selector = this.selector + "." + name + "(" + 
selector + ")";
-               }
-
                // Return the newly-formed element set
                return ret;
        },
@@ -273,20 +268,14 @@ jQuery.fn = jQuery.prototype = {
        },
 
        ready: function( fn ) {
-               // Attach the listeners
-               jQuery.bindReady();
-
                // Add the callback
-               readyList.add( fn );
+               jQuery.ready.promise().done( fn );
 
                return this;
        },
 
-       eq: function( i ) {
-               i = +i;
-               return i === -1 ?
-                       this.slice( i ) :
-                       this.slice( i, i + 1 );
+       slice: function() {
+               return this.pushStack( core_slice.apply( this, arguments ) );
        },
 
        first: function() {
@@ -297,9 +286,10 @@ jQuery.fn = jQuery.prototype = {
                return this.eq( -1 );
        },
 
-       slice: function() {
-               return this.pushStack( slice.apply( this, arguments ),
-                       "slice", slice.call(arguments).join(",") );
+       eq: function( i ) {
+               var len = this.length,
+                       j = +i + ( i < 0 ? len : 0 );
+               return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
        },
 
        map: function( callback ) {
@@ -314,7 +304,7 @@ jQuery.fn = jQuery.prototype = {
 
        // For internal use only.
        // Behaves like an Array's method, not like a jQuery method.
-       push: push,
+       push: core_push,
        sort: [].sort,
        splice: [].splice
 };
@@ -323,7 +313,7 @@ jQuery.fn = jQuery.prototype = {
 jQuery.fn.init.prototype = jQuery.fn;
 
 jQuery.extend = jQuery.fn.extend = function() {
-       var options, name, src, copy, copyIsArray, clone,
+       var src, copyIsArray, copy, name, options, clone,
                target = arguments[0] || {},
                i = 1,
                length = arguments.length,
@@ -387,6 +377,10 @@ jQuery.extend = jQuery.fn.extend = function() {
 };
 
 jQuery.extend({
+       // Unique for each copy of jQuery on the page
+       // Non-digits removed to match rinlinejQuery
+       expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" 
),
+
        noConflict: function( deep ) {
                if ( window.$ === jQuery ) {
                        window.$ = _$;
@@ -417,73 +411,31 @@ jQuery.extend({
 
        // Handle when the DOM is ready
        ready: function( wait ) {
-               // Either a released hold or an DOMready/load event and not yet 
ready
-               if ( (wait === true && !--jQuery.readyWait) || (wait !== true 
&& !jQuery.isReady) ) {
-                       // Make sure body exists, at least, in case IE gets a 
little overzealous (ticket #5443).
-                       if ( !document.body ) {
-                               return setTimeout( jQuery.ready, 1 );
-                       }
-
-                       // Remember that the DOM is ready
-                       jQuery.isReady = true;
-
-                       // If a normal DOM Ready event fired, decrement, and 
wait if need be
-                       if ( wait !== true && --jQuery.readyWait > 0 ) {
-                               return;
-                       }
-
-                       // If there are functions bound, to execute
-                       readyList.fireWith( document, [ jQuery ] );
-
-                       // Trigger any bound ready events
-                       if ( jQuery.fn.trigger ) {
-                               jQuery( document ).trigger( "ready" ).off( 
"ready" );
-                       }
-               }
-       },
 
-       bindReady: function() {
-               if ( readyList ) {
+               // Abort if there are pending holds or we're already ready
+               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
                        return;
                }
 
-               readyList = jQuery.Callbacks( "once memory" );
-
-               // Catch cases where $(document).ready() is called after the
-               // browser event has already occurred.
-               if ( document.readyState === "complete" ) {
-                       // Handle it asynchronously to allow scripts the 
opportunity to delay ready
-                       return setTimeout( jQuery.ready, 1 );
+               // Make sure body exists, at least, in case IE gets a little 
overzealous (ticket #5443).
+               if ( !document.body ) {
+                       return setTimeout( jQuery.ready );
                }
 
-               // Mozilla, Opera and webkit nightlies currently support this 
event
-               if ( document.addEventListener ) {
-                       // Use the handy event callback
-                       document.addEventListener( "DOMContentLoaded", 
DOMContentLoaded, false );
-
-                       // A fallback to window.onload, that will always work
-                       window.addEventListener( "load", jQuery.ready, false );
-
-               // If IE event model is used
-               } else if ( document.attachEvent ) {
-                       // ensure firing before onload,
-                       // maybe late but safe also for iframes
-                       document.attachEvent( "onreadystatechange", 
DOMContentLoaded );
-
-                       // A fallback to window.onload, that will always work
-                       window.attachEvent( "onload", jQuery.ready );
+               // Remember that the DOM is ready
+               jQuery.isReady = true;
 
-                       // If IE and not a frame
-                       // continually check to see if the document is ready
-                       var toplevel = false;
+               // If a normal DOM Ready event fired, decrement, and wait if 
need be
+               if ( wait !== true && --jQuery.readyWait > 0 ) {
+                       return;
+               }
 
-                       try {
-                               toplevel = window.frameElement == null;
-                       } catch(e) {}
+               // If there are functions bound, to execute
+               readyList.resolveWith( document, [ jQuery ] );
 
-                       if ( document.documentElement.doScroll && toplevel ) {
-                               doScrollCheck();
-                       }
+               // Trigger any bound ready events
+               if ( jQuery.fn.trigger ) {
+                       jQuery( document ).trigger("ready").off("ready");
                }
        },
 
@@ -499,6 +451,7 @@ jQuery.extend({
        },
 
        isWindow: function( obj ) {
+               /* jshint eqeqeq: false */
                return obj != null && obj == obj.window;
        },
 
@@ -507,12 +460,17 @@ jQuery.extend({
        },
 
        type: function( obj ) {
-               return obj == null ?
-                       String( obj ) :
-                       class2type[ toString.call(obj) ] || "object";
+               if ( obj == null ) {
+                       return String( obj );
+               }
+               return typeof obj === "object" || typeof obj === "function" ?
+                       class2type[ core_toString.call(obj) ] || "object" :
+                       typeof obj;
        },
 
        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
@@ -523,8 +481,8 @@ jQuery.extend({
                try {
                        // Not own constructor property must be Object
                        if ( obj.constructor &&
-                               !hasOwn.call(obj, "constructor") &&
-                               !hasOwn.call(obj.constructor.prototype, 
"isPrototypeOf") ) {
+                               !core_hasOwn.call(obj, "constructor") &&
+                               !core_hasOwn.call(obj.constructor.prototype, 
"isPrototypeOf") ) {
                                return false;
                        }
                } catch ( e ) {
@@ -532,17 +490,24 @@ jQuery.extend({
                        return false;
                }
 
+               // Support: IE<9
+               // Handle iteration over inherited properties before own 
properties.
+               if ( jQuery.support.ownLast ) {
+                       for ( key in obj ) {
+                               return core_hasOwn.call( obj, key );
+                       }
+               }
+
                // Own properties are enumerated firstly, so to speed up,
                // if last one is own, then all properties are own.
-
-               var key;
                for ( key in obj ) {}
 
-               return key === undefined || hasOwn.call( obj, key );
+               return key === undefined || core_hasOwn.call( obj, key );
        },
 
        isEmptyObject: function( obj ) {
-               for ( var name in obj ) {
+               var name;
+               for ( name in obj ) {
                        return false;
                }
                return true;
@@ -552,37 +517,70 @@ jQuery.extend({
                throw new Error( msg );
        },
 
-       parseJSON: function( data ) {
-               if ( typeof data !== "string" || !data ) {
+       // data: string of html
+       // context (optional): If specified, the fragment will be created in 
this context, defaults to document
+       // keepScripts (optional): If true, will include scripts passed in the 
html string
+       parseHTML: function( data, context, keepScripts ) {
+               if ( !data || typeof data !== "string" ) {
                        return null;
                }
+               if ( typeof context === "boolean" ) {
+                       keepScripts = context;
+                       context = false;
+               }
+               context = context || document;
+
+               var parsed = rsingleTag.exec( data ),
+                       scripts = !keepScripts && [];
+
+               // Single tag
+               if ( parsed ) {
+                       return [ context.createElement( parsed[1] ) ];
+               }
 
-               // Make sure leading/trailing whitespace is removed (IE can't 
handle it)
-               data = jQuery.trim( data );
+               parsed = jQuery.buildFragment( [ data ], context, scripts );
+               if ( scripts ) {
+                       jQuery( scripts ).remove();
+               }
+               return jQuery.merge( [], parsed.childNodes );
+       },
 
+       parseJSON: function( data ) {
                // Attempt to parse using the native JSON parser first
                if ( window.JSON && window.JSON.parse ) {
                        return window.JSON.parse( data );
                }
 
-               // Make sure the incoming data is actual JSON
-               // Logic borrowed from http://json.org/json2.js
-               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-                       .replace( rvalidtokens, "]" )
-                       .replace( rvalidbraces, "")) ) {
+               if ( data === null ) {
+                       return data;
+               }
+
+               if ( typeof data === "string" ) {
+
+                       // Make sure leading/trailing whitespace is removed (IE 
can't handle it)
+                       data = jQuery.trim( data );
 
-                       return ( new Function( "return " + data ) )();
+                       if ( data ) {
+                               // Make sure the incoming data is actual JSON
+                               // Logic borrowed from http://json.org/json2.js
+                               if ( rvalidchars.test( data.replace( 
rvalidescape, "@" )
+                                       .replace( rvalidtokens, "]" )
+                                       .replace( rvalidbraces, "")) ) {
 
+                                       return ( new Function( "return " + data 
) )();
+                               }
+                       }
                }
+
                jQuery.error( "Invalid JSON: " + data );
        },
 
        // Cross-browser xml parsing
        parseXML: function( data ) {
-               if ( typeof data !== "string" || !data ) {
+               var xml, tmp;
+               if ( !data || typeof data !== "string" ) {
                        return null;
                }
-               var xml, tmp;
                try {
                        if ( window.DOMParser ) { // Standard
                                tmp = new DOMParser();
@@ -607,7 +605,7 @@ jQuery.extend({
        // 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 && rnotwhite.test( 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
@@ -624,25 +622,30 @@ jQuery.extend({
        },
 
        nodeName: function( elem, name ) {
-               return elem.nodeName && elem.nodeName.toUpperCase() === 
name.toUpperCase();
+               return elem.nodeName && elem.nodeName.toLowerCase() === 
name.toLowerCase();
        },
 
        // args is for internal usage only
-       each: function( object, callback, args ) {
-               var name, i = 0,
-                       length = object.length,
-                       isObj = length === undefined || jQuery.isFunction( 
object );
+       each: function( obj, callback, args ) {
+               var value,
+                       i = 0,
+                       length = obj.length,
+                       isArray = isArraylike( obj );
 
                if ( args ) {
-                       if ( isObj ) {
-                               for ( name in object ) {
-                                       if ( callback.apply( object[ name ], 
args ) === false ) {
+                       if ( isArray ) {
+                               for ( ; i < length; i++ ) {
+                                       value = callback.apply( obj[ i ], args 
);
+
+                                       if ( value === false ) {
                                                break;
                                        }
                                }
                        } else {
-                               for ( ; i < length; ) {
-                                       if ( callback.apply( object[ i++ ], 
args ) === false ) {
+                               for ( i in obj ) {
+                                       value = callback.apply( obj[ i ], args 
);
+
+                                       if ( value === false ) {
                                                break;
                                        }
                                }
@@ -650,72 +653,75 @@ jQuery.extend({
 
                // A special, fast, case for the most common use of each
                } else {
-                       if ( isObj ) {
-                               for ( name in object ) {
-                                       if ( callback.call( object[ name ], 
name, object[ name ] ) === false ) {
+                       if ( isArray ) {
+                               for ( ; i < length; i++ ) {
+                                       value = callback.call( obj[ i ], i, 
obj[ i ] );
+
+                                       if ( value === false ) {
                                                break;
                                        }
                                }
                        } else {
-                               for ( ; i < length; ) {
-                                       if ( callback.call( object[ i ], i, 
object[ i++ ] ) === false ) {
+                               for ( i in obj ) {
+                                       value = callback.call( obj[ i ], i, 
obj[ i ] );
+
+                                       if ( value === false ) {
                                                break;
                                        }
                                }
                        }
                }
 
-               return object;
+               return obj;
        },
 
        // Use native String.trim function wherever possible
-       trim: trim ?
+       trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
                function( text ) {
                        return text == null ?
                                "" :
-                               trim.call( text );
+                               core_trim.call( text );
                } :
 
                // Otherwise use our own trimming functionality
                function( text ) {
                        return text == null ?
                                "" :
-                               text.toString().replace( trimLeft, "" 
).replace( trimRight, "" );
+                               ( text + "" ).replace( rtrim, "" );
                },
 
        // results is for internal usage only
-       makeArray: function( array, results ) {
+       makeArray: function( arr, results ) {
                var ret = results || [];
 
-               if ( array != null ) {
-                       // The window, strings (and functions) also have 
'length'
-                       // Tweaked logic slightly to handle Blackberry 4.7 
RegExp issues #6930
-                       var type = jQuery.type( array );
-
-                       if ( array.length == null || type === "string" || type 
=== "function" || type === "regexp" || jQuery.isWindow( array ) ) {
-                               push.call( ret, array );
+               if ( arr != null ) {
+                       if ( isArraylike( Object(arr) ) ) {
+                               jQuery.merge( ret,
+                                       typeof arr === "string" ?
+                                       [ arr ] : arr
+                               );
                        } else {
-                               jQuery.merge( ret, array );
+                               core_push.call( ret, arr );
                        }
                }
 
                return ret;
        },
 
-       inArray: function( elem, array, i ) {
+       inArray: function( elem, arr, i ) {
                var len;
 
-               if ( array ) {
-                       if ( indexOf ) {
-                               return indexOf.call( array, elem, i );
+               if ( arr ) {
+                       if ( core_indexOf ) {
+                               return core_indexOf.call( arr, elem, i );
                        }
 
-                       len = array.length;
+                       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 array && array[ i ] === elem ) {
+                               if ( i in arr && arr[ i ] === elem ) {
                                        return i;
                                }
                        }
@@ -725,14 +731,14 @@ jQuery.extend({
        },
 
        merge: function( first, second ) {
-               var i = first.length,
+               var l = second.length,
+                       i = first.length,
                        j = 0;
 
-               if ( typeof second.length === "number" ) {
-                       for ( var l = second.length; j < l; j++ ) {
+               if ( typeof l === "number" ) {
+                       for ( ; j < l; j++ ) {
                                first[ i++ ] = second[ j ];
                        }
-
                } else {
                        while ( second[j] !== undefined ) {
                                first[ i++ ] = second[ j++ ];
@@ -745,12 +751,15 @@ jQuery.extend({
        },
 
        grep: function( elems, callback, inv ) {
-               var ret = [], retVal;
+               var retVal,
+                       ret = [],
+                       i = 0,
+                       length = elems.length;
                inv = !!inv;
 
                // Go through the array, only saving the items
                // that pass the validator function
-               for ( var i = 0, length = elems.length; i < length; i++ ) {
+               for ( ; i < length; i++ ) {
                        retVal = !!callback( elems[ i ], i );
                        if ( inv !== retVal ) {
                                ret.push( elems[ i ] );
@@ -762,11 +771,11 @@ jQuery.extend({
 
        // arg is for internal usage only
        map: function( elems, callback, arg ) {
-               var value, key, ret = [],
+               var value,
                        i = 0,
                        length = elems.length,
-                       // jquery objects are treated as arrays
-                       isArray = elems instanceof jQuery || length !== 
undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && 
elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+                       isArray = isArraylike( elems ),
+                       ret = [];
 
                // Go through the array, translating each of the items to their
                if ( isArray ) {
@@ -780,8 +789,8 @@ jQuery.extend({
 
                // Go through every key on the object,
                } else {
-                       for ( key in elems ) {
-                               value = callback( elems[ key ], key, arg );
+                       for ( i in elems ) {
+                               value = callback( elems[ i ], i, arg );
 
                                if ( value != null ) {
                                        ret[ ret.length ] = value;
@@ -790,7 +799,7 @@ jQuery.extend({
                }
 
                // Flatten any nested arrays
-               return ret.concat.apply( [], ret );
+               return core_concat.apply( [], ret );
        },
 
        // A global GUID counter for objects
@@ -799,8 +808,10 @@ jQuery.extend({
        // Bind a function to a context, optionally partially applying any
        // arguments.
        proxy: function( fn, context ) {
+               var args, proxy, tmp;
+
                if ( typeof context === "string" ) {
-                       var tmp = fn[ context ];
+                       tmp = fn[ context ];
                        context = fn;
                        fn = tmp;
                }
@@ -812,59 +823,59 @@ jQuery.extend({
                }
 
                // Simulated bind
-               var args = slice.call( arguments, 2 ),
-                       proxy = function() {
-                               return fn.apply( context, args.concat( 
slice.call( arguments ) ) );
-                       };
+               args = core_slice.call( arguments, 2 );
+               proxy = function() {
+                       return fn.apply( context || this, args.concat( 
core_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 || proxy.guid || jQuery.guid++;
+               proxy.guid = fn.guid = fn.guid || jQuery.guid++;
 
                return proxy;
        },
 
-       // Mutifunctional method to get and set values to a collection
+       // Multifunctional method to get and set values of a collection
        // The value/s can optionally be executed if it's a function
-       access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
-               var exec,
-                       bulk = key == null,
-                       i = 0,
-                       length = elems.length;
+       access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
+               var i = 0,
+                       length = elems.length,
+                       bulk = key == null;
 
                // Sets many values
-               if ( key && typeof key === "object" ) {
+               if ( jQuery.type( key ) === "object" ) {
+                       chainable = true;
                        for ( i in key ) {
-                               jQuery.access( elems, fn, i, key[i], 1, 
emptyGet, value );
+                               jQuery.access( elems, fn, i, key[i], true, 
emptyGet, raw );
                        }
-                       chainable = 1;
 
                // Sets one value
                } else if ( value !== undefined ) {
-                       // Optionally, function values get executed if exec is 
true
-                       exec = pass === undefined && jQuery.isFunction( value );
+                       chainable = true;
 
-                       if ( bulk ) {
-                               // Bulk operations only iterate when executing 
function values
-                               if ( exec ) {
-                                       exec = fn;
-                                       fn = function( elem, key, value ) {
-                                               return exec.call( jQuery( elem 
), value );
-                                       };
+                       if ( !jQuery.isFunction( value ) ) {
+                               raw = true;
+                       }
 
-                               // Otherwise they run against the entire set
-                               } else {
+                       if ( bulk ) {
+                               // Bulk operations run against the entire set
+                               if ( raw ) {
                                        fn.call( elems, value );
                                        fn = null;
+
+                               // ...except when executing function values
+                               } else {
+                                       bulk = fn;
+                                       fn = function( elem, key, value ) {
+                                               return bulk.call( jQuery( elem 
), value );
+                                       };
                                }
                        }
 
                        if ( fn ) {
-                               for (; i < length; i++ ) {
-                                       fn( elems[i], key, exec ? value.call( 
elems[i], i, fn( elems[i], key ) ) : value, pass );
+                               for ( ; i < length; i++ ) {
+                                       fn( elems[i], key, raw ? value : 
value.call( elems[i], i, fn( elems[i], key ) ) );
                                }
                        }
-
-                       chainable = 1;
                }
 
                return chainable ?
@@ -880,4665 +891,4928 @@ jQuery.extend({
                return ( new Date() ).getTime();
        },
 
-       // Use of jQuery.browser is frowned upon.
-       // More details: http://docs.jquery.com/Utilities/jQuery.browser
-       uaMatch: function( ua ) {
-               ua = ua.toLowerCase();
-
-               var match = rwebkit.exec( ua ) ||
-                       ropera.exec( ua ) ||
-                       rmsie.exec( ua ) ||
-                       ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
-                       [];
+       // A method for quickly swapping in/out CSS properties to get correct 
calculations.
+       // Note: this method belongs to the css module but it's needed here for 
the support module.
+       // If support gets modularized, this method should be moved back to the 
css module.
+       swap: function( elem, options, callback, args ) {
+               var ret, name,
+                       old = {};
 
-               return { browser: match[1] || "", version: match[2] || "0" };
-       },
+               // Remember the old values, and insert the new ones
+               for ( name in options ) {
+                       old[ name ] = elem.style[ name ];
+                       elem.style[ name ] = options[ name ];
+               }
 
-       sub: function() {
-               function jQuerySub( selector, context ) {
-                       return new jQuerySub.fn.init( selector, context );
-               }
-               jQuery.extend( true, jQuerySub, this );
-               jQuerySub.superclass = this;
-               jQuerySub.fn = jQuerySub.prototype = this();
-               jQuerySub.fn.constructor = jQuerySub;
-               jQuerySub.sub = this.sub;
-               jQuerySub.fn.init = function init( selector, context ) {
-                       if ( context && context instanceof jQuery && !(context 
instanceof jQuerySub) ) {
-                               context = jQuerySub( context );
-                       }
+               ret = callback.apply( elem, args || [] );
 
-                       return jQuery.fn.init.call( this, selector, context, 
rootjQuerySub );
-               };
-               jQuerySub.fn.init.prototype = jQuerySub.fn;
-               var rootjQuerySub = jQuerySub(document);
-               return jQuerySub;
-       },
+               // Revert the old values
+               for ( name in options ) {
+                       elem.style[ name ] = old[ name ];
+               }
 
-       browser: {}
+               return ret;
+       }
 });
 
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" 
"), function(i, name) {
-       class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
+jQuery.ready.promise = function( obj ) {
+       if ( !readyList ) {
 
-browserMatch = jQuery.uaMatch( userAgent );
-if ( browserMatch.browser ) {
-       jQuery.browser[ browserMatch.browser ] = true;
-       jQuery.browser.version = browserMatch.version;
-}
+               readyList = jQuery.Deferred();
 
-// Deprecated, use jQuery.browser.webkit instead
-if ( jQuery.browser.webkit ) {
-       jQuery.browser.safari = true;
-}
+               // Catch cases where $(document).ready() is called after the 
browser event has already occurred.
+               // we once tried to use readyState "interactive" here, but it 
caused issues like the one
+               // discovered by ChrisS here: 
http://bugs.jquery.com/ticket/12282#comment:15
+               if ( document.readyState === "complete" ) {
+                       // Handle it asynchronously to allow scripts the 
opportunity to delay ready
+                       setTimeout( jQuery.ready );
 
-// IE doesn't match non-breaking spaces with \s
-if ( rnotwhite.test( "\xA0" ) ) {
-       trimLeft = /^[\s\xA0]+/;
-       trimRight = /[\s\xA0]+$/;
-}
+               // Standards-based browsers support DOMContentLoaded
+               } else if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", 
completed, false );
 
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", completed, false );
 
-// Cleanup functions for the document ready method
-if ( document.addEventListener ) {
-       DOMContentLoaded = function() {
-               document.removeEventListener( "DOMContentLoaded", 
DOMContentLoaded, false );
-               jQuery.ready();
-       };
+               // If IE event model is used
+               } else {
+                       // Ensure firing before onload, maybe late but safe 
also for iframes
+                       document.attachEvent( "onreadystatechange", completed );
 
-} else if ( document.attachEvent ) {
-       DOMContentLoaded = function() {
-               // Make sure body exists, at least, in case IE gets a little 
overzealous (ticket #5443).
-               if ( document.readyState === "complete" ) {
-                       document.detachEvent( "onreadystatechange", 
DOMContentLoaded );
-                       jQuery.ready();
-               }
-       };
-}
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", completed );
 
-// The DOM ready check for Internet Explorer
-function doScrollCheck() {
-       if ( jQuery.isReady ) {
-               return;
-       }
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var top = false;
 
-       try {
-               // If IE is used, use the trick by Diego Perini
-               // http://javascript.nwbox.com/IEContentLoaded/
-               document.documentElement.doScroll("left");
-       } catch(e) {
-               setTimeout( doScrollCheck, 1 );
-               return;
-       }
+                       try {
+                               top = window.frameElement == null && 
document.documentElement;
+                       } catch(e) {}
 
-       // and execute any waiting functions
-       jQuery.ready();
-}
+                       if ( top && top.doScroll ) {
+                               (function doScrollCheck() {
+                                       if ( !jQuery.isReady ) {
 
-return jQuery;
+                                               try {
+                                                       // Use the trick by 
Diego Perini
+                                                       // 
http://javascript.nwbox.com/IEContentLoaded/
+                                                       top.doScroll("left");
+                                               } catch(e) {
+                                                       return setTimeout( 
doScrollCheck, 50 );
+                                               }
 
-})();
+                                               // detach all dom ready events
+                                               detach();
 
+                                               // and execute any waiting 
functions
+                                               jQuery.ready();
+                                       }
+                               })();
+                       }
+               }
+       }
+       return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object 
Error".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
 
-// String to Object flags format cache
-var flagsCache = {};
+function isArraylike( obj ) {
+       var length = obj.length,
+               type = jQuery.type( obj );
 
-// Convert String-formatted flags into Object-formatted ones and store in cache
-function createFlags( flags ) {
-       var object = flagsCache[ flags ] = {},
-               i, length;
-       flags = flags.split( /\s+/ );
-       for ( i = 0, length = flags.length; i < length; i++ ) {
-               object[ flags[i] ] = true;
+       if ( jQuery.isWindow( obj ) ) {
+               return false;
        }
-       return object;
+
+       if ( obj.nodeType === 1 && length ) {
+               return true;
+       }
+
+       return type === "array" || type !== "function" &&
+               ( length === 0 ||
+               typeof length === "number" && length > 0 && ( length - 1 ) in 
obj );
 }
 
-/*
- * Create a callback list using the following parameters:
- *
- *     flags:  an optional list of space-separated flags that will change how
- *                     the callback list behaves
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible flags:
- *
- *     once:                   will ensure the callback list can only be fired 
once (like a Deferred)
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+/*!
+ * Sizzle CSS Selector Engine v1.10.2
+ * http://sizzlejs.com/
  *
- *     memory:                 will keep track of previous values and will 
call any callback added
- *                                     after the list has been fired right 
away with the latest "memorized"
- *                                     values (like a Deferred)
- *
- *     unique:                 will ensure a callback can only be added once 
(no duplicate in the list)
- *
- *     stopOnFalse:    interrupt callings when a callback returns false
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
  *
+ * Date: 2013-07-03
  */
-jQuery.Callbacks = function( flags ) {
+(function( window, undefined ) {
 
-       // Convert flags from String-formatted to Object-formatted
-       // (we check in cache first)
-       flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+var i,
+       support,
+       cachedruns,
+       Expr,
+       getText,
+       isXML,
+       compile,
+       outermostContext,
+       sortInput,
+
+       // Local document vars
+       setDocument,
+       document,
+       docElem,
+       documentIsHTML,
+       rbuggyQSA,
+       rbuggyMatches,
+       matches,
+       contains,
+
+       // Instance-specific data
+       expando = "sizzle" + -(new Date()),
+       preferredDoc = window.document,
+       dirruns = 0,
+       done = 0,
+       classCache = createCache(),
+       tokenCache = createCache(),
+       compilerCache = createCache(),
+       hasDuplicate = false,
+       sortOrder = function( a, b ) {
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+               return 0;
+       },
 
-       var // Actual callback list
-               list = [],
-               // Stack of fire calls for repeatable lists
-               stack = [],
-               // Last fire value (for non-forgettable lists)
-               memory,
-               // Flag to know if list was already fired
-               fired,
-               // Flag to know if list is currently firing
-               firing,
-               // First callback to fire (used internally by add and fireWith)
-               firingStart,
-               // End of the loop when firing
-               firingLength,
-               // Index of currently firing callback (modified by remove if 
needed)
-               firingIndex,
-               // Add one or several callbacks to the list
-               add = function( args ) {
-                       var i,
-                               length,
-                               elem,
-                               type,
-                               actual;
-                       for ( i = 0, length = args.length; i < length; i++ ) {
-                               elem = args[ i ];
-                               type = jQuery.type( elem );
-                               if ( type === "array" ) {
-                                       // Inspect recursively
-                                       add( elem );
-                               } else if ( type === "function" ) {
-                                       // Add if not in unique mode and 
callback is not in
-                                       if ( !flags.unique || !self.has( elem ) 
) {
-                                               list.push( elem );
-                                       }
-                               }
-                       }
-               },
-               // Fire callbacks
-               fire = function( context, args ) {
-                       args = args || [];
-                       memory = !flags.memory || [ context, args ];
-                       fired = true;
-                       firing = true;
-                       firingIndex = firingStart || 0;
-                       firingStart = 0;
-                       firingLength = list.length;
-                       for ( ; list && firingIndex < firingLength; 
firingIndex++ ) {
-                               if ( list[ firingIndex ].apply( context, args ) 
=== false && flags.stopOnFalse ) {
-                                       memory = true; // Mark as halted
-                                       break;
-                               }
-                       }
-                       firing = false;
-                       if ( list ) {
-                               if ( !flags.once ) {
-                                       if ( stack && stack.length ) {
-                                               memory = stack.shift();
-                                               self.fireWith( memory[ 0 ], 
memory[ 1 ] );
-                                       }
-                               } else if ( memory === true ) {
-                                       self.disable();
-                               } else {
-                                       list = [];
-                               }
-                       }
-               },
-               // Actual Callbacks object
-               self = {
-                       // Add a callback or a collection of callbacks to the 
list
-                       add: function() {
-                               if ( list ) {
-                                       var length = list.length;
-                                       add( arguments );
-                                       // Do we need to add the callbacks to 
the
-                                       // current firing batch?
-                                       if ( firing ) {
-                                               firingLength = list.length;
-                                       // With memory, if we're not firing then
-                                       // we should call right away, unless 
previous
-                                       // firing was halted (stopOnFalse)
-                                       } else if ( memory && memory !== true ) 
{
-                                               firingStart = length;
-                                               fire( memory[ 0 ], memory[ 1 ] 
);
-                                       }
-                               }
-                               return this;
-                       },
-                       // Remove a callback from the list
-                       remove: function() {
-                               if ( list ) {
-                                       var args = arguments,
-                                               argIndex = 0,
-                                               argLength = args.length;
-                                       for ( ; argIndex < argLength ; 
argIndex++ ) {
-                                               for ( var i = 0; i < 
list.length; i++ ) {
-                                                       if ( args[ argIndex ] 
=== list[ i ] ) {
-                                                               // Handle 
firingIndex and firingLength
-                                                               if ( firing ) {
-                                                                       if ( i 
<= firingLength ) {
-                                                                               
firingLength--;
-                                                                               
if ( i <= firingIndex ) {
-                                                                               
        firingIndex--;
-                                                                               
}
-                                                                       }
-                                                               }
-                                                               // Remove the 
element
-                                                               list.splice( 
i--, 1 );
-                                                               // If we have 
some unicity property then
-                                                               // we only need 
to do this once
-                                                               if ( 
flags.unique ) {
-                                                                       break;
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-                               return this;
-                       },
-                       // Control if a given callback is in the list
-                       has: function( fn ) {
-                               if ( list ) {
-                                       var i = 0,
-                                               length = list.length;
-                                       for ( ; i < length; i++ ) {
-                                               if ( fn === list[ i ] ) {
-                                                       return true;
-                                               }
-                                       }
-                               }
-                               return false;
-                       },
-                       // Remove all callbacks from the list
-                       empty: function() {
-                               list = [];
-                               return this;
-                       },
-                       // Have the list do nothing anymore
-                       disable: function() {
-                               list = stack = memory = undefined;
-                               return this;
-                       },
-                       // Is it disabled?
-                       disabled: function() {
-                               return !list;
-                       },
-                       // Lock the list in its current state
-                       lock: function() {
-                               stack = undefined;
-                               if ( !memory || memory === true ) {
-                                       self.disable();
-                               }
-                               return this;
-                       },
-                       // Is it locked?
-                       locked: function() {
-                               return !stack;
-                       },
-                       // Call all callbacks with the given context and 
arguments
-                       fireWith: function( context, args ) {
-                               if ( stack ) {
-                                       if ( firing ) {
-                                               if ( !flags.once ) {
-                                                       stack.push( [ context, 
args ] );
-                                               }
-                                       } else if ( !( flags.once && memory ) ) 
{
-                                               fire( context, args );
-                                       }
-                               }
-                               return this;
-                       },
-                       // Call all the callbacks with the given arguments
-                       fire: function() {
-                               self.fireWith( this, arguments );
-                               return this;
-                       },
-                       // To know if the callbacks have already been called at 
least once
-                       fired: function() {
-                               return !!fired;
+       // General-purpose constants
+       strundefined = typeof undefined,
+       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 if we can't use a native one
+       indexOf = arr.indexOf || function( elem ) {
+               var i = 0,
+                       len = this.length;
+               for ( ; i < len; i++ ) {
+                       if ( this[i] === elem ) {
+                               return i;
                        }
-               };
+               }
+               return -1;
+       },
 
-       return self;
-};
+       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#" ),
+
+       // Acceptable operators 
http://www.w3.org/TR/selectors/#attribute-selectors
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + 
whitespace +
+               "*(?:([*^$|!~]?=)" + whitespace + 
"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + 
"*\\]",
+
+       // Prefer arguments quoted,
+       //   then not containing pseudos/brackets,
+       //   then attribute selectors/non-parenthetical expressions,
+       //   then anything else
+       // These preferences are here to reduce the number of selectors
+       //   needing tokenize in the PSEUDO preFilter
+       pseudos = ":(" + characterEncoding + 
")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + 
attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+
+       // Leading and non-escaped trailing whitespace, capturing some 
non-whitespace characters preceding the latter
+       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + 
whitespace + "+$", "g" ),
+
+       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+       rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + 
")" + whitespace + "*" ),
+
+       rsibling = new RegExp( 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" )
+       },
 
+       rnative = /^[^{]+\{\s*\[native \w/,
+
+       // Easily-parseable/retrievable ID or TAG or CLASS selectors
+       rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+       rinputs = /^(?:input|select|textarea|button)$/i,
+       rheader = /^h\d$/i,
+
+       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
+               // Workaround erroneous numeric interpretation of +"0x"
+               return high !== high || escapedWhitespace ?
+                       escaped :
+                       // BMP codepoint
+                       high < 0 ?
+                               String.fromCharCode( high + 0x10000 ) :
+                               // Supplemental Plane codepoint (surrogate pair)
+                               String.fromCharCode( high >> 10 | 0xD800, high 
& 0x3FF | 0xDC00 );
+       };
 
+// 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;
+               }
+       };
+}
 
-var // Static reference to slice
-       sliceDeferred = [].slice;
+function Sizzle( selector, context, results, seed ) {
+       var match, elem, m, nodeType,
+               // QSA vars
+               i, groups, old, nid, newContext, newSelector;
 
-jQuery.extend({
+       if ( ( context ? context.ownerDocument || context : preferredDoc ) !== 
document ) {
+               setDocument( context );
+       }
 
-       Deferred: function( func ) {
-               var doneList = jQuery.Callbacks( "once memory" ),
-                       failList = jQuery.Callbacks( "once memory" ),
-                       progressList = jQuery.Callbacks( "memory" ),
-                       state = "pending",
-                       lists = {
-                               resolve: doneList,
-                               reject: failList,
-                               notify: progressList
-                       },
-                       promise = {
-                               done: doneList.add,
-                               fail: failList.add,
-                               progress: progressList.add,
+       context = context || document;
+       results = results || [];
 
-                               state: function() {
-                                       return state;
-                               },
+       if ( !selector || typeof selector !== "string" ) {
+               return results;
+       }
 
-                               // Deprecated
-                               isResolved: doneList.fired,
-                               isRejected: failList.fired,
+       if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+               return [];
+       }
 
-                               then: function( doneCallbacks, failCallbacks, 
progressCallbacks ) {
-                                       deferred.done( doneCallbacks ).fail( 
failCallbacks ).progress( progressCallbacks );
-                                       return this;
-                               },
-                               always: function() {
-                                       deferred.done.apply( deferred, 
arguments ).fail.apply( deferred, arguments );
-                                       return this;
-                               },
-                               pipe: function( fnDone, fnFail, fnProgress ) {
-                                       return jQuery.Deferred(function( 
newDefer ) {
-                                               jQuery.each( {
-                                                       done: [ fnDone, 
"resolve" ],
-                                                       fail: [ fnFail, 
"reject" ],
-                                                       progress: [ fnProgress, 
"notify" ]
-                                               }, function( handler, data ) {
-                                                       var fn = data[ 0 ],
-                                                               action = data[ 
1 ],
-                                                               returned;
-                                                       if ( jQuery.isFunction( 
fn ) ) {
-                                                               deferred[ 
handler ](function() {
-                                                                       
returned = fn.apply( this, arguments );
-                                                                       if ( 
returned && jQuery.isFunction( returned.promise ) ) {
-                                                                               
returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
-                                                                       } else {
-                                                                               
newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] 
);
-                                                                       }
-                                                               });
-                                                       } else {
-                                                               deferred[ 
handler ]( newDefer[ action ] );
-                                                       }
-                                               });
-                                       }).promise();
-                               },
-                               // Get a promise for this deferred
-                               // If obj is provided, the promise aspect is 
added to the object
-                               promise: function( obj ) {
-                                       if ( obj == null ) {
-                                               obj = promise;
-                                       } else {
-                                               for ( var key in promise ) {
-                                                       obj[ key ] = promise[ 
key ];
+       if ( documentIsHTML && !seed ) {
+
+               // Shortcuts
+               if ( (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 #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;
                                        }
-                                       return obj;
                                }
-                       },
-                       deferred = promise.promise({}),
-                       key;
-
-               for ( key in lists ) {
-                       deferred[ key ] = lists[ key ].fire;
-                       deferred[ key + "With" ] = lists[ key ].fireWith;
-               }
 
-               // Handle state
-               deferred.done( function() {
-                       state = "resolved";
-               }, failList.disable, progressList.lock ).fail( function() {
-                       state = "rejected";
-               }, doneList.disable, progressList.lock );
+                       // Speed-up: Sizzle("TAG")
+                       } else if ( match[2] ) {
+                               push.apply( results, 
context.getElementsByTagName( selector ) );
+                               return results;
 
-               // Call given func if any
-               if ( func ) {
-                       func.call( deferred, deferred );
+                       // Speed-up: Sizzle(".CLASS")
+                       } else if ( (m = match[3]) && 
support.getElementsByClassName && context.getElementsByClassName ) {
+                               push.apply( results, 
context.getElementsByClassName( m ) );
+                               return results;
+                       }
                }
 
-               // All done!
-               return deferred;
-       },
+               // QSA path
+               if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) 
) {
+                       nid = old = expando;
+                       newContext = context;
+                       newSelector = nodeType === 9 && selector;
 
-       // Deferred helper
-       when: function( firstParam ) {
-               var args = sliceDeferred.call( arguments, 0 ),
-                       i = 0,
-                       length = args.length,
-                       pValues = new Array( length ),
-                       count = length,
-                       pCount = length,
-                       deferred = length <= 1 && firstParam && 
jQuery.isFunction( firstParam.promise ) ?
-                               firstParam :
-                               jQuery.Deferred(),
-                       promise = deferred.promise();
-               function resolveFunc( i ) {
-                       return function( value ) {
-                               args[ i ] = arguments.length > 1 ? 
sliceDeferred.call( arguments, 0 ) : value;
-                               if ( !( --count ) ) {
-                                       deferred.resolveWith( deferred, args );
-                               }
-                       };
-               }
-               function progressFunc( i ) {
-                       return function( value ) {
-                               pValues[ i ] = arguments.length > 1 ? 
sliceDeferred.call( arguments, 0 ) : value;
-                               deferred.notifyWith( promise, pValues );
-                       };
-               }
-               if ( length > 1 ) {
-                       for ( ; i < length; i++ ) {
-                               if ( args[ i ] && args[ i ].promise && 
jQuery.isFunction( args[ i ].promise ) ) {
-                                       args[ i ].promise().then( 
resolveFunc(i), deferred.reject, progressFunc(i) );
+                       // 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 {
-                                       --count;
+                                       context.setAttribute( "id", nid );
+                               }
+                               nid = "[id='" + nid + "'] ";
+
+                               i = groups.length;
+                               while ( i-- ) {
+                                       groups[i] = nid + toSelector( groups[i] 
);
                                }
+                               newContext = rsibling.test( selector ) && 
context.parentNode || context;
+                               newSelector = groups.join(",");
                        }
-                       if ( !count ) {
-                               deferred.resolveWith( deferred, args );
+
+                       if ( newSelector ) {
+                               try {
+                                       push.apply( results,
+                                               newContext.querySelectorAll( 
newSelector )
+                                       );
+                                       return results;
+                               } catch(qsaError) {
+                               } finally {
+                                       if ( !old ) {
+                                               context.removeAttribute("id");
+                                       }
+                               }
                        }
-               } else if ( deferred !== firstParam ) {
-                       deferred.resolveWith( deferred, length ? [ firstParam ] 
: [] );
                }
-               return promise;
        }
-});
 
+       // All others
+       return select( selector.replace( rtrim, "$1" ), context, results, seed 
);
+}
 
+/**
+ * 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;
+}
 
-jQuery.support = (function() {
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+       fn[ expando ] = true;
+       return fn;
+}
 
-       var support,
-               all,
-               a,
-               select,
-               opt,
-               input,
-               fragment,
-               tds,
-               events,
-               eventName,
-               i,
-               isSupported,
-               div = document.createElement( "div" ),
-               documentElement = document.documentElement;
+/**
+ * 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");
 
-       // Preliminary tests
-       div.setAttribute("className", "t");
-       div.innerHTML = "   <link/><table></table><a href='/a' 
style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+       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;
+       }
+}
 
-       all = div.getElementsByTagName( "*" );
-       a = div.getElementsByTagName( "a" )[ 0 ];
+/**
+ * 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;
 
-       // Can't get basic test support
-       if ( !all || !all.length || !a ) {
-               return {};
+       while ( i-- ) {
+               Expr.attrHandle[ arr[i] ] = handler;
        }
+}
 
-       // First batch of supports tests
-       select = document.createElement( "select" );
-       opt = select.appendChild( document.createElement("option") );
-       input = div.getElementsByTagName( "input" )[ 0 ];
-
-       support = {
-               // IE strips leading whitespace when .innerHTML is used
-               leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
-               // Make sure that tbody elements aren't automatically inserted
-               // IE will insert them into empty tables
-               tbody: !div.getElementsByTagName("tbody").length,
-
-               // Make sure that link elements get serialized correctly by 
innerHTML
-               // This requires a wrapper element in IE
-               htmlSerialize: !!div.getElementsByTagName("link").length,
-
-               // Get the style information from getAttribute
-               // (IE uses .cssText instead)
-               style: /top/.test( a.getAttribute("style") ),
-
-               // Make sure that URLs aren't manipulated
-               // (IE normalizes it by default)
-               hrefNormalized: ( a.getAttribute("href") === "/a" ),
-
-               // Make sure that element opacity exists
-               // (IE uses filter instead)
-               // Use a regex to work around a WebKit issue. See #5145
-               opacity: /^0.55/.test( a.style.opacity ),
-
-               // Verify style float existence
-               // (IE uses styleFloat instead of cssFloat)
-               cssFloat: !!a.style.cssFloat,
-
-               // Make sure that if no value is specified for a checkbox
-               // that it defaults to "on".
-               // (WebKit defaults to "" instead)
-               checkOn: ( input.value === "on" ),
-
-               // Make sure that a selected-by-default option has a working 
selected property.
-               // (WebKit defaults to false instead of true, IE too, if it's 
in an optgroup)
-               optSelected: opt.selected,
-
-               // Test setAttribute on camelCase class. If it works, we need 
attrFixes when doing get/setAttribute (ie6/7)
-               getSetAttribute: div.className !== "t",
-
-               // Tests for enctype support on a form(#6743)
-               enctype: !!document.createElement("form").enctype,
-
-               // Makes sure cloning an html5 element does not cause problems
-               // Where outerHTML is undefined, this still works
-               html5Clone: document.createElement("nav").cloneNode( true 
).outerHTML !== "<:nav></:nav>",
-
-               // Will be defined later
-               submitBubbles: true,
-               changeBubbles: true,
-               focusinBubbles: false,
-               deleteExpando: true,
-               noCloneEvent: true,
-               inlineBlockNeedsLayout: false,
-               shrinkWrapBlocks: false,
-               reliableMarginRight: true,
-               pixelMargin: true
-       };
+/**
+ * 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;
+       }
 
-       // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel 
instead
-       jQuery.boxModel = support.boxModel = (document.compatMode === 
"CSS1Compat");
+       // Check if b follows a
+       if ( cur ) {
+               while ( (cur = cur.nextSibling) ) {
+                       if ( cur === b ) {
+                               return -1;
+                       }
+               }
+       }
 
-       // Make sure checked status is properly cloned
-       input.checked = true;
-       support.noCloneChecked = input.cloneNode( true ).checked;
+       return a ? 1 : -1;
+}
 
-       // Make sure that the options inside disabled selects aren't marked as 
disabled
-       // (WebKit marks them as disabled)
-       select.disabled = true;
-       support.optDisabled = !opt.disabled;
+/**
+ * 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;
+       };
+}
 
-       // Test to see if it's possible to delete an expando from an element
-       // Fails in Internet Explorer
-       try {
-               delete div.test;
-       } catch( e ) {
-               support.deleteExpando = false;
+/**
+ * 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;
+       };
+}
+
+/**
+ * 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]);
+                               }
+                       }
+               });
+       });
+}
+
+/**
+ * Detect xml
+ * @param {Element|Object} elem An element or a document
+ */
+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;
+};
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * 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 doc = node ? node.ownerDocument || node : preferredDoc,
+               parent = doc.defaultView;
+
+       // If no document and documentElement is available, return
+       if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+               return document;
        }
 
-       if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
-               div.attachEvent( "onclick", function() {
-                       // Cloning a node shouldn't copy over any
-                       // bound event handlers (IE does this)
-                       support.noCloneEvent = false;
+       // Set our document
+       document = doc;
+       docElem = doc.documentElement;
+
+       // Support tests
+       documentIsHTML = !isXML( doc );
+
+       // 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.attachEvent && parent !== parent.top ) {
+               parent.attachEvent( "onbeforeunload", function() {
+                       setDocument();
                });
-               div.cloneNode( true ).fireEvent( "onclick" );
        }
 
-       // Check if a radio maintains its value
-       // after being appended to the DOM
-       input = document.createElement("input");
-       input.value = "t";
-       input.setAttribute("type", "radio");
-       support.radioValue = input.value === "t";
+       /* Attributes
+       ---------------------------------------------------------------------- 
*/
 
-       input.setAttribute("checked", "checked");
+       // 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");
+       });
 
-       // #11217 - WebKit loses check when the name is after the checked 
attribute
-       input.setAttribute( "name", "t" );
+       /* getElement(s)By*
+       ---------------------------------------------------------------------- 
*/
 
-       div.appendChild( input );
-       fragment = document.createDocumentFragment();
-       fragment.appendChild( div.lastChild );
+       // Check if getElementsByTagName("*") returns only elements
+       support.getElementsByTagName = assert(function( div ) {
+               div.appendChild( doc.createComment("") );
+               return !div.getElementsByTagName("*").length;
+       });
 
-       // WebKit doesn't clone checked state correctly in fragments
-       support.checkClone = fragment.cloneNode( true ).cloneNode( true 
).lastChild.checked;
+       // Check if getElementsByClassName can be trusted
+       support.getElementsByClassName = assert(function( div ) {
+               div.innerHTML = "<div class='a'></div><div class='a i'></div>";
 
-       // Check if a disconnected checkbox will retain its checked
-       // value of true after appended to the DOM (IE6/7)
-       support.appendChecked = input.checked;
+               // Support: Safari<4
+               // Catch class over-caching
+               div.firstChild.className = "i";
+               // Support: Opera<10
+               // Catch gEBCN failure to find non-leading classes
+               return div.getElementsByClassName("i").length === 2;
+       });
 
-       fragment.removeChild( input );
-       fragment.appendChild( div );
+       // 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;
+       });
 
-       // Technique from Juriy Zaytsev
-       // 
http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
-       // We only care about the case where non-standard event systems
-       // are used, namely in IE. Short-circuiting here helps us to
-       // avoid an eval call (in setAttribute) which can cause CSP
-       // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
-       if ( div.attachEvent ) {
-               for ( i in {
-                       submit: 1,
-                       change: 1,
-                       focusin: 1
-               }) {
-                       eventName = "on" + i;
-                       isSupported = ( eventName in div );
-                       if ( !isSupported ) {
-                               div.setAttribute( eventName, "return;" );
-                               isSupported = ( typeof div[ eventName ] === 
"function" );
+       // ID find and filter
+       if ( support.getById ) {
+               Expr.find["ID"] = function( id, context ) {
+                       if ( typeof context.getElementById !== strundefined && 
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] : [];
                        }
-                       support[ i + "Bubbles" ] = isSupported;
-               }
+               };
+               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 !== 
strundefined && elem.getAttributeNode("id");
+                               return node && node.value === attrId;
+                       };
+               };
        }
 
-       fragment.removeChild( div );
+       // Tag
+       Expr.find["TAG"] = support.getElementsByTagName ?
+               function( tag, context ) {
+                       if ( typeof context.getElementsByTagName !== 
strundefined ) {
+                               return context.getElementsByTagName( tag );
+                       }
+               } :
+               function( tag, context ) {
+                       var elem,
+                               tmp = [],
+                               i = 0,
+                               results = context.getElementsByTagName( tag );
 
-       // Null elements to avoid leaks in IE
-       fragment = select = opt = div = input = null;
+                       // Filter out possible comments
+                       if ( tag === "*" ) {
+                               while ( (elem = results[i++]) ) {
+                                       if ( elem.nodeType === 1 ) {
+                                               tmp.push( elem );
+                                       }
+                               }
 
-       // Run tests that need a body at doc ready
-       jQuery(function() {
-               var container, outer, inner, table, td, offsetSupport,
-                       marginDiv, conMarginTop, style, html, 
positionTopLeftWidthHeight,
-                       paddingMarginBorderVisibility, paddingMarginBorder,
-                       body = document.getElementsByTagName("body")[0];
+                               return tmp;
+                       }
+                       return results;
+               };
 
-               if ( !body ) {
-                       // Return for frameset docs that don't have a body
-                       return;
+       // Class
+       Expr.find["CLASS"] = support.getElementsByClassName && function( 
className, context ) {
+               if ( typeof context.getElementsByClassName !== strundefined && 
documentIsHTML ) {
+                       return context.getElementsByClassName( className );
                }
+       };
 
-               conMarginTop = 1;
-               paddingMarginBorder = "padding:0;margin:0;border:";
-               positionTopLeftWidthHeight = 
"position:absolute;top:0;left:0;width:1px;height:1px;";
-               paddingMarginBorderVisibility = paddingMarginBorder + 
"0;visibility:hidden;";
-               style = "style='" + positionTopLeftWidthHeight + 
paddingMarginBorder + "5px solid #000;";
-               html = "<div " + style + "display:block;'><div style='" + 
paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
-                       "<table " + style + "' cellpadding='0' 
cellspacing='0'>" +
-                       "<tr><td></td></tr></table>";
-
-               container = document.createElement("div");
-               container.style.cssText = paddingMarginBorderVisibility + 
"width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
-               body.insertBefore( container, body.firstChild );
+       /* QSA/matchesSelector
+       ---------------------------------------------------------------------- 
*/
 
-               // Construct the test element
-               div = document.createElement("div");
-               container.appendChild( div );
+       // QSA and matchesSelector support
 
-               // Check if table cells still have offsetWidth/Height when they 
are set
-               // to display:none and there are still other visible table 
cells in a
-               // table row; if so, offsetWidth/Height are not reliable for 
use when
-               // determining if an element has been hidden directly using
-               // display:none (it is still safe to use offsets if a parent 
element is
-               // hidden; don safety goggles and see bug #4512 for more 
information).
-               // (only IE 8 fails this test)
-               div.innerHTML = "<table><tr><td style='" + paddingMarginBorder 
+ "0;display:none'></td><td>t</td></tr></table>";
-               tds = div.getElementsByTagName( "td" );
-               isSupported = ( tds[ 0 ].offsetHeight === 0 );
+       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+       rbuggyMatches = [];
 
-               tds[ 0 ].style.display = "";
-               tds[ 1 ].style.display = "none";
+       // 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 = [];
 
-               // Check if empty table cells still have offsetWidth/Height
-               // (IE <= 8 fail this test)
-               support.reliableHiddenOffsets = isSupported && ( tds[ 0 
].offsetHeight === 0 );
+       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
+                       div.innerHTML = "<select><option 
selected=''></option></select>";
 
-               // Check if div with explicit width and no margin-right 
incorrectly
-               // gets computed margin-right based on width of container. For 
more
-               // info see bug #3333
-               // Fails in WebKit before Feb 2011 nightlies
-               // WebKit Bug 13343 - getComputedStyle returns wrong value for 
margin-right
-               if ( window.getComputedStyle ) {
-                       div.innerHTML = "";
-                       marginDiv = document.createElement( "div" );
-                       marginDiv.style.width = "0";
-                       marginDiv.style.marginRight = "0";
-                       div.style.width = "2px";
-                       div.appendChild( marginDiv );
-                       support.reliableMarginRight =
-                               ( parseInt( ( window.getComputedStyle( 
marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
-               }
+                       // Support: IE8
+                       // Boolean attributes and "value" are not treated 
correctly
+                       if ( !div.querySelectorAll("[selected]").length ) {
+                               rbuggyQSA.push( "\\[" + whitespace + 
"*(?:value|" + booleans + ")" );
+                       }
 
-               if ( typeof div.style.zoom !== "undefined" ) {
-                       // Check if natively block-level elements act like 
inline-block
-                       // elements when setting their display to 'inline' and 
giving
-                       // them layout
-                       // (IE < 8 does this)
-                       div.innerHTML = "";
-                       div.style.width = div.style.padding = "1px";
-                       div.style.border = 0;
-                       div.style.overflow = "hidden";
-                       div.style.display = "inline";
-                       div.style.zoom = 1;
-                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 
3 );
+                       // 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");
+                       }
+               });
 
-                       // Check if elements with layout shrink-wrap their 
children
-                       // (IE 6 does this)
-                       div.style.display = "block";
-                       div.style.overflow = "visible";
-                       div.innerHTML = "<div style='width:5px;'></div>";
-                       support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-               }
+               assert(function( div ) {
 
-               div.style.cssText = positionTopLeftWidthHeight + 
paddingMarginBorderVisibility;
-               div.innerHTML = html;
+                       // Support: Opera 10-12/IE8
+                       // ^= $= *= and empty values
+                       // Should not select anything
+                       // Support: Windows 8 Native Apps
+                       // The type attribute is restricted during .innerHTML 
assignment
+                       var input = doc.createElement("input");
+                       input.setAttribute( "type", "hidden" );
+                       div.appendChild( input ).setAttribute( "t", "" );
 
-               outer = div.firstChild;
-               inner = outer.firstChild;
-               td = outer.nextSibling.firstChild.firstChild;
+                       if ( div.querySelectorAll("[t^='']").length ) {
+                               rbuggyQSA.push( "[*^$]=" + whitespace + 
"*(?:''|\"\")" );
+                       }
 
-               offsetSupport = {
-                       doesNotAddBorder: ( inner.offsetTop !== 5 ),
-                       doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
-               };
+                       // 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" );
+                       }
 
-               inner.style.position = "fixed";
-               inner.style.top = "20px";
+                       // Opera 10-11 does not throw on post-comma invalid 
pseudos
+                       div.querySelectorAll("*,:x");
+                       rbuggyQSA.push(",.*:");
+               });
+       }
 
-               // safari subtracts parent border width here which is 5px
-               offsetSupport.fixedPosition = ( inner.offsetTop === 20 || 
inner.offsetTop === 15 );
-               inner.style.position = inner.style.top = "";
+       if ( (support.matchesSelector = rnative.test( (matches = 
docElem.webkitMatchesSelector ||
+               docElem.mozMatchesSelector ||
+               docElem.oMatchesSelector ||
+               docElem.msMatchesSelector) )) ) {
 
-               outer.style.overflow = "hidden";
-               outer.style.position = "relative";
+               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" );
 
-               offsetSupport.subtractsBorderForOverflowNotVisible = ( 
inner.offsetTop === -5 );
-               offsetSupport.doesNotIncludeMarginInBodyOffset = ( 
body.offsetTop !== conMarginTop );
+                       // This should fail with an exception
+                       // Gecko does not error, returns false instead
+                       matches.call( div, "[s!='']:x" );
+                       rbuggyMatches.push( "!=", pseudos );
+               });
+       }
 
-               if ( window.getComputedStyle ) {
-                       div.style.marginTop = "1%";
-                       support.pixelMargin = ( window.getComputedStyle( div, 
null ) || { marginTop: 0 } ).marginTop !== "1%";
-               }
+       rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+       rbuggyMatches = rbuggyMatches.length && new RegExp( 
rbuggyMatches.join("|") );
+
+       /* Contains
+       ---------------------------------------------------------------------- 
*/
+
+       // Element contains another
+       // Purposefully does not implement inclusive descendent
+       // As in, an element does not contain itself
+       contains = rnative.test( docElem.contains ) || 
docElem.compareDocumentPosition ?
+               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;
+               };
 
-               if ( typeof container.style.zoom !== "undefined" ) {
-                       container.style.zoom = 1;
-               }
+       /* Sorting
+       ---------------------------------------------------------------------- 
*/
 
-               body.removeChild( container );
-               marginDiv = div = container = null;
+       // Document order sorting
+       sortOrder = docElem.compareDocumentPosition ?
+       function( a, b ) {
 
-               jQuery.extend( support, offsetSupport );
-       });
+               // Flag for duplicate removal
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
 
-       return support;
-})();
+               var compare = b.compareDocumentPosition && 
a.compareDocumentPosition && a.compareDocumentPosition( b );
 
+               if ( compare ) {
+                       // Disconnected nodes
+                       if ( compare & 1 ||
+                               (!support.sortDetached && 
b.compareDocumentPosition( a ) === compare) ) {
 
+                               // Choose the first element that is related to 
our preferred document
+                               if ( a === doc || contains(preferredDoc, a) ) {
+                                       return -1;
+                               }
+                               if ( b === doc || contains(preferredDoc, b) ) {
+                                       return 1;
+                               }
 
+                               // Maintain original order
+                               return sortInput ?
+                                       ( indexOf.call( sortInput, a ) - 
indexOf.call( sortInput, b ) ) :
+                                       0;
+                       }
 
-var rbrace = /^(?:\{.*\}|\[.*\])$/,
-       rmultiDash = /([A-Z])/g;
+                       return compare & 4 ? -1 : 1;
+               }
 
-jQuery.extend({
-       cache: {},
+               // Not directly comparable, sort on existence of method
+               return a.compareDocumentPosition ? -1 : 1;
+       } :
+       function( a, b ) {
+               var cur,
+                       i = 0,
+                       aup = a.parentNode,
+                       bup = b.parentNode,
+                       ap = [ a ],
+                       bp = [ b ];
 
-       // Please use with caution
-       uuid: 0,
+               // Exit early if the nodes are identical
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
 
-       // Unique for each copy of jQuery on the page
-       // Non-digits removed to match rinlinejQuery
-       expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( 
/\D/g, "" ),
+               // Parentless nodes are either documents or disconnected
+               } else if ( !aup || !bup ) {
+                       return a === doc ? -1 :
+                               b === doc ? 1 :
+                               aup ? -1 :
+                               bup ? 1 :
+                               sortInput ?
+                               ( indexOf.call( sortInput, a ) - indexOf.call( 
sortInput, b ) ) :
+                               0;
 
-       // The following elements throw uncatchable exceptions if you
-       // attempt to add expando properties to them.
-       noData: {
-               "embed": true,
-               // Ban all objects except for Flash (which handle expandos)
-               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
-               "applet": true
-       },
+               // If the nodes are siblings, we can do a quick check
+               } else if ( aup === bup ) {
+                       return siblingCheck( a, b );
+               }
 
-       hasData: function( elem ) {
-               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : 
elem[ jQuery.expando ];
-               return !!elem && !isEmptyDataObject( elem );
-       },
+               // 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 );
+               }
 
-       data: function( elem, name, data, pvt /* Internal Use Only */ ) {
-               if ( !jQuery.acceptData( elem ) ) {
-                       return;
+               // Walk down the tree looking for a discrepancy
+               while ( ap[i] === bp[i] ) {
+                       i++;
                }
 
-               var privateCache, thisCache, ret,
-                       internalKey = jQuery.expando,
-                       getByName = typeof name === "string",
+               return i ?
+                       // Do a sibling check if the nodes have a common 
ancestor
+                       siblingCheck( ap[i], bp[i] ) :
 
-                       // We have to handle DOM nodes and JS objects 
differently because IE6-7
-                       // can't GC object references properly across the 
DOM-JS boundary
-                       isNode = elem.nodeType,
+                       // Otherwise nodes in our document sort first
+                       ap[i] === preferredDoc ? -1 :
+                       bp[i] === preferredDoc ? 1 :
+                       0;
+       };
 
-                       // Only DOM nodes need the global jQuery cache; JS 
object data is
-                       // attached directly to the object so GC can occur 
automatically
-                       cache = isNode ? jQuery.cache : elem,
+       return doc;
+};
 
-                       // Only defining an ID for JS objects if its cache 
already exists allows
-                       // the code to shortcut on the same path as a DOM node 
with no cache
-                       id = isNode ? elem[ internalKey ] : elem[ internalKey ] 
&& internalKey,
-                       isEvents = name === "events";
+Sizzle.matches = function( expr, elements ) {
+       return Sizzle( expr, null, null, elements );
+};
 
-               // Avoid doing any more work than we need to when trying to get 
data on an
-               // object that has no data at all
-               if ( (!id || !cache[id] || (!isEvents && !pvt && 
!cache[id].data)) && getByName && data === undefined ) {
-                       return;
-               }
+Sizzle.matchesSelector = function( elem, expr ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
 
-               if ( !id ) {
-                       // Only DOM nodes need a new unique ID for each element 
since their data
-                       // ends up in the global cache
-                       if ( isNode ) {
-                               elem[ internalKey ] = id = ++jQuery.uuid;
-                       } else {
-                               id = internalKey;
-                       }
-               }
+       // Make sure that attribute selectors are quoted
+       expr = expr.replace( rattributeQuotes, "='$1']" );
 
-               if ( !cache[ id ] ) {
-                       cache[ id ] = {};
+       if ( support.matchesSelector && documentIsHTML &&
+               ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+               ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
 
-                       // Avoids exposing jQuery metadata on plain JS objects 
when the object
-                       // is serialized using JSON.stringify
-                       if ( !isNode ) {
-                               cache[ id ].toJSON = jQuery.noop;
-                       }
-               }
+               try {
+                       var ret = matches.call( elem, expr );
 
-               // An object can be passed to jQuery.data instead of a 
key/value pair; this gets
-               // shallow copied over onto the existing cache
-               if ( typeof name === "object" || typeof name === "function" ) {
-                       if ( pvt ) {
-                               cache[ id ] = jQuery.extend( cache[ id ], name 
);
-                       } else {
-                               cache[ id ].data = jQuery.extend( cache[ id 
].data, name );
+                       // 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) {}
+       }
 
-               privateCache = thisCache = cache[ id ];
+       return Sizzle( expr, document, null, [elem] ).length > 0;
+};
 
-               // jQuery data() is stored in a separate object inside the 
object's internal data
-               // cache in order to avoid key collisions between internal data 
and user-defined
-               // data.
-               if ( !pvt ) {
-                       if ( !thisCache.data ) {
-                               thisCache.data = {};
-                       }
+Sizzle.contains = function( context, elem ) {
+       // Set document vars if needed
+       if ( ( context.ownerDocument || context ) !== document ) {
+               setDocument( context );
+       }
+       return contains( context, elem );
+};
 
-                       thisCache = thisCache.data;
-               }
+Sizzle.attr = function( elem, name ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
 
-               if ( data !== undefined ) {
-                       thisCache[ jQuery.camelCase( name ) ] = data;
-               }
+       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;
 
-               // Users should not attempt to inspect the internal events 
object using jQuery.data,
-               // it is undocumented and subject to change. But does anyone 
listen? No.
-               if ( isEvents && !thisCache[ name ] ) {
-                       return privateCache.events;
-               }
+       return val === undefined ?
+               support.attributes || !documentIsHTML ?
+                       elem.getAttribute( name ) :
+                       (val = elem.getAttributeNode(name)) && val.specified ?
+                               val.value :
+                               null :
+               val;
+};
 
-               // Check for both converted-to-camel and non-converted data 
property names
-               // If a data property was specified
-               if ( getByName ) {
+Sizzle.error = function( msg ) {
+       throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
 
-                       // First Try to find as-is property data
-                       ret = thisCache[ name ];
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+       var elem,
+               duplicates = [],
+               j = 0,
+               i = 0;
 
-                       // Test for null|undefined property data
-                       if ( ret == null ) {
+       // Unless we *know* we can detect duplicates, assume their presence
+       hasDuplicate = !support.detectDuplicates;
+       sortInput = !support.sortStable && results.slice( 0 );
+       results.sort( sortOrder );
 
-                               // Try to find the camelCased property
-                               ret = thisCache[ jQuery.camelCase( name ) ];
+       if ( hasDuplicate ) {
+               while ( (elem = results[i++]) ) {
+                       if ( elem === results[ i ] ) {
+                               j = duplicates.push( i );
                        }
-               } else {
-                       ret = thisCache;
                }
+               while ( j-- ) {
+                       results.splice( duplicates[ j ], 1 );
+               }
+       }
 
-               return ret;
-       },
+       return results;
+};
 
-       removeData: function( elem, name, pvt /* Internal Use Only */ ) {
-               if ( !jQuery.acceptData( elem ) ) {
-                       return;
+/**
+ * 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
+               for ( ; (node = elem[i]); 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 (see 
#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
 
-               var thisCache, i, l,
+       return ret;
+};
 
-                       // Reference to internal data cache key
-                       internalKey = jQuery.expando,
+Expr = Sizzle.selectors = {
 
-                       isNode = elem.nodeType,
+       // Can be adjusted by the user
+       cacheLength: 50,
 
-                       // See jQuery.data for more information
-                       cache = isNode ? jQuery.cache : elem,
+       createPseudo: markFunction,
 
-                       // See jQuery.data for more information
-                       id = isNode ? elem[ internalKey ] : internalKey;
+       match: matchExpr,
 
-               // If there is already no cache entry for this object, there is 
no
-               // purpose in continuing
-               if ( !cache[ id ] ) {
-                       return;
-               }
+       attrHandle: {},
 
-               if ( name ) {
+       find: {},
 
-                       thisCache = pvt ? cache[ id ] : cache[ id ].data;
+       relative: {
+               ">": { dir: "parentNode", first: true },
+               " ": { dir: "parentNode" },
+               "+": { dir: "previousSibling", first: true },
+               "~": { dir: "previousSibling" }
+       },
 
-                       if ( thisCache ) {
+       preFilter: {
+               "ATTR": function( match ) {
+                       match[1] = match[1].replace( runescape, funescape );
 
-                               // Support array or space separated string 
names for data keys
-                               if ( !jQuery.isArray( name ) ) {
+                       // Move the given value to match[3] whether quoted or 
unquoted
+                       match[3] = ( match[4] || match[5] || "" ).replace( 
runescape, funescape );
 
-                                       // try the string as a key before any 
manipulation
-                                       if ( name in thisCache ) {
-                                               name = [ name ];
-                                       } else {
+                       if ( match[2] === "~=" ) {
+                               match[3] = " " + match[3] + " ";
+                       }
 
-                                               // split the camel cased 
version by spaces unless a key with the spaces exists
-                                               name = jQuery.camelCase( name );
-                                               if ( name in thisCache ) {
-                                                       name = [ name ];
-                                               } else {
-                                                       name = name.split( " " 
);
-                                               }
-                                       }
-                               }
+                       return match.slice( 0, 4 );
+               },
 
-                               for ( i = 0, l = name.length; i < l; i++ ) {
-                                       delete thisCache[ name[i] ];
+               "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();
+
+                       if ( match[1].slice( 0, 3 ) === "nth" ) {
+                               // nth-* requires argument
+                               if ( !match[3] ) {
+                                       Sizzle.error( match[0] );
                                }
 
-                               // If there is no data left in the cache, we 
want to continue
-                               // and let the cache object itself get destroyed
-                               if ( !( pvt ? isEmptyDataObject : 
jQuery.isEmptyObject )( thisCache ) ) {
-                                       return;
-                               }
+                               // numeric x and y parameters for 
Expr.filter.CHILD
+                               // remember that fals

<TRUNCATED>

Reply via email to