Make WordPress Core

Changeset 24781


Ignore:
Timestamp:
07/23/2013 03:28:25 PM (12 years ago)
Author:
nacin
Message:

Use production version of jQuery Migrate when not SCRIPT_DEBUG, which silences issues.

Minify jQuery as well. These were both unminified for ease of debugging.

fixes #24821.

Location:
trunk/wp-includes
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/js/jquery/jquery.js

    r24546 r24781  
    1 /*!
    2  * jQuery JavaScript Library v1.10.2
    3  * http://jquery.com/
    4  *
    5  * Includes Sizzle.js
    6  * http://sizzlejs.com/
    7  *
    8  * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
    9  * Released under the MIT license
    10  * http://jquery.org/license
    11  *
    12  * Date: 2013-07-03T13:48Z
    13  */
    14 (function( window, undefined ) {
    15 
    16 // Can't do this because several apps including ASP.NET trace
    17 // the stack via arguments.caller.callee and Firefox dies if
    18 // you try to trace through "use strict" call chains. (#13335)
    19 // Support: Firefox 18+
    20 //"use strict";
    21 var
    22     // The deferred used on DOM ready
    23     readyList,
    24 
    25     // A central reference to the root jQuery(document)
    26     rootjQuery,
    27 
    28     // Support: IE<10
    29     // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
    30     core_strundefined = typeof undefined,
    31 
    32     // Use the correct document accordingly with window argument (sandbox)
    33     location = window.location,
    34     document = window.document,
    35     docElem = document.documentElement,
    36 
    37     // Map over jQuery in case of overwrite
    38     _jQuery = window.jQuery,
    39 
    40     // Map over the $ in case of overwrite
    41     _$ = window.$,
    42 
    43     // [[Class]] -> type pairs
    44     class2type = {},
    45 
    46     // List of deleted data cache ids, so we can reuse them
    47     core_deletedIds = [],
    48 
    49     core_version = "1.10.2",
    50 
    51     // Save a reference to some core methods
    52     core_concat = core_deletedIds.concat,
    53     core_push = core_deletedIds.push,
    54     core_slice = core_deletedIds.slice,
    55     core_indexOf = core_deletedIds.indexOf,
    56     core_toString = class2type.toString,
    57     core_hasOwn = class2type.hasOwnProperty,
    58     core_trim = core_version.trim,
    59 
    60     // Define a local copy of jQuery
    61     jQuery = function( selector, context ) {
    62         // The jQuery object is actually just the init constructor 'enhanced'
    63         return new jQuery.fn.init( selector, context, rootjQuery );
    64     },
    65 
    66     // Used for matching numbers
    67     core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
    68 
    69     // Used for splitting on whitespace
    70     core_rnotwhite = /\S+/g,
    71 
    72     // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
    73     rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
    74 
    75     // A simple way to check for HTML strings
    76     // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
    77     // Strict HTML recognition (#11290: must start with <)
    78     rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
    79 
    80     // Match a standalone tag
    81     rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
    82 
    83     // JSON RegExp
    84     rvalidchars = /^[\],:{}\s]*$/,
    85     rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
    86     rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
    87     rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
    88 
    89     // Matches dashed string for camelizing
    90     rmsPrefix = /^-ms-/,
    91     rdashAlpha = /-([\da-z])/gi,
    92 
    93     // Used by jQuery.camelCase as callback to replace()
    94     fcamelCase = function( all, letter ) {
    95         return letter.toUpperCase();
    96     },
    97 
    98     // The ready event handler
    99     completed = function( event ) {
    100 
    101         // readyState === "complete" is good enough for us to call the dom ready in oldIE
    102         if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
    103             detach();
    104             jQuery.ready();
    105         }
    106     },
    107     // Clean-up method for dom ready events
    108     detach = function() {
    109         if ( document.addEventListener ) {
    110             document.removeEventListener( "DOMContentLoaded", completed, false );
    111             window.removeEventListener( "load", completed, false );
    112 
    113         } else {
    114             document.detachEvent( "onreadystatechange", completed );
    115             window.detachEvent( "onload", completed );
    116         }
    117     };
    118 
    119 jQuery.fn = jQuery.prototype = {
    120     // The current version of jQuery being used
    121     jquery: core_version,
    122 
    123     constructor: jQuery,
    124     init: function( selector, context, rootjQuery ) {
    125         var match, elem;
    126 
    127         // HANDLE: $(""), $(null), $(undefined), $(false)
    128         if ( !selector ) {
    129             return this;
    130         }
    131 
    132         // Handle HTML strings
    133         if ( typeof selector === "string" ) {
    134             if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
    135                 // Assume that strings that start and end with <> are HTML and skip the regex check
    136                 match = [ null, selector, null ];
    137 
    138             } else {
    139                 match = rquickExpr.exec( selector );
    140             }
    141 
    142             // Match html or make sure no context is specified for #id
    143             if ( match && (match[1] || !context) ) {
    144 
    145                 // HANDLE: $(html) -> $(array)
    146                 if ( match[1] ) {
    147                     context = context instanceof jQuery ? context[0] : context;
    148 
    149                     // scripts is true for back-compat
    150                     jQuery.merge( this, jQuery.parseHTML(
    151                         match[1],
    152                         context && context.nodeType ? context.ownerDocument || context : document,
    153                         true
    154                     ) );
    155 
    156                     // HANDLE: $(html, props)
    157                     if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
    158                         for ( match in context ) {
    159                             // Properties of context are called as methods if possible
    160                             if ( jQuery.isFunction( this[ match ] ) ) {
    161                                 this[ match ]( context[ match ] );
    162 
    163                             // ...and otherwise set as attributes
    164                             } else {
    165                                 this.attr( match, context[ match ] );
    166                             }
    167                         }
    168                     }
    169 
    170                     return this;
    171 
    172                 // HANDLE: $(#id)
    173                 } else {
    174                     elem = document.getElementById( match[2] );
    175 
    176                     // Check parentNode to catch when Blackberry 4.6 returns
    177                     // nodes that are no longer in the document #6963
    178                     if ( elem && elem.parentNode ) {
    179                         // Handle the case where IE and Opera return items
    180                         // by name instead of ID
    181                         if ( elem.id !== match[2] ) {
    182                             return rootjQuery.find( selector );
    183                         }
    184 
    185                         // Otherwise, we inject the element directly into the jQuery object
    186                         this.length = 1;
    187                         this[0] = elem;
    188                     }
    189 
    190                     this.context = document;
    191                     this.selector = selector;
    192                     return this;
    193                 }
    194 
    195             // HANDLE: $(expr, $(...))
    196             } else if ( !context || context.jquery ) {
    197                 return ( context || rootjQuery ).find( selector );
    198 
    199             // HANDLE: $(expr, context)
    200             // (which is just equivalent to: $(context).find(expr)
    201             } else {
    202                 return this.constructor( context ).find( selector );
    203             }
    204 
    205         // HANDLE: $(DOMElement)
    206         } else if ( selector.nodeType ) {
    207             this.context = this[0] = selector;
    208             this.length = 1;
    209             return this;
    210 
    211         // HANDLE: $(function)
    212         // Shortcut for document ready
    213         } else if ( jQuery.isFunction( selector ) ) {
    214             return rootjQuery.ready( selector );
    215         }
    216 
    217         if ( selector.selector !== undefined ) {
    218             this.selector = selector.selector;
    219             this.context = selector.context;
    220         }
    221 
    222         return jQuery.makeArray( selector, this );
    223     },
    224 
    225     // Start with an empty selector
    226     selector: "",
    227 
    228     // The default length of a jQuery object is 0
    229     length: 0,
    230 
    231     toArray: function() {
    232         return core_slice.call( this );
    233     },
    234 
    235     // Get the Nth element in the matched element set OR
    236     // Get the whole matched element set as a clean array
    237     get: function( num ) {
    238         return num == null ?
    239 
    240             // Return a 'clean' array
    241             this.toArray() :
    242 
    243             // Return just the object
    244             ( num < 0 ? this[ this.length + num ] : this[ num ] );
    245     },
    246 
    247     // Take an array of elements and push it onto the stack
    248     // (returning the new matched element set)
    249     pushStack: function( elems ) {
    250 
    251         // Build a new jQuery matched element set
    252         var ret = jQuery.merge( this.constructor(), elems );
    253 
    254         // Add the old object onto the stack (as a reference)
    255         ret.prevObject = this;
    256         ret.context = this.context;
    257 
    258         // Return the newly-formed element set
    259         return ret;
    260     },
    261 
    262     // Execute a callback for every element in the matched set.
    263     // (You can seed the arguments with an array of args, but this is
    264     // only used internally.)
    265     each: function( callback, args ) {
    266         return jQuery.each( this, callback, args );
    267     },
    268 
    269     ready: function( fn ) {
    270         // Add the callback
    271         jQuery.ready.promise().done( fn );
    272 
    273         return this;
    274     },
    275 
    276     slice: function() {
    277         return this.pushStack( core_slice.apply( this, arguments ) );
    278     },
    279 
    280     first: function() {
    281         return this.eq( 0 );
    282     },
    283 
    284     last: function() {
    285         return this.eq( -1 );
    286     },
    287 
    288     eq: function( i ) {
    289         var len = this.length,
    290             j = +i + ( i < 0 ? len : 0 );
    291         return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
    292     },
    293 
    294     map: function( callback ) {
    295         return this.pushStack( jQuery.map(this, function( elem, i ) {
    296             return callback.call( elem, i, elem );
    297         }));
    298     },
    299 
    300     end: function() {
    301         return this.prevObject || this.constructor(null);
    302     },
    303 
    304     // For internal use only.
    305     // Behaves like an Array's method, not like a jQuery method.
    306     push: core_push,
    307     sort: [].sort,
    308     splice: [].splice
    309 };
    310 
    311 // Give the init function the jQuery prototype for later instantiation
    312 jQuery.fn.init.prototype = jQuery.fn;
    313 
    314 jQuery.extend = jQuery.fn.extend = function() {
    315     var src, copyIsArray, copy, name, options, clone,
    316         target = arguments[0] || {},
    317         i = 1,
    318         length = arguments.length,
    319         deep = false;
    320 
    321     // Handle a deep copy situation
    322     if ( typeof target === "boolean" ) {
    323         deep = target;
    324         target = arguments[1] || {};
    325         // skip the boolean and the target
    326         i = 2;
    327     }
    328 
    329     // Handle case when target is a string or something (possible in deep copy)
    330     if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
    331         target = {};
    332     }
    333 
    334     // extend jQuery itself if only one argument is passed
    335     if ( length === i ) {
    336         target = this;
    337         --i;
    338     }
    339 
    340     for ( ; i < length; i++ ) {
    341         // Only deal with non-null/undefined values
    342         if ( (options = arguments[ i ]) != null ) {
    343             // Extend the base object
    344             for ( name in options ) {
    345                 src = target[ name ];
    346                 copy = options[ name ];
    347 
    348                 // Prevent never-ending loop
    349                 if ( target === copy ) {
    350                     continue;
    351                 }
    352 
    353                 // Recurse if we're merging plain objects or arrays
    354                 if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
    355                     if ( copyIsArray ) {
    356                         copyIsArray = false;
    357                         clone = src && jQuery.isArray(src) ? src : [];
    358 
    359                     } else {
    360                         clone = src && jQuery.isPlainObject(src) ? src : {};
    361                     }
    362 
    363                     // Never move original objects, clone them
    364                     target[ name ] = jQuery.extend( deep, clone, copy );
    365 
    366                 // Don't bring in undefined values
    367                 } else if ( copy !== undefined ) {
    368                     target[ name ] = copy;
    369                 }
    370             }
    371         }
    372     }
    373 
    374     // Return the modified object
    375     return target;
    376 };
    377 
    378 jQuery.extend({
    379     // Unique for each copy of jQuery on the page
    380     // Non-digits removed to match rinlinejQuery
    381     expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
    382 
    383     noConflict: function( deep ) {
    384         if ( window.$ === jQuery ) {
    385             window.$ = _$;
    386         }
    387 
    388         if ( deep && window.jQuery === jQuery ) {
    389             window.jQuery = _jQuery;
    390         }
    391 
    392         return jQuery;
    393     },
    394 
    395     // Is the DOM ready to be used? Set to true once it occurs.
    396     isReady: false,
    397 
    398     // A counter to track how many items to wait for before
    399     // the ready event fires. See #6781
    400     readyWait: 1,
    401 
    402     // Hold (or release) the ready event
    403     holdReady: function( hold ) {
    404         if ( hold ) {
    405             jQuery.readyWait++;
    406         } else {
    407             jQuery.ready( true );
    408         }
    409     },
    410 
    411     // Handle when the DOM is ready
    412     ready: function( wait ) {
    413 
    414         // Abort if there are pending holds or we're already ready
    415         if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
    416             return;
    417         }
    418 
    419         // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
    420         if ( !document.body ) {
    421             return setTimeout( jQuery.ready );
    422         }
    423 
    424         // Remember that the DOM is ready
    425         jQuery.isReady = true;
    426 
    427         // If a normal DOM Ready event fired, decrement, and wait if need be
    428         if ( wait !== true && --jQuery.readyWait > 0 ) {
    429             return;
    430         }
    431 
    432         // If there are functions bound, to execute
    433         readyList.resolveWith( document, [ jQuery ] );
    434 
    435         // Trigger any bound ready events
    436         if ( jQuery.fn.trigger ) {
    437             jQuery( document ).trigger("ready").off("ready");
    438         }
    439     },
    440 
    441     // See test/unit/core.js for details concerning isFunction.
    442     // Since version 1.3, DOM methods and functions like alert
    443     // aren't supported. They return false on IE (#2968).
    444     isFunction: function( obj ) {
    445         return jQuery.type(obj) === "function";
    446     },
    447 
    448     isArray: Array.isArray || function( obj ) {
    449         return jQuery.type(obj) === "array";
    450     },
    451 
    452     isWindow: function( obj ) {
    453         /* jshint eqeqeq: false */
    454         return obj != null && obj == obj.window;
    455     },
    456 
    457     isNumeric: function( obj ) {
    458         return !isNaN( parseFloat(obj) ) && isFinite( obj );
    459     },
    460 
    461     type: function( obj ) {
    462         if ( obj == null ) {
    463             return String( obj );
    464         }
    465         return typeof obj === "object" || typeof obj === "function" ?
    466             class2type[ core_toString.call(obj) ] || "object" :
    467             typeof obj;
    468     },
    469 
    470     isPlainObject: function( obj ) {
    471         var key;
    472 
    473         // Must be an Object.
    474         // Because of IE, we also have to check the presence of the constructor property.
    475         // Make sure that DOM nodes and window objects don't pass through, as well
    476         if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
    477             return false;
    478         }
    479 
    480         try {
    481             // Not own constructor property must be Object
    482             if ( obj.constructor &&
    483                 !core_hasOwn.call(obj, "constructor") &&
    484                 !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
    485                 return false;
    486             }
    487         } catch ( e ) {
    488             // IE8,9 Will throw exceptions on certain host objects #9897
    489             return false;
    490         }
    491 
    492         // Support: IE<9
    493         // Handle iteration over inherited properties before own properties.
    494         if ( jQuery.support.ownLast ) {
    495             for ( key in obj ) {
    496                 return core_hasOwn.call( obj, key );
    497             }
    498         }
    499 
    500         // Own properties are enumerated firstly, so to speed up,
    501         // if last one is own, then all properties are own.
    502         for ( key in obj ) {}
    503 
    504         return key === undefined || core_hasOwn.call( obj, key );
    505     },
    506 
    507     isEmptyObject: function( obj ) {
    508         var name;
    509         for ( name in obj ) {
    510             return false;
    511         }
    512         return true;
    513     },
    514 
    515     error: function( msg ) {
    516         throw new Error( msg );
    517     },
    518 
    519     // data: string of html
    520     // context (optional): If specified, the fragment will be created in this context, defaults to document
    521     // keepScripts (optional): If true, will include scripts passed in the html string
    522     parseHTML: function( data, context, keepScripts ) {
    523         if ( !data || typeof data !== "string" ) {
    524             return null;
    525         }
    526         if ( typeof context === "boolean" ) {
    527             keepScripts = context;
    528             context = false;
    529         }
    530         context = context || document;
    531 
    532         var parsed = rsingleTag.exec( data ),
    533             scripts = !keepScripts && [];
    534 
    535         // Single tag
    536         if ( parsed ) {
    537             return [ context.createElement( parsed[1] ) ];
    538         }
    539 
    540         parsed = jQuery.buildFragment( [ data ], context, scripts );
    541         if ( scripts ) {
    542             jQuery( scripts ).remove();
    543         }
    544         return jQuery.merge( [], parsed.childNodes );
    545     },
    546 
    547     parseJSON: function( data ) {
    548         // Attempt to parse using the native JSON parser first
    549         if ( window.JSON && window.JSON.parse ) {
    550             return window.JSON.parse( data );
    551         }
    552 
    553         if ( data === null ) {
    554             return data;
    555         }
    556 
    557         if ( typeof data === "string" ) {
    558 
    559             // Make sure leading/trailing whitespace is removed (IE can't handle it)
    560             data = jQuery.trim( data );
    561 
    562             if ( data ) {
    563                 // Make sure the incoming data is actual JSON
    564                 // Logic borrowed from http://json.org/json2.js
    565                 if ( rvalidchars.test( data.replace( rvalidescape, "@" )
    566                     .replace( rvalidtokens, "]" )
    567                     .replace( rvalidbraces, "")) ) {
    568 
    569                     return ( new Function( "return " + data ) )();
    570                 }
    571             }
    572         }
    573 
    574         jQuery.error( "Invalid JSON: " + data );
    575     },
    576 
    577     // Cross-browser xml parsing
    578     parseXML: function( data ) {
    579         var xml, tmp;
    580         if ( !data || typeof data !== "string" ) {
    581             return null;
    582         }
    583         try {
    584             if ( window.DOMParser ) { // Standard
    585                 tmp = new DOMParser();
    586                 xml = tmp.parseFromString( data , "text/xml" );
    587             } else { // IE
    588                 xml = new ActiveXObject( "Microsoft.XMLDOM" );
    589                 xml.async = "false";
    590                 xml.loadXML( data );
    591             }
    592         } catch( e ) {
    593             xml = undefined;
    594         }
    595         if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
    596             jQuery.error( "Invalid XML: " + data );
    597         }
    598         return xml;
    599     },
    600 
    601     noop: function() {},
    602 
    603     // Evaluates a script in a global context
    604     // Workarounds based on findings by Jim Driscoll
    605     // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
    606     globalEval: function( data ) {
    607         if ( data && jQuery.trim( data ) ) {
    608             // We use execScript on Internet Explorer
    609             // We use an anonymous function so that context is window
    610             // rather than jQuery in Firefox
    611             ( window.execScript || function( data ) {
    612                 window[ "eval" ].call( window, data );
    613             } )( data );
    614         }
    615     },
    616 
    617     // Convert dashed to camelCase; used by the css and data modules
    618     // Microsoft forgot to hump their vendor prefix (#9572)
    619     camelCase: function( string ) {
    620         return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
    621     },
    622 
    623     nodeName: function( elem, name ) {
    624         return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
    625     },
    626 
    627     // args is for internal usage only
    628     each: function( obj, callback, args ) {
    629         var value,
    630             i = 0,
    631             length = obj.length,
    632             isArray = isArraylike( obj );
    633 
    634         if ( args ) {
    635             if ( isArray ) {
    636                 for ( ; i < length; i++ ) {
    637                     value = callback.apply( obj[ i ], args );
    638 
    639                     if ( value === false ) {
    640                         break;
    641                     }
    642                 }
    643             } else {
    644                 for ( i in obj ) {
    645                     value = callback.apply( obj[ i ], args );
    646 
    647                     if ( value === false ) {
    648                         break;
    649                     }
    650                 }
    651             }
    652 
    653         // A special, fast, case for the most common use of each
    654         } else {
    655             if ( isArray ) {
    656                 for ( ; i < length; i++ ) {
    657                     value = callback.call( obj[ i ], i, obj[ i ] );
    658 
    659                     if ( value === false ) {
    660                         break;
    661                     }
    662                 }
    663             } else {
    664                 for ( i in obj ) {
    665                     value = callback.call( obj[ i ], i, obj[ i ] );
    666 
    667                     if ( value === false ) {
    668                         break;
    669                     }
    670                 }
    671             }
    672         }
    673 
    674         return obj;
    675     },
    676 
    677     // Use native String.trim function wherever possible
    678     trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
    679         function( text ) {
    680             return text == null ?
    681                 "" :
    682                 core_trim.call( text );
    683         } :
    684 
    685         // Otherwise use our own trimming functionality
    686         function( text ) {
    687             return text == null ?
    688                 "" :
    689                 ( text + "" ).replace( rtrim, "" );
    690         },
    691 
    692     // results is for internal usage only
    693     makeArray: function( arr, results ) {
    694         var ret = results || [];
    695 
    696         if ( arr != null ) {
    697             if ( isArraylike( Object(arr) ) ) {
    698                 jQuery.merge( ret,
    699                     typeof arr === "string" ?
    700                     [ arr ] : arr
    701                 );
    702             } else {
    703                 core_push.call( ret, arr );
    704             }
    705         }
    706 
    707         return ret;
    708     },
    709 
    710     inArray: function( elem, arr, i ) {
    711         var len;
    712 
    713         if ( arr ) {
    714             if ( core_indexOf ) {
    715                 return core_indexOf.call( arr, elem, i );
    716             }
    717 
    718             len = arr.length;
    719             i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
    720 
    721             for ( ; i < len; i++ ) {
    722                 // Skip accessing in sparse arrays
    723                 if ( i in arr && arr[ i ] === elem ) {
    724                     return i;
    725                 }
    726             }
    727         }
    728 
    729         return -1;
    730     },
    731 
    732     merge: function( first, second ) {
    733         var l = second.length,
    734             i = first.length,
    735             j = 0;
    736 
    737         if ( typeof l === "number" ) {
    738             for ( ; j < l; j++ ) {
    739                 first[ i++ ] = second[ j ];
    740             }
    741         } else {
    742             while ( second[j] !== undefined ) {
    743                 first[ i++ ] = second[ j++ ];
    744             }
    745         }
    746 
    747         first.length = i;
    748 
    749         return first;
    750     },
    751 
    752     grep: function( elems, callback, inv ) {
    753         var retVal,
    754             ret = [],
    755             i = 0,
    756             length = elems.length;
    757         inv = !!inv;
    758 
    759         // Go through the array, only saving the items
    760         // that pass the validator function
    761         for ( ; i < length; i++ ) {
    762             retVal = !!callback( elems[ i ], i );
    763             if ( inv !== retVal ) {
    764                 ret.push( elems[ i ] );
    765             }
    766         }
    767 
    768         return ret;
    769     },
    770 
    771     // arg is for internal usage only
    772     map: function( elems, callback, arg ) {
    773         var value,
    774             i = 0,
    775             length = elems.length,
    776             isArray = isArraylike( elems ),
    777             ret = [];
    778 
    779         // Go through the array, translating each of the items to their
    780         if ( isArray ) {
    781             for ( ; i < length; i++ ) {
    782                 value = callback( elems[ i ], i, arg );
    783 
    784                 if ( value != null ) {
    785                     ret[ ret.length ] = value;
    786                 }
    787             }
    788 
    789         // Go through every key on the object,
    790         } else {
    791             for ( i in elems ) {
    792                 value = callback( elems[ i ], i, arg );
    793 
    794                 if ( value != null ) {
    795                     ret[ ret.length ] = value;
    796                 }
    797             }
    798         }
    799 
    800         // Flatten any nested arrays
    801         return core_concat.apply( [], ret );
    802     },
    803 
    804     // A global GUID counter for objects
    805     guid: 1,
    806 
    807     // Bind a function to a context, optionally partially applying any
    808     // arguments.
    809     proxy: function( fn, context ) {
    810         var args, proxy, tmp;
    811 
    812         if ( typeof context === "string" ) {
    813             tmp = fn[ context ];
    814             context = fn;
    815             fn = tmp;
    816         }
    817 
    818         // Quick check to determine if target is callable, in the spec
    819         // this throws a TypeError, but we will just return undefined.
    820         if ( !jQuery.isFunction( fn ) ) {
    821             return undefined;
    822         }
    823 
    824         // Simulated bind
    825         args = core_slice.call( arguments, 2 );
    826         proxy = function() {
    827             return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
    828         };
    829 
    830         // Set the guid of unique handler to the same of original handler, so it can be removed
    831         proxy.guid = fn.guid = fn.guid || jQuery.guid++;
    832 
    833         return proxy;
    834     },
    835 
    836     // Multifunctional method to get and set values of a collection
    837     // The value/s can optionally be executed if it's a function
    838     access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
    839         var i = 0,
    840             length = elems.length,
    841             bulk = key == null;
    842 
    843         // Sets many values
    844         if ( jQuery.type( key ) === "object" ) {
    845             chainable = true;
    846             for ( i in key ) {
    847                 jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
    848             }
    849 
    850         // Sets one value
    851         } else if ( value !== undefined ) {
    852             chainable = true;
    853 
    854             if ( !jQuery.isFunction( value ) ) {
    855                 raw = true;
    856             }
    857 
    858             if ( bulk ) {
    859                 // Bulk operations run against the entire set
    860                 if ( raw ) {
    861                     fn.call( elems, value );
    862                     fn = null;
    863 
    864                 // ...except when executing function values
    865                 } else {
    866                     bulk = fn;
    867                     fn = function( elem, key, value ) {
    868                         return bulk.call( jQuery( elem ), value );
    869                     };
    870                 }
    871             }
    872 
    873             if ( fn ) {
    874                 for ( ; i < length; i++ ) {
    875                     fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
    876                 }
    877             }
    878         }
    879 
    880         return chainable ?
    881             elems :
    882 
    883             // Gets
    884             bulk ?
    885                 fn.call( elems ) :
    886                 length ? fn( elems[0], key ) : emptyGet;
    887     },
    888 
    889     now: function() {
    890         return ( new Date() ).getTime();
    891     },
    892 
    893     // A method for quickly swapping in/out CSS properties to get correct calculations.
    894     // Note: this method belongs to the css module but it's needed here for the support module.
    895     // If support gets modularized, this method should be moved back to the css module.
    896     swap: function( elem, options, callback, args ) {
    897         var ret, name,
    898             old = {};
    899 
    900         // Remember the old values, and insert the new ones
    901         for ( name in options ) {
    902             old[ name ] = elem.style[ name ];
    903             elem.style[ name ] = options[ name ];
    904         }
    905 
    906         ret = callback.apply( elem, args || [] );
    907 
    908         // Revert the old values
    909         for ( name in options ) {
    910             elem.style[ name ] = old[ name ];
    911         }
    912 
    913         return ret;
    914     }
    915 });
    916 
    917 jQuery.ready.promise = function( obj ) {
    918     if ( !readyList ) {
    919 
    920         readyList = jQuery.Deferred();
    921 
    922         // Catch cases where $(document).ready() is called after the browser event has already occurred.
    923         // we once tried to use readyState "interactive" here, but it caused issues like the one
    924         // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
    925         if ( document.readyState === "complete" ) {
    926             // Handle it asynchronously to allow scripts the opportunity to delay ready
    927             setTimeout( jQuery.ready );
    928 
    929         // Standards-based browsers support DOMContentLoaded
    930         } else if ( document.addEventListener ) {
    931             // Use the handy event callback
    932             document.addEventListener( "DOMContentLoaded", completed, false );
    933 
    934             // A fallback to window.onload, that will always work
    935             window.addEventListener( "load", completed, false );
    936 
    937         // If IE event model is used
    938         } else {
    939             // Ensure firing before onload, maybe late but safe also for iframes
    940             document.attachEvent( "onreadystatechange", completed );
    941 
    942             // A fallback to window.onload, that will always work
    943             window.attachEvent( "onload", completed );
    944 
    945             // If IE and not a frame
    946             // continually check to see if the document is ready
    947             var top = false;
    948 
    949             try {
    950                 top = window.frameElement == null && document.documentElement;
    951             } catch(e) {}
    952 
    953             if ( top && top.doScroll ) {
    954                 (function doScrollCheck() {
    955                     if ( !jQuery.isReady ) {
    956 
    957                         try {
    958                             // Use the trick by Diego Perini
    959                             // http://javascript.nwbox.com/IEContentLoaded/
    960                             top.doScroll("left");
    961                         } catch(e) {
    962                             return setTimeout( doScrollCheck, 50 );
    963                         }
    964 
    965                         // detach all dom ready events
    966                         detach();
    967 
    968                         // and execute any waiting functions
    969                         jQuery.ready();
    970                     }
    971                 })();
    972             }
    973         }
    974     }
    975     return readyList.promise( obj );
    976 };
    977 
    978 // Populate the class2type map
    979 jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
    980     class2type[ "[object " + name + "]" ] = name.toLowerCase();
    981 });
    982 
    983 function isArraylike( obj ) {
    984     var length = obj.length,
    985         type = jQuery.type( obj );
    986 
    987     if ( jQuery.isWindow( obj ) ) {
    988         return false;
    989     }
    990 
    991     if ( obj.nodeType === 1 && length ) {
    992         return true;
    993     }
    994 
    995     return type === "array" || type !== "function" &&
    996         ( length === 0 ||
    997         typeof length === "number" && length > 0 && ( length - 1 ) in obj );
    998 }
    999 
    1000 // All jQuery objects should point back to these
    1001 rootjQuery = jQuery(document);
    1002 /*!
    1003  * Sizzle CSS Selector Engine v1.10.2
    1004  * http://sizzlejs.com/
    1005  *
    1006  * Copyright 2013 jQuery Foundation, Inc. and other contributors
    1007  * Released under the MIT license
    1008  * http://jquery.org/license
    1009  *
    1010  * Date: 2013-07-03
    1011  */
    1012 (function( window, undefined ) {
    1013 
    1014 var i,
    1015     support,
    1016     cachedruns,
    1017     Expr,
    1018     getText,
    1019     isXML,
    1020     compile,
    1021     outermostContext,
    1022     sortInput,
    1023 
    1024     // Local document vars
    1025     setDocument,
    1026     document,
    1027     docElem,
    1028     documentIsHTML,
    1029     rbuggyQSA,
    1030     rbuggyMatches,
    1031     matches,
    1032     contains,
    1033 
    1034     // Instance-specific data
    1035     expando = "sizzle" + -(new Date()),
    1036     preferredDoc = window.document,
    1037     dirruns = 0,
    1038     done = 0,
    1039     classCache = createCache(),
    1040     tokenCache = createCache(),
    1041     compilerCache = createCache(),
    1042     hasDuplicate = false,
    1043     sortOrder = function( a, b ) {
    1044         if ( a === b ) {
    1045             hasDuplicate = true;
    1046             return 0;
    1047         }
    1048         return 0;
    1049     },
    1050 
    1051     // General-purpose constants
    1052     strundefined = typeof undefined,
    1053     MAX_NEGATIVE = 1 << 31,
    1054 
    1055     // Instance methods
    1056     hasOwn = ({}).hasOwnProperty,
    1057     arr = [],
    1058     pop = arr.pop,
    1059     push_native = arr.push,
    1060     push = arr.push,
    1061     slice = arr.slice,
    1062     // Use a stripped-down indexOf if we can't use a native one
    1063     indexOf = arr.indexOf || function( elem ) {
    1064         var i = 0,
    1065             len = this.length;
    1066         for ( ; i < len; i++ ) {
    1067             if ( this[i] === elem ) {
    1068                 return i;
    1069             }
    1070         }
    1071         return -1;
    1072     },
    1073 
    1074     booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
    1075 
    1076     // Regular expressions
    1077 
    1078     // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
    1079     whitespace = "[\\x20\\t\\r\\n\\f]",
    1080     // http://www.w3.org/TR/css3-syntax/#characters
    1081     characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
    1082 
    1083     // Loosely modeled on CSS identifier characters
    1084     // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
    1085     // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
    1086     identifier = characterEncoding.replace( "w", "w#" ),
    1087 
    1088     // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
    1089     attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
    1090         "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
    1091 
    1092     // Prefer arguments quoted,
    1093     //   then not containing pseudos/brackets,
    1094     //   then attribute selectors/non-parenthetical expressions,
    1095     //   then anything else
    1096     // These preferences are here to reduce the number of selectors
    1097     //   needing tokenize in the PSEUDO preFilter
    1098     pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
    1099 
    1100     // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
    1101     rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
    1102 
    1103     rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
    1104     rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
    1105 
    1106     rsibling = new RegExp( whitespace + "*[+~]" ),
    1107     rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
    1108 
    1109     rpseudo = new RegExp( pseudos ),
    1110     ridentifier = new RegExp( "^" + identifier + "$" ),
    1111 
    1112     matchExpr = {
    1113         "ID": new RegExp( "^#(" + characterEncoding + ")" ),
    1114         "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
    1115         "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
    1116         "ATTR": new RegExp( "^" + attributes ),
    1117         "PSEUDO": new RegExp( "^" + pseudos ),
    1118         "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
    1119             "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
    1120             "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
    1121         "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
    1122         // For use in libraries implementing .is()
    1123         // We use this for POS matching in `select`
    1124         "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
    1125             whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
    1126     },
    1127 
    1128     rnative = /^[^{]+\{\s*\[native \w/,
    1129 
    1130     // Easily-parseable/retrievable ID or TAG or CLASS selectors
    1131     rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
    1132 
    1133     rinputs = /^(?:input|select|textarea|button)$/i,
    1134     rheader = /^h\d$/i,
    1135 
    1136     rescape = /'|\\/g,
    1137 
    1138     // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
    1139     runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
    1140     funescape = function( _, escaped, escapedWhitespace ) {
    1141         var high = "0x" + escaped - 0x10000;
    1142         // NaN means non-codepoint
    1143         // Support: Firefox
    1144         // Workaround erroneous numeric interpretation of +"0x"
    1145         return high !== high || escapedWhitespace ?
    1146             escaped :
    1147             // BMP codepoint
    1148             high < 0 ?
    1149                 String.fromCharCode( high + 0x10000 ) :
    1150                 // Supplemental Plane codepoint (surrogate pair)
    1151                 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
    1152     };
    1153 
    1154 // Optimize for push.apply( _, NodeList )
    1155 try {
    1156     push.apply(
    1157         (arr = slice.call( preferredDoc.childNodes )),
    1158         preferredDoc.childNodes
    1159     );
    1160     // Support: Android<4.0
    1161     // Detect silently failing push.apply
    1162     arr[ preferredDoc.childNodes.length ].nodeType;
    1163 } catch ( e ) {
    1164     push = { apply: arr.length ?
    1165 
    1166         // Leverage slice if possible
    1167         function( target, els ) {
    1168             push_native.apply( target, slice.call(els) );
    1169         } :
    1170 
    1171         // Support: IE<9
    1172         // Otherwise append directly
    1173         function( target, els ) {
    1174             var j = target.length,
    1175                 i = 0;
    1176             // Can't trust NodeList.length
    1177             while ( (target[j++] = els[i++]) ) {}
    1178             target.length = j - 1;
    1179         }
    1180     };
    1181 }
    1182 
    1183 function Sizzle( selector, context, results, seed ) {
    1184     var match, elem, m, nodeType,
    1185         // QSA vars
    1186         i, groups, old, nid, newContext, newSelector;
    1187 
    1188     if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
    1189         setDocument( context );
    1190     }
    1191 
    1192     context = context || document;
    1193     results = results || [];
    1194 
    1195     if ( !selector || typeof selector !== "string" ) {
    1196         return results;
    1197     }
    1198 
    1199     if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
    1200         return [];
    1201     }
    1202 
    1203     if ( documentIsHTML && !seed ) {
    1204 
    1205         // Shortcuts
    1206         if ( (match = rquickExpr.exec( selector )) ) {
    1207             // Speed-up: Sizzle("#ID")
    1208             if ( (m = match[1]) ) {
    1209                 if ( nodeType === 9 ) {
    1210                     elem = context.getElementById( m );
    1211                     // Check parentNode to catch when Blackberry 4.6 returns
    1212                     // nodes that are no longer in the document #6963
    1213                     if ( elem && elem.parentNode ) {
    1214                         // Handle the case where IE, Opera, and Webkit return items
    1215                         // by name instead of ID
    1216                         if ( elem.id === m ) {
    1217                             results.push( elem );
    1218                             return results;
    1219                         }
    1220                     } else {
    1221                         return results;
    1222                     }
    1223                 } else {
    1224                     // Context is not a document
    1225                     if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
    1226                         contains( context, elem ) && elem.id === m ) {
    1227                         results.push( elem );
    1228                         return results;
    1229                     }
    1230                 }
    1231 
    1232             // Speed-up: Sizzle("TAG")
    1233             } else if ( match[2] ) {
    1234                 push.apply( results, context.getElementsByTagName( selector ) );
    1235                 return results;
    1236 
    1237             // Speed-up: Sizzle(".CLASS")
    1238             } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
    1239                 push.apply( results, context.getElementsByClassName( m ) );
    1240                 return results;
    1241             }
    1242         }
    1243 
    1244         // QSA path
    1245         if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
    1246             nid = old = expando;
    1247             newContext = context;
    1248             newSelector = nodeType === 9 && selector;
    1249 
    1250             // qSA works strangely on Element-rooted queries
    1251             // We can work around this by specifying an extra ID on the root
    1252             // and working up from there (Thanks to Andrew Dupont for the technique)
    1253             // IE 8 doesn't work on object elements
    1254             if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
    1255                 groups = tokenize( selector );
    1256 
    1257                 if ( (old = context.getAttribute("id")) ) {
    1258                     nid = old.replace( rescape, "\\$&" );
    1259                 } else {
    1260                     context.setAttribute( "id", nid );
    1261                 }
    1262                 nid = "[id='" + nid + "'] ";
    1263 
    1264                 i = groups.length;
    1265                 while ( i-- ) {
    1266                     groups[i] = nid + toSelector( groups[i] );
    1267                 }
    1268                 newContext = rsibling.test( selector ) && context.parentNode || context;
    1269                 newSelector = groups.join(",");
    1270             }
    1271 
    1272             if ( newSelector ) {
    1273                 try {
    1274                     push.apply( results,
    1275                         newContext.querySelectorAll( newSelector )
    1276                     );
    1277                     return results;
    1278                 } catch(qsaError) {
    1279                 } finally {
    1280                     if ( !old ) {
    1281                         context.removeAttribute("id");
    1282                     }
    1283                 }
    1284             }
    1285         }
    1286     }
    1287 
    1288     // All others
    1289     return select( selector.replace( rtrim, "$1" ), context, results, seed );
    1290 }
    1291 
    1292 /**
    1293  * Create key-value caches of limited size
    1294  * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
    1295  *  property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
    1296  *  deleting the oldest entry
    1297  */
    1298 function createCache() {
    1299     var keys = [];
    1300 
    1301     function cache( key, value ) {
    1302         // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
    1303         if ( keys.push( key += " " ) > Expr.cacheLength ) {
    1304             // Only keep the most recent entries
    1305             delete cache[ keys.shift() ];
    1306         }
    1307         return (cache[ key ] = value);
    1308     }
    1309     return cache;
    1310 }
    1311 
    1312 /**
    1313  * Mark a function for special use by Sizzle
    1314  * @param {Function} fn The function to mark
    1315  */
    1316 function markFunction( fn ) {
    1317     fn[ expando ] = true;
    1318     return fn;
    1319 }
    1320 
    1321 /**
    1322  * Support testing using an element
    1323  * @param {Function} fn Passed the created div and expects a boolean result
    1324  */
    1325 function assert( fn ) {
    1326     var div = document.createElement("div");
    1327 
    1328     try {
    1329         return !!fn( div );
    1330     } catch (e) {
    1331         return false;
    1332     } finally {
    1333         // Remove from its parent by default
    1334         if ( div.parentNode ) {
    1335             div.parentNode.removeChild( div );
    1336         }
    1337         // release memory in IE
    1338         div = null;
    1339     }
    1340 }
    1341 
    1342 /**
    1343  * Adds the same handler for all of the specified attrs
    1344  * @param {String} attrs Pipe-separated list of attributes
    1345  * @param {Function} handler The method that will be applied
    1346  */
    1347 function addHandle( attrs, handler ) {
    1348     var arr = attrs.split("|"),
    1349         i = attrs.length;
    1350 
    1351     while ( i-- ) {
    1352         Expr.attrHandle[ arr[i] ] = handler;
    1353     }
    1354 }
    1355 
    1356 /**
    1357  * Checks document order of two siblings
    1358  * @param {Element} a
    1359  * @param {Element} b
    1360  * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
    1361  */
    1362 function siblingCheck( a, b ) {
    1363     var cur = b && a,
    1364         diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
    1365             ( ~b.sourceIndex || MAX_NEGATIVE ) -
    1366             ( ~a.sourceIndex || MAX_NEGATIVE );
    1367 
    1368     // Use IE sourceIndex if available on both nodes
    1369     if ( diff ) {
    1370         return diff;
    1371     }
    1372 
    1373     // Check if b follows a
    1374     if ( cur ) {
    1375         while ( (cur = cur.nextSibling) ) {
    1376             if ( cur === b ) {
    1377                 return -1;
    1378             }
    1379         }
    1380     }
    1381 
    1382     return a ? 1 : -1;
    1383 }
    1384 
    1385 /**
    1386  * Returns a function to use in pseudos for input types
    1387  * @param {String} type
    1388  */
    1389 function createInputPseudo( type ) {
    1390     return function( elem ) {
    1391         var name = elem.nodeName.toLowerCase();
    1392         return name === "input" && elem.type === type;
    1393     };
    1394 }
    1395 
    1396 /**
    1397  * Returns a function to use in pseudos for buttons
    1398  * @param {String} type
    1399  */
    1400 function createButtonPseudo( type ) {
    1401     return function( elem ) {
    1402         var name = elem.nodeName.toLowerCase();
    1403         return (name === "input" || name === "button") && elem.type === type;
    1404     };
    1405 }
    1406 
    1407 /**
    1408  * Returns a function to use in pseudos for positionals
    1409  * @param {Function} fn
    1410  */
    1411 function createPositionalPseudo( fn ) {
    1412     return markFunction(function( argument ) {
    1413         argument = +argument;
    1414         return markFunction(function( seed, matches ) {
    1415             var j,
    1416                 matchIndexes = fn( [], seed.length, argument ),
    1417                 i = matchIndexes.length;
    1418 
    1419             // Match elements found at the specified indexes
    1420             while ( i-- ) {
    1421                 if ( seed[ (j = matchIndexes[i]) ] ) {
    1422                     seed[j] = !(matches[j] = seed[j]);
    1423                 }
    1424             }
    1425         });
    1426     });
    1427 }
    1428 
    1429 /**
    1430  * Detect xml
    1431  * @param {Element|Object} elem An element or a document
    1432  */
    1433 isXML = Sizzle.isXML = function( elem ) {
    1434     // documentElement is verified for cases where it doesn't yet exist
    1435     // (such as loading iframes in IE - #4833)
    1436     var documentElement = elem && (elem.ownerDocument || elem).documentElement;
    1437     return documentElement ? documentElement.nodeName !== "HTML" : false;
    1438 };
    1439 
    1440 // Expose support vars for convenience
    1441 support = Sizzle.support = {};
    1442 
    1443 /**
    1444  * Sets document-related variables once based on the current document
    1445  * @param {Element|Object} [doc] An element or document object to use to set the document
    1446  * @returns {Object} Returns the current document
    1447  */
    1448 setDocument = Sizzle.setDocument = function( node ) {
    1449     var doc = node ? node.ownerDocument || node : preferredDoc,
    1450         parent = doc.defaultView;
    1451 
    1452     // If no document and documentElement is available, return
    1453     if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
    1454         return document;
    1455     }
    1456 
    1457     // Set our document
    1458     document = doc;
    1459     docElem = doc.documentElement;
    1460 
    1461     // Support tests
    1462     documentIsHTML = !isXML( doc );
    1463 
    1464     // Support: IE>8
    1465     // If iframe document is assigned to "document" variable and if iframe has been reloaded,
    1466     // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
    1467     // IE6-8 do not support the defaultView property so parent will be undefined
    1468     if ( parent && parent.attachEvent && parent !== parent.top ) {
    1469         parent.attachEvent( "onbeforeunload", function() {
    1470             setDocument();
    1471         });
    1472     }
    1473 
    1474     /* Attributes
    1475     ---------------------------------------------------------------------- */
    1476 
    1477     // Support: IE<8
    1478     // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
    1479     support.attributes = assert(function( div ) {
    1480         div.className = "i";
    1481         return !div.getAttribute("className");
    1482     });
    1483 
    1484     /* getElement(s)By*
    1485     ---------------------------------------------------------------------- */
    1486 
    1487     // Check if getElementsByTagName("*") returns only elements
    1488     support.getElementsByTagName = assert(function( div ) {
    1489         div.appendChild( doc.createComment("") );
    1490         return !div.getElementsByTagName("*").length;
    1491     });
    1492 
    1493     // Check if getElementsByClassName can be trusted
    1494     support.getElementsByClassName = assert(function( div ) {
    1495         div.innerHTML = "<div class='a'></div><div class='a i'></div>";
    1496 
    1497         // Support: Safari<4
    1498         // Catch class over-caching
    1499         div.firstChild.className = "i";
    1500         // Support: Opera<10
    1501         // Catch gEBCN failure to find non-leading classes
    1502         return div.getElementsByClassName("i").length === 2;
    1503     });
    1504 
    1505     // Support: IE<10
    1506     // Check if getElementById returns elements by name
    1507     // The broken getElementById methods don't pick up programatically-set names,
    1508     // so use a roundabout getElementsByName test
    1509     support.getById = assert(function( div ) {
    1510         docElem.appendChild( div ).id = expando;
    1511         return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
    1512     });
    1513 
    1514     // ID find and filter
    1515     if ( support.getById ) {
    1516         Expr.find["ID"] = function( id, context ) {
    1517             if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
    1518                 var m = context.getElementById( id );
    1519                 // Check parentNode to catch when Blackberry 4.6 returns
    1520                 // nodes that are no longer in the document #6963
    1521                 return m && m.parentNode ? [m] : [];
    1522             }
    1523         };
    1524         Expr.filter["ID"] = function( id ) {
    1525             var attrId = id.replace( runescape, funescape );
    1526             return function( elem ) {
    1527                 return elem.getAttribute("id") === attrId;
    1528             };
    1529         };
    1530     } else {
    1531         // Support: IE6/7
    1532         // getElementById is not reliable as a find shortcut
    1533         delete Expr.find["ID"];
    1534 
    1535         Expr.filter["ID"] =  function( id ) {
    1536             var attrId = id.replace( runescape, funescape );
    1537             return function( elem ) {
    1538                 var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
    1539                 return node && node.value === attrId;
    1540             };
    1541         };
    1542     }
    1543 
    1544     // Tag
    1545     Expr.find["TAG"] = support.getElementsByTagName ?
    1546         function( tag, context ) {
    1547             if ( typeof context.getElementsByTagName !== strundefined ) {
    1548                 return context.getElementsByTagName( tag );
    1549             }
    1550         } :
    1551         function( tag, context ) {
    1552             var elem,
    1553                 tmp = [],
    1554                 i = 0,
    1555                 results = context.getElementsByTagName( tag );
    1556 
    1557             // Filter out possible comments
    1558             if ( tag === "*" ) {
    1559                 while ( (elem = results[i++]) ) {
    1560                     if ( elem.nodeType === 1 ) {
    1561                         tmp.push( elem );
    1562                     }
    1563                 }
    1564 
    1565                 return tmp;
    1566             }
    1567             return results;
    1568         };
    1569 
    1570     // Class
    1571     Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
    1572         if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
    1573             return context.getElementsByClassName( className );
    1574         }
    1575     };
    1576 
    1577     /* QSA/matchesSelector
    1578     ---------------------------------------------------------------------- */
    1579 
    1580     // QSA and matchesSelector support
    1581 
    1582     // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
    1583     rbuggyMatches = [];
    1584 
    1585     // qSa(:focus) reports false when true (Chrome 21)
    1586     // We allow this because of a bug in IE8/9 that throws an error
    1587     // whenever `document.activeElement` is accessed on an iframe
    1588     // So, we allow :focus to pass through QSA all the time to avoid the IE error
    1589     // See http://bugs.jquery.com/ticket/13378
    1590     rbuggyQSA = [];
    1591 
    1592     if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
    1593         // Build QSA regex
    1594         // Regex strategy adopted from Diego Perini
    1595         assert(function( div ) {
    1596             // Select is set to empty string on purpose
    1597             // This is to test IE's treatment of not explicitly
    1598             // setting a boolean content attribute,
    1599             // since its presence should be enough
    1600             // http://bugs.jquery.com/ticket/12359
    1601             div.innerHTML = "<select><option selected=''></option></select>";
    1602 
    1603             // Support: IE8
    1604             // Boolean attributes and "value" are not treated correctly
    1605             if ( !div.querySelectorAll("[selected]").length ) {
    1606                 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
    1607             }
    1608 
    1609             // Webkit/Opera - :checked should return selected option elements
    1610             // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
    1611             // IE8 throws error here and will not see later tests
    1612             if ( !div.querySelectorAll(":checked").length ) {
    1613                 rbuggyQSA.push(":checked");
    1614             }
    1615         });
    1616 
    1617         assert(function( div ) {
    1618 
    1619             // Support: Opera 10-12/IE8
    1620             // ^= $= *= and empty values
    1621             // Should not select anything
    1622             // Support: Windows 8 Native Apps
    1623             // The type attribute is restricted during .innerHTML assignment
    1624             var input = doc.createElement("input");
    1625             input.setAttribute( "type", "hidden" );
    1626             div.appendChild( input ).setAttribute( "t", "" );
    1627 
    1628             if ( div.querySelectorAll("[t^='']").length ) {
    1629                 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
    1630             }
    1631 
    1632             // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
    1633             // IE8 throws error here and will not see later tests
    1634             if ( !div.querySelectorAll(":enabled").length ) {
    1635                 rbuggyQSA.push( ":enabled", ":disabled" );
    1636             }
    1637 
    1638             // Opera 10-11 does not throw on post-comma invalid pseudos
    1639             div.querySelectorAll("*,:x");
    1640             rbuggyQSA.push(",.*:");
    1641         });
    1642     }
    1643 
    1644     if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
    1645         docElem.mozMatchesSelector ||
    1646         docElem.oMatchesSelector ||
    1647         docElem.msMatchesSelector) )) ) {
    1648 
    1649         assert(function( div ) {
    1650             // Check to see if it's possible to do matchesSelector
    1651             // on a disconnected node (IE 9)
    1652             support.disconnectedMatch = matches.call( div, "div" );
    1653 
    1654             // This should fail with an exception
    1655             // Gecko does not error, returns false instead
    1656             matches.call( div, "[s!='']:x" );
    1657             rbuggyMatches.push( "!=", pseudos );
    1658         });
    1659     }
    1660 
    1661     rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
    1662     rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
    1663 
    1664     /* Contains
    1665     ---------------------------------------------------------------------- */
    1666 
    1667     // Element contains another
    1668     // Purposefully does not implement inclusive descendent
    1669     // As in, an element does not contain itself
    1670     contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
    1671         function( a, b ) {
    1672             var adown = a.nodeType === 9 ? a.documentElement : a,
    1673                 bup = b && b.parentNode;
    1674             return a === bup || !!( bup && bup.nodeType === 1 && (
    1675                 adown.contains ?
    1676                     adown.contains( bup ) :
    1677                     a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
    1678             ));
    1679         } :
    1680         function( a, b ) {
    1681             if ( b ) {
    1682                 while ( (b = b.parentNode) ) {
    1683                     if ( b === a ) {
    1684                         return true;
    1685                     }
    1686                 }
    1687             }
    1688             return false;
    1689         };
    1690 
    1691     /* Sorting
    1692     ---------------------------------------------------------------------- */
    1693 
    1694     // Document order sorting
    1695     sortOrder = docElem.compareDocumentPosition ?
    1696     function( a, b ) {
    1697 
    1698         // Flag for duplicate removal
    1699         if ( a === b ) {
    1700             hasDuplicate = true;
    1701             return 0;
    1702         }
    1703 
    1704         var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
    1705 
    1706         if ( compare ) {
    1707             // Disconnected nodes
    1708             if ( compare & 1 ||
    1709                 (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
    1710 
    1711                 // Choose the first element that is related to our preferred document
    1712                 if ( a === doc || contains(preferredDoc, a) ) {
    1713                     return -1;
    1714                 }
    1715                 if ( b === doc || contains(preferredDoc, b) ) {
    1716                     return 1;
    1717                 }
    1718 
    1719                 // Maintain original order
    1720                 return sortInput ?
    1721                     ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
    1722                     0;
    1723             }
    1724 
    1725             return compare & 4 ? -1 : 1;
    1726         }
    1727 
    1728         // Not directly comparable, sort on existence of method
    1729         return a.compareDocumentPosition ? -1 : 1;
    1730     } :
    1731     function( a, b ) {
    1732         var cur,
    1733             i = 0,
    1734             aup = a.parentNode,
    1735             bup = b.parentNode,
    1736             ap = [ a ],
    1737             bp = [ b ];
    1738 
    1739         // Exit early if the nodes are identical
    1740         if ( a === b ) {
    1741             hasDuplicate = true;
    1742             return 0;
    1743 
    1744         // Parentless nodes are either documents or disconnected
    1745         } else if ( !aup || !bup ) {
    1746             return a === doc ? -1 :
    1747                 b === doc ? 1 :
    1748                 aup ? -1 :
    1749                 bup ? 1 :
    1750                 sortInput ?
    1751                 ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
    1752                 0;
    1753 
    1754         // If the nodes are siblings, we can do a quick check
    1755         } else if ( aup === bup ) {
    1756             return siblingCheck( a, b );
    1757         }
    1758 
    1759         // Otherwise we need full lists of their ancestors for comparison
    1760         cur = a;
    1761         while ( (cur = cur.parentNode) ) {
    1762             ap.unshift( cur );
    1763         }
    1764         cur = b;
    1765         while ( (cur = cur.parentNode) ) {
    1766             bp.unshift( cur );
    1767         }
    1768 
    1769         // Walk down the tree looking for a discrepancy
    1770         while ( ap[i] === bp[i] ) {
    1771             i++;
    1772         }
    1773 
    1774         return i ?
    1775             // Do a sibling check if the nodes have a common ancestor
    1776             siblingCheck( ap[i], bp[i] ) :
    1777 
    1778             // Otherwise nodes in our document sort first
    1779             ap[i] === preferredDoc ? -1 :
    1780             bp[i] === preferredDoc ? 1 :
    1781             0;
    1782     };
    1783 
    1784     return doc;
    1785 };
    1786 
    1787 Sizzle.matches = function( expr, elements ) {
    1788     return Sizzle( expr, null, null, elements );
    1789 };
    1790 
    1791 Sizzle.matchesSelector = function( elem, expr ) {
    1792     // Set document vars if needed
    1793     if ( ( elem.ownerDocument || elem ) !== document ) {
    1794         setDocument( elem );
    1795     }
    1796 
    1797     // Make sure that attribute selectors are quoted
    1798     expr = expr.replace( rattributeQuotes, "='$1']" );
    1799 
    1800     if ( support.matchesSelector && documentIsHTML &&
    1801         ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
    1802         ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
    1803 
    1804         try {
    1805             var ret = matches.call( elem, expr );
    1806 
    1807             // IE 9's matchesSelector returns false on disconnected nodes
    1808             if ( ret || support.disconnectedMatch ||
    1809                     // As well, disconnected nodes are said to be in a document
    1810                     // fragment in IE 9
    1811                     elem.document && elem.document.nodeType !== 11 ) {
    1812                 return ret;
    1813             }
    1814         } catch(e) {}
    1815     }
    1816 
    1817     return Sizzle( expr, document, null, [elem] ).length > 0;
    1818 };
    1819 
    1820 Sizzle.contains = function( context, elem ) {
    1821     // Set document vars if needed
    1822     if ( ( context.ownerDocument || context ) !== document ) {
    1823         setDocument( context );
    1824     }
    1825     return contains( context, elem );
    1826 };
    1827 
    1828 Sizzle.attr = function( elem, name ) {
    1829     // Set document vars if needed
    1830     if ( ( elem.ownerDocument || elem ) !== document ) {
    1831         setDocument( elem );
    1832     }
    1833 
    1834     var fn = Expr.attrHandle[ name.toLowerCase() ],
    1835         // Don't get fooled by Object.prototype properties (jQuery #13807)
    1836         val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
    1837             fn( elem, name, !documentIsHTML ) :
    1838             undefined;
    1839 
    1840     return val === undefined ?
    1841         support.attributes || !documentIsHTML ?
    1842             elem.getAttribute( name ) :
    1843             (val = elem.getAttributeNode(name)) && val.specified ?
    1844                 val.value :
    1845                 null :
    1846         val;
    1847 };
    1848 
    1849 Sizzle.error = function( msg ) {
    1850     throw new Error( "Syntax error, unrecognized expression: " + msg );
    1851 };
    1852 
    1853 /**
    1854  * Document sorting and removing duplicates
    1855  * @param {ArrayLike} results
    1856  */
    1857 Sizzle.uniqueSort = function( results ) {
    1858     var elem,
    1859         duplicates = [],
    1860         j = 0,
    1861         i = 0;
    1862 
    1863     // Unless we *know* we can detect duplicates, assume their presence
    1864     hasDuplicate = !support.detectDuplicates;
    1865     sortInput = !support.sortStable && results.slice( 0 );
    1866     results.sort( sortOrder );
    1867 
    1868     if ( hasDuplicate ) {
    1869         while ( (elem = results[i++]) ) {
    1870             if ( elem === results[ i ] ) {
    1871                 j = duplicates.push( i );
    1872             }
    1873         }
    1874         while ( j-- ) {
    1875             results.splice( duplicates[ j ], 1 );
    1876         }
    1877     }
    1878 
    1879     return results;
    1880 };
    1881 
    1882 /**
    1883  * Utility function for retrieving the text value of an array of DOM nodes
    1884  * @param {Array|Element} elem
    1885  */
    1886 getText = Sizzle.getText = function( elem ) {
    1887     var node,
    1888         ret = "",
    1889         i = 0,
    1890         nodeType = elem.nodeType;
    1891 
    1892     if ( !nodeType ) {
    1893         // If no nodeType, this is expected to be an array
    1894         for ( ; (node = elem[i]); i++ ) {
    1895             // Do not traverse comment nodes
    1896             ret += getText( node );
    1897         }
    1898     } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
    1899         // Use textContent for elements
    1900         // innerText usage removed for consistency of new lines (see #11153)
    1901         if ( typeof elem.textContent === "string" ) {
    1902             return elem.textContent;
    1903         } else {
    1904             // Traverse its children
    1905             for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
    1906                 ret += getText( elem );
    1907             }
    1908         }
    1909     } else if ( nodeType === 3 || nodeType === 4 ) {
    1910         return elem.nodeValue;
    1911     }
    1912     // Do not include comment or processing instruction nodes
    1913 
    1914     return ret;
    1915 };
    1916 
    1917 Expr = Sizzle.selectors = {
    1918 
    1919     // Can be adjusted by the user
    1920     cacheLength: 50,
    1921 
    1922     createPseudo: markFunction,
    1923 
    1924     match: matchExpr,
    1925 
    1926     attrHandle: {},
    1927 
    1928     find: {},
    1929 
    1930     relative: {
    1931         ">": { dir: "parentNode", first: true },
    1932         " ": { dir: "parentNode" },
    1933         "+": { dir: "previousSibling", first: true },
    1934         "~": { dir: "previousSibling" }
    1935     },
    1936 
    1937     preFilter: {
    1938         "ATTR": function( match ) {
    1939             match[1] = match[1].replace( runescape, funescape );
    1940 
    1941             // Move the given value to match[3] whether quoted or unquoted
    1942             match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
    1943 
    1944             if ( match[2] === "~=" ) {
    1945                 match[3] = " " + match[3] + " ";
    1946             }
    1947 
    1948             return match.slice( 0, 4 );
    1949         },
    1950 
    1951         "CHILD": function( match ) {
    1952             /* matches from matchExpr["CHILD"]
    1953                 1 type (only|nth|...)
    1954                 2 what (child|of-type)
    1955                 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
    1956                 4 xn-component of xn+y argument ([+-]?\d*n|)
    1957                 5 sign of xn-component
    1958                 6 x of xn-component
    1959                 7 sign of y-component
    1960                 8 y of y-component
    1961             */
    1962             match[1] = match[1].toLowerCase();
    1963 
    1964             if ( match[1].slice( 0, 3 ) === "nth" ) {
    1965                 // nth-* requires argument
    1966                 if ( !match[3] ) {
    1967                     Sizzle.error( match[0] );
    1968                 }
    1969 
    1970                 // numeric x and y parameters for Expr.filter.CHILD
    1971                 // remember that false/true cast respectively to 0/1
    1972                 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
    1973                 match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
    1974 
    1975             // other types prohibit arguments
    1976             } else if ( match[3] ) {
    1977                 Sizzle.error( match[0] );
    1978             }
    1979 
    1980             return match;
    1981         },
    1982 
    1983         "PSEUDO": function( match ) {
    1984             var excess,
    1985                 unquoted = !match[5] && match[2];
    1986 
    1987             if ( matchExpr["CHILD"].test( match[0] ) ) {
    1988                 return null;
    1989             }
    1990 
    1991             // Accept quoted arguments as-is
    1992             if ( match[3] && match[4] !== undefined ) {
    1993                 match[2] = match[4];
    1994 
    1995             // Strip excess characters from unquoted arguments
    1996             } else if ( unquoted && rpseudo.test( unquoted ) &&
    1997                 // Get excess from tokenize (recursively)
    1998                 (excess = tokenize( unquoted, true )) &&
    1999                 // advance to the next closing parenthesis
    2000                 (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
    2001 
    2002                 // excess is a negative index
    2003                 match[0] = match[0].slice( 0, excess );
    2004                 match[2] = unquoted.slice( 0, excess );
    2005             }
    2006 
    2007             // Return only captures needed by the pseudo filter method (type and argument)
    2008             return match.slice( 0, 3 );
    2009         }
    2010     },
    2011 
    2012     filter: {
    2013 
    2014         "TAG": function( nodeNameSelector ) {
    2015             var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
    2016             return nodeNameSelector === "*" ?
    2017                 function() { return true; } :
    2018                 function( elem ) {
    2019                     return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
    2020                 };
    2021         },
    2022 
    2023         "CLASS": function( className ) {
    2024             var pattern = classCache[ className + " " ];
    2025 
    2026             return pattern ||
    2027                 (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
    2028                 classCache( className, function( elem ) {
    2029                     return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
    2030                 });
    2031         },
    2032 
    2033         "ATTR": function( name, operator, check ) {
    2034             return function( elem ) {
    2035                 var result = Sizzle.attr( elem, name );
    2036 
    2037                 if ( result == null ) {
    2038                     return operator === "!=";
    2039                 }
    2040                 if ( !operator ) {
    2041                     return true;
    2042                 }
    2043 
    2044                 result += "";
    2045 
    2046                 return operator === "=" ? result === check :
    2047                     operator === "!=" ? result !== check :
    2048                     operator === "^=" ? check && result.indexOf( check ) === 0 :
    2049                     operator === "*=" ? check && result.indexOf( check ) > -1 :
    2050                     operator === "$=" ? check && result.slice( -check.length ) === check :
    2051                     operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
    2052                     operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
    2053                     false;
    2054             };
    2055         },
    2056 
    2057         "CHILD": function( type, what, argument, first, last ) {
    2058             var simple = type.slice( 0, 3 ) !== "nth",
    2059                 forward = type.slice( -4 ) !== "last",
    2060                 ofType = what === "of-type";
    2061 
    2062             return first === 1 && last === 0 ?
    2063 
    2064                 // Shortcut for :nth-*(n)
    2065                 function( elem ) {
    2066                     return !!elem.parentNode;
    2067                 } :
    2068 
    2069                 function( elem, context, xml ) {
    2070                     var cache, outerCache, node, diff, nodeIndex, start,
    2071                         dir = simple !== forward ? "nextSibling" : "previousSibling",
    2072                         parent = elem.parentNode,
    2073                         name = ofType && elem.nodeName.toLowerCase(),
    2074                         useCache = !xml && !ofType;
    2075 
    2076                     if ( parent ) {
    2077 
    2078                         // :(first|last|only)-(child|of-type)
    2079                         if ( simple ) {
    2080                             while ( dir ) {
    2081                                 node = elem;
    2082                                 while ( (node = node[ dir ]) ) {
    2083                                     if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
    2084                                         return false;
    2085                                     }
    2086                                 }
    2087                                 // Reverse direction for :only-* (if we haven't yet done so)
    2088                                 start = dir = type === "only" && !start && "nextSibling";
    2089                             }
    2090                             return true;
    2091                         }
    2092 
    2093                         start = [ forward ? parent.firstChild : parent.lastChild ];
    2094 
    2095                         // non-xml :nth-child(...) stores cache data on `parent`
    2096                         if ( forward && useCache ) {
    2097                             // Seek `elem` from a previously-cached index
    2098                             outerCache = parent[ expando ] || (parent[ expando ] = {});
    2099                             cache = outerCache[ type ] || [];
    2100                             nodeIndex = cache[0] === dirruns && cache[1];
    2101                             diff = cache[0] === dirruns && cache[2];
    2102                             node = nodeIndex && parent.childNodes[ nodeIndex ];
    2103 
    2104                             while ( (node = ++nodeIndex && node && node[ dir ] ||
    2105 
    2106                                 // Fallback to seeking `elem` from the start
    2107                                 (diff = nodeIndex = 0) || start.pop()) ) {
    2108 
    2109                                 // When found, cache indexes on `parent` and break
    2110                                 if ( node.nodeType === 1 && ++diff && node === elem ) {
    2111                                     outerCache[ type ] = [ dirruns, nodeIndex, diff ];
    2112                                     break;
    2113                                 }
    2114                             }
    2115 
    2116                         // Use previously-cached element index if available
    2117                         } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
    2118                             diff = cache[1];
    2119 
    2120                         // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
    2121                         } else {
    2122                             // Use the same loop as above to seek `elem` from the start
    2123                             while ( (node = ++nodeIndex && node && node[ dir ] ||
    2124                                 (diff = nodeIndex = 0) || start.pop()) ) {
    2125 
    2126                                 if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
    2127                                     // Cache the index of each encountered element
    2128                                     if ( useCache ) {
    2129                                         (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
    2130                                     }
    2131 
    2132                                     if ( node === elem ) {
    2133                                         break;
    2134                                     }
    2135                                 }
    2136                             }
    2137                         }
    2138 
    2139                         // Incorporate the offset, then check against cycle size
    2140                         diff -= last;
    2141                         return diff === first || ( diff % first === 0 && diff / first >= 0 );
    2142                     }
    2143                 };
    2144         },
    2145 
    2146         "PSEUDO": function( pseudo, argument ) {
    2147             // pseudo-class names are case-insensitive
    2148             // http://www.w3.org/TR/selectors/#pseudo-classes
    2149             // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
    2150             // Remember that setFilters inherits from pseudos
    2151             var args,
    2152                 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
    2153                     Sizzle.error( "unsupported pseudo: " + pseudo );
    2154 
    2155             // The user may use createPseudo to indicate that
    2156             // arguments are needed to create the filter function
    2157             // just as Sizzle does
    2158             if ( fn[ expando ] ) {
    2159                 return fn( argument );
    2160             }
    2161 
    2162             // But maintain support for old signatures
    2163             if ( fn.length > 1 ) {
    2164                 args = [ pseudo, pseudo, "", argument ];
    2165                 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
    2166                     markFunction(function( seed, matches ) {
    2167                         var idx,
    2168                             matched = fn( seed, argument ),
    2169                             i = matched.length;
    2170                         while ( i-- ) {
    2171                             idx = indexOf.call( seed, matched[i] );
    2172                             seed[ idx ] = !( matches[ idx ] = matched[i] );
    2173                         }
    2174                     }) :
    2175                     function( elem ) {
    2176                         return fn( elem, 0, args );
    2177                     };
    2178             }
    2179 
    2180             return fn;
    2181         }
    2182     },
    2183 
    2184     pseudos: {
    2185         // Potentially complex pseudos
    2186         "not": markFunction(function( selector ) {
    2187             // Trim the selector passed to compile
    2188             // to avoid treating leading and trailing
    2189             // spaces as combinators
    2190             var input = [],
    2191                 results = [],
    2192                 matcher = compile( selector.replace( rtrim, "$1" ) );
    2193 
    2194             return matcher[ expando ] ?
    2195                 markFunction(function( seed, matches, context, xml ) {
    2196                     var elem,
    2197                         unmatched = matcher( seed, null, xml, [] ),
    2198                         i = seed.length;
    2199 
    2200                     // Match elements unmatched by `matcher`
    2201                     while ( i-- ) {
    2202                         if ( (elem = unmatched[i]) ) {
    2203                             seed[i] = !(matches[i] = elem);
    2204                         }
    2205                     }
    2206                 }) :
    2207                 function( elem, context, xml ) {
    2208                     input[0] = elem;
    2209                     matcher( input, null, xml, results );
    2210                     return !results.pop();
    2211                 };
    2212         }),
    2213 
    2214         "has": markFunction(function( selector ) {
    2215             return function( elem ) {
    2216                 return Sizzle( selector, elem ).length > 0;
    2217             };
    2218         }),
    2219 
    2220         "contains": markFunction(function( text ) {
    2221             return function( elem ) {
    2222                 return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
    2223             };
    2224         }),
    2225 
    2226         // "Whether an element is represented by a :lang() selector
    2227         // is based solely on the element's language value
    2228         // being equal to the identifier C,
    2229         // or beginning with the identifier C immediately followed by "-".
    2230         // The matching of C against the element's language value is performed case-insensitively.
    2231         // The identifier C does not have to be a valid language name."
    2232         // http://www.w3.org/TR/selectors/#lang-pseudo
    2233         "lang": markFunction( function( lang ) {
    2234             // lang value must be a valid identifier
    2235             if ( !ridentifier.test(lang || "") ) {
    2236                 Sizzle.error( "unsupported lang: " + lang );
    2237             }
    2238             lang = lang.replace( runescape, funescape ).toLowerCase();
    2239             return function( elem ) {
    2240                 var elemLang;
    2241                 do {
    2242                     if ( (elemLang = documentIsHTML ?
    2243                         elem.lang :
    2244                         elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
    2245 
    2246                         elemLang = elemLang.toLowerCase();
    2247                         return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
    2248                     }
    2249                 } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
    2250                 return false;
    2251             };
    2252         }),
    2253 
    2254         // Miscellaneous
    2255         "target": function( elem ) {
    2256             var hash = window.location && window.location.hash;
    2257             return hash && hash.slice( 1 ) === elem.id;
    2258         },
    2259 
    2260         "root": function( elem ) {
    2261             return elem === docElem;
    2262         },
    2263 
    2264         "focus": function( elem ) {
    2265             return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
    2266         },
    2267 
    2268         // Boolean properties
    2269         "enabled": function( elem ) {
    2270             return elem.disabled === false;
    2271         },
    2272 
    2273         "disabled": function( elem ) {
    2274             return elem.disabled === true;
    2275         },
    2276 
    2277         "checked": function( elem ) {
    2278             // In CSS3, :checked should return both checked and selected elements
    2279             // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
    2280             var nodeName = elem.nodeName.toLowerCase();
    2281             return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
    2282         },
    2283 
    2284         "selected": function( elem ) {
    2285             // Accessing this property makes selected-by-default
    2286             // options in Safari work properly
    2287             if ( elem.parentNode ) {
    2288                 elem.parentNode.selectedIndex;
    2289             }
    2290 
    2291             return elem.selected === true;
    2292         },
    2293 
    2294         // Contents
    2295         "empty": function( elem ) {
    2296             // http://www.w3.org/TR/selectors/#empty-pseudo
    2297             // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
    2298             //   not comment, processing instructions, or others
    2299             // Thanks to Diego Perini for the nodeName shortcut
    2300             //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
    2301             for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
    2302                 if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
    2303                     return false;
    2304                 }
    2305             }
    2306             return true;
    2307         },
    2308 
    2309         "parent": function( elem ) {
    2310             return !Expr.pseudos["empty"]( elem );
    2311         },
    2312 
    2313         // Element/input types
    2314         "header": function( elem ) {
    2315             return rheader.test( elem.nodeName );
    2316         },
    2317 
    2318         "input": function( elem ) {
    2319             return rinputs.test( elem.nodeName );
    2320         },
    2321 
    2322         "button": function( elem ) {
    2323             var name = elem.nodeName.toLowerCase();
    2324             return name === "input" && elem.type === "button" || name === "button";
    2325         },
    2326 
    2327         "text": function( elem ) {
    2328             var attr;
    2329             // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
    2330             // use getAttribute instead to test this case
    2331             return elem.nodeName.toLowerCase() === "input" &&
    2332                 elem.type === "text" &&
    2333                 ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
    2334         },
    2335 
    2336         // Position-in-collection
    2337         "first": createPositionalPseudo(function() {
    2338             return [ 0 ];
    2339         }),
    2340 
    2341         "last": createPositionalPseudo(function( matchIndexes, length ) {
    2342             return [ length - 1 ];
    2343         }),
    2344 
    2345         "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
    2346             return [ argument < 0 ? argument + length : argument ];
    2347         }),
    2348 
    2349         "even": createPositionalPseudo(function( matchIndexes, length ) {
    2350             var i = 0;
    2351             for ( ; i < length; i += 2 ) {
    2352                 matchIndexes.push( i );
    2353             }
    2354             return matchIndexes;
    2355         }),
    2356 
    2357         "odd": createPositionalPseudo(function( matchIndexes, length ) {
    2358             var i = 1;
    2359             for ( ; i < length; i += 2 ) {
    2360                 matchIndexes.push( i );
    2361             }
    2362             return matchIndexes;
    2363         }),
    2364 
    2365         "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
    2366             var i = argument < 0 ? argument + length : argument;
    2367             for ( ; --i >= 0; ) {
    2368                 matchIndexes.push( i );
    2369             }
    2370             return matchIndexes;
    2371         }),
    2372 
    2373         "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
    2374             var i = argument < 0 ? argument + length : argument;
    2375             for ( ; ++i < length; ) {
    2376                 matchIndexes.push( i );
    2377             }
    2378             return matchIndexes;
    2379         })
    2380     }
    2381 };
    2382 
    2383 Expr.pseudos["nth"] = Expr.pseudos["eq"];
    2384 
    2385 // Add button/input type pseudos
    2386 for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
    2387     Expr.pseudos[ i ] = createInputPseudo( i );
    2388 }
    2389 for ( i in { submit: true, reset: true } ) {
    2390     Expr.pseudos[ i ] = createButtonPseudo( i );
    2391 }
    2392 
    2393 // Easy API for creating new setFilters
    2394 function setFilters() {}
    2395 setFilters.prototype = Expr.filters = Expr.pseudos;
    2396 Expr.setFilters = new setFilters();
    2397 
    2398 function tokenize( selector, parseOnly ) {
    2399     var matched, match, tokens, type,
    2400         soFar, groups, preFilters,
    2401         cached = tokenCache[ selector + " " ];
    2402 
    2403     if ( cached ) {
    2404         return parseOnly ? 0 : cached.slice( 0 );
    2405     }
    2406 
    2407     soFar = selector;
    2408     groups = [];
    2409     preFilters = Expr.preFilter;
    2410 
    2411     while ( soFar ) {
    2412 
    2413         // Comma and first run
    2414         if ( !matched || (match = rcomma.exec( soFar )) ) {
    2415             if ( match ) {
    2416                 // Don't consume trailing commas as valid
    2417                 soFar = soFar.slice( match[0].length ) || soFar;
    2418             }
    2419             groups.push( tokens = [] );
    2420         }
    2421 
    2422         matched = false;
    2423 
    2424         // Combinators
    2425         if ( (match = rcombinators.exec( soFar )) ) {
    2426             matched = match.shift();
    2427             tokens.push({
    2428                 value: matched,
    2429                 // Cast descendant combinators to space
    2430                 type: match[0].replace( rtrim, " " )
    2431             });
    2432             soFar = soFar.slice( matched.length );
    2433         }
    2434 
    2435         // Filters
    2436         for ( type in Expr.filter ) {
    2437             if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
    2438                 (match = preFilters[ type ]( match ))) ) {
    2439                 matched = match.shift();
    2440                 tokens.push({
    2441                     value: matched,
    2442                     type: type,
    2443                     matches: match
    2444                 });
    2445                 soFar = soFar.slice( matched.length );
    2446             }
    2447         }
    2448 
    2449         if ( !matched ) {
    2450             break;
    2451         }
    2452     }
    2453 
    2454     // Return the length of the invalid excess
    2455     // if we're just parsing
    2456     // Otherwise, throw an error or return tokens
    2457     return parseOnly ?
    2458         soFar.length :
    2459         soFar ?
    2460             Sizzle.error( selector ) :
    2461             // Cache the tokens
    2462             tokenCache( selector, groups ).slice( 0 );
    2463 }
    2464 
    2465 function toSelector( tokens ) {
    2466     var i = 0,
    2467         len = tokens.length,
    2468         selector = "";
    2469     for ( ; i < len; i++ ) {
    2470         selector += tokens[i].value;
    2471     }
    2472     return selector;
    2473 }
    2474 
    2475 function addCombinator( matcher, combinator, base ) {
    2476     var dir = combinator.dir,
    2477         checkNonElements = base && dir === "parentNode",
    2478         doneName = done++;
    2479 
    2480     return combinator.first ?
    2481         // Check against closest ancestor/preceding element
    2482         function( elem, context, xml ) {
    2483             while ( (elem = elem[ dir ]) ) {
    2484                 if ( elem.nodeType === 1 || checkNonElements ) {
    2485                     return matcher( elem, context, xml );
    2486                 }
    2487             }
    2488         } :
    2489 
    2490         // Check against all ancestor/preceding elements
    2491         function( elem, context, xml ) {
    2492             var data, cache, outerCache,
    2493                 dirkey = dirruns + " " + doneName;
    2494 
    2495             // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
    2496             if ( xml ) {
    2497                 while ( (elem = elem[ dir ]) ) {
    2498                     if ( elem.nodeType === 1 || checkNonElements ) {
    2499                         if ( matcher( elem, context, xml ) ) {
    2500                             return true;
    2501                         }
    2502                     }
    2503                 }
    2504             } else {
    2505                 while ( (elem = elem[ dir ]) ) {
    2506                     if ( elem.nodeType === 1 || checkNonElements ) {
    2507                         outerCache = elem[ expando ] || (elem[ expando ] = {});
    2508                         if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
    2509                             if ( (data = cache[1]) === true || data === cachedruns ) {
    2510                                 return data === true;
    2511                             }
    2512                         } else {
    2513                             cache = outerCache[ dir ] = [ dirkey ];
    2514                             cache[1] = matcher( elem, context, xml ) || cachedruns;
    2515                             if ( cache[1] === true ) {
    2516                                 return true;
    2517                             }
    2518                         }
    2519                     }
    2520                 }
    2521             }
    2522         };
    2523 }
    2524 
    2525 function elementMatcher( matchers ) {
    2526     return matchers.length > 1 ?
    2527         function( elem, context, xml ) {
    2528             var i = matchers.length;
    2529             while ( i-- ) {
    2530                 if ( !matchers[i]( elem, context, xml ) ) {
    2531                     return false;
    2532                 }
    2533             }
    2534             return true;
    2535         } :
    2536         matchers[0];
    2537 }
    2538 
    2539 function condense( unmatched, map, filter, context, xml ) {
    2540     var elem,
    2541         newUnmatched = [],
    2542         i = 0,
    2543         len = unmatched.length,
    2544         mapped = map != null;
    2545 
    2546     for ( ; i < len; i++ ) {
    2547         if ( (elem = unmatched[i]) ) {
    2548             if ( !filter || filter( elem, context, xml ) ) {
    2549                 newUnmatched.push( elem );
    2550                 if ( mapped ) {
    2551                     map.push( i );
    2552                 }
    2553             }
    2554         }
    2555     }
    2556 
    2557     return newUnmatched;
    2558 }
    2559 
    2560 function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
    2561     if ( postFilter && !postFilter[ expando ] ) {
    2562         postFilter = setMatcher( postFilter );
    2563     }
    2564     if ( postFinder && !postFinder[ expando ] ) {
    2565         postFinder = setMatcher( postFinder, postSelector );
    2566     }
    2567     return markFunction(function( seed, results, context, xml ) {
    2568         var temp, i, elem,
    2569             preMap = [],
    2570             postMap = [],
    2571             preexisting = results.length,
    2572 
    2573             // Get initial elements from seed or context
    2574             elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
    2575 
    2576             // Prefilter to get matcher input, preserving a map for seed-results synchronization
    2577             matcherIn = preFilter && ( seed || !selector ) ?
    2578                 condense( elems, preMap, preFilter, context, xml ) :
    2579                 elems,
    2580 
    2581             matcherOut = matcher ?
    2582                 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
    2583                 postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
    2584 
    2585                     // ...intermediate processing is necessary
    2586                     [] :
    2587 
    2588                     // ...otherwise use results directly
    2589                     results :
    2590                 matcherIn;
    2591 
    2592         // Find primary matches
    2593         if ( matcher ) {
    2594             matcher( matcherIn, matcherOut, context, xml );
    2595         }
    2596 
    2597         // Apply postFilter
    2598         if ( postFilter ) {
    2599             temp = condense( matcherOut, postMap );
    2600             postFilter( temp, [], context, xml );
    2601 
    2602             // Un-match failing elements by moving them back to matcherIn
    2603             i = temp.length;
    2604             while ( i-- ) {
    2605                 if ( (elem = temp[i]) ) {
    2606                     matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
    2607                 }
    2608             }
    2609         }
    2610 
    2611         if ( seed ) {
    2612             if ( postFinder || preFilter ) {
    2613                 if ( postFinder ) {
    2614                     // Get the final matcherOut by condensing this intermediate into postFinder contexts
    2615                     temp = [];
    2616                     i = matcherOut.length;
    2617                     while ( i-- ) {
    2618                         if ( (elem = matcherOut[i]) ) {
    2619                             // Restore matcherIn since elem is not yet a final match
    2620                             temp.push( (matcherIn[i] = elem) );
    2621                         }
    2622                     }
    2623                     postFinder( null, (matcherOut = []), temp, xml );
    2624                 }
    2625 
    2626                 // Move matched elements from seed to results to keep them synchronized
    2627                 i = matcherOut.length;
    2628                 while ( i-- ) {
    2629                     if ( (elem = matcherOut[i]) &&
    2630                         (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
    2631 
    2632                         seed[temp] = !(results[temp] = elem);
    2633                     }
    2634                 }
    2635             }
    2636 
    2637         // Add elements to results, through postFinder if defined
    2638         } else {
    2639             matcherOut = condense(
    2640                 matcherOut === results ?
    2641                     matcherOut.splice( preexisting, matcherOut.length ) :
    2642                     matcherOut
    2643             );
    2644             if ( postFinder ) {
    2645                 postFinder( null, results, matcherOut, xml );
    2646             } else {
    2647                 push.apply( results, matcherOut );
    2648             }
    2649         }
    2650     });
    2651 }
    2652 
    2653 function matcherFromTokens( tokens ) {
    2654     var checkContext, matcher, j,
    2655         len = tokens.length,
    2656         leadingRelative = Expr.relative[ tokens[0].type ],
    2657         implicitRelative = leadingRelative || Expr.relative[" "],
    2658         i = leadingRelative ? 1 : 0,
    2659 
    2660         // The foundational matcher ensures that elements are reachable from top-level context(s)
    2661         matchContext = addCombinator( function( elem ) {
    2662             return elem === checkContext;
    2663         }, implicitRelative, true ),
    2664         matchAnyContext = addCombinator( function( elem ) {
    2665             return indexOf.call( checkContext, elem ) > -1;
    2666         }, implicitRelative, true ),
    2667         matchers = [ function( elem, context, xml ) {
    2668             return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
    2669                 (checkContext = context).nodeType ?
    2670                     matchContext( elem, context, xml ) :
    2671                     matchAnyContext( elem, context, xml ) );
    2672         } ];
    2673 
    2674     for ( ; i < len; i++ ) {
    2675         if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
    2676             matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
    2677         } else {
    2678             matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
    2679 
    2680             // Return special upon seeing a positional matcher
    2681             if ( matcher[ expando ] ) {
    2682                 // Find the next relative operator (if any) for proper handling
    2683                 j = ++i;
    2684                 for ( ; j < len; j++ ) {
    2685                     if ( Expr.relative[ tokens[j].type ] ) {
    2686                         break;
    2687                     }
    2688                 }
    2689                 return setMatcher(
    2690                     i > 1 && elementMatcher( matchers ),
    2691                     i > 1 && toSelector(
    2692                         // If the preceding token was a descendant combinator, insert an implicit any-element `*`
    2693                         tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
    2694                     ).replace( rtrim, "$1" ),
    2695                     matcher,
    2696                     i < j && matcherFromTokens( tokens.slice( i, j ) ),
    2697                     j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
    2698                     j < len && toSelector( tokens )
    2699                 );
    2700             }
    2701             matchers.push( matcher );
    2702         }
    2703     }
    2704 
    2705     return elementMatcher( matchers );
    2706 }
    2707 
    2708 function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
    2709     // A counter to specify which element is currently being matched
    2710     var matcherCachedRuns = 0,
    2711         bySet = setMatchers.length > 0,
    2712         byElement = elementMatchers.length > 0,
    2713         superMatcher = function( seed, context, xml, results, expandContext ) {
    2714             var elem, j, matcher,
    2715                 setMatched = [],
    2716                 matchedCount = 0,
    2717                 i = "0",
    2718                 unmatched = seed && [],
    2719                 outermost = expandContext != null,
    2720                 contextBackup = outermostContext,
    2721                 // We must always have either seed elements or context
    2722                 elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
    2723                 // Use integer dirruns iff this is the outermost matcher
    2724                 dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
    2725 
    2726             if ( outermost ) {
    2727                 outermostContext = context !== document && context;
    2728                 cachedruns = matcherCachedRuns;
    2729             }
    2730 
    2731             // Add elements passing elementMatchers directly to results
    2732             // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
    2733             for ( ; (elem = elems[i]) != null; i++ ) {
    2734                 if ( byElement && elem ) {
    2735                     j = 0;
    2736                     while ( (matcher = elementMatchers[j++]) ) {
    2737                         if ( matcher( elem, context, xml ) ) {
    2738                             results.push( elem );
    2739                             break;
    2740                         }
    2741                     }
    2742                     if ( outermost ) {
    2743                         dirruns = dirrunsUnique;
    2744                         cachedruns = ++matcherCachedRuns;
    2745                     }
    2746                 }
    2747 
    2748                 // Track unmatched elements for set filters
    2749                 if ( bySet ) {
    2750                     // They will have gone through all possible matchers
    2751                     if ( (elem = !matcher && elem) ) {
    2752                         matchedCount--;
    2753                     }
    2754 
    2755                     // Lengthen the array for every element, matched or not
    2756                     if ( seed ) {
    2757                         unmatched.push( elem );
    2758                     }
    2759                 }
    2760             }
    2761 
    2762             // Apply set filters to unmatched elements
    2763             matchedCount += i;
    2764             if ( bySet && i !== matchedCount ) {
    2765                 j = 0;
    2766                 while ( (matcher = setMatchers[j++]) ) {
    2767                     matcher( unmatched, setMatched, context, xml );
    2768                 }
    2769 
    2770                 if ( seed ) {
    2771                     // Reintegrate element matches to eliminate the need for sorting
    2772                     if ( matchedCount > 0 ) {
    2773                         while ( i-- ) {
    2774                             if ( !(unmatched[i] || setMatched[i]) ) {
    2775                                 setMatched[i] = pop.call( results );
    2776                             }
    2777                         }
    2778                     }
    2779 
    2780                     // Discard index placeholder values to get only actual matches
    2781                     setMatched = condense( setMatched );
    2782                 }
    2783 
    2784                 // Add matches to results
    2785                 push.apply( results, setMatched );
    2786 
    2787                 // Seedless set matches succeeding multiple successful matchers stipulate sorting
    2788                 if ( outermost && !seed && setMatched.length > 0 &&
    2789                     ( matchedCount + setMatchers.length ) > 1 ) {
    2790 
    2791                     Sizzle.uniqueSort( results );
    2792                 }
    2793             }
    2794 
    2795             // Override manipulation of globals by nested matchers
    2796             if ( outermost ) {
    2797                 dirruns = dirrunsUnique;
    2798                 outermostContext = contextBackup;
    2799             }
    2800 
    2801             return unmatched;
    2802         };
    2803 
    2804     return bySet ?
    2805         markFunction( superMatcher ) :
    2806         superMatcher;
    2807 }
    2808 
    2809 compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
    2810     var i,
    2811         setMatchers = [],
    2812         elementMatchers = [],
    2813         cached = compilerCache[ selector + " " ];
    2814 
    2815     if ( !cached ) {
    2816         // Generate a function of recursive functions that can be used to check each element
    2817         if ( !group ) {
    2818             group = tokenize( selector );
    2819         }
    2820         i = group.length;
    2821         while ( i-- ) {
    2822             cached = matcherFromTokens( group[i] );
    2823             if ( cached[ expando ] ) {
    2824                 setMatchers.push( cached );
    2825             } else {
    2826                 elementMatchers.push( cached );
    2827             }
    2828         }
    2829 
    2830         // Cache the compiled function
    2831         cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
    2832     }
    2833     return cached;
    2834 };
    2835 
    2836 function multipleContexts( selector, contexts, results ) {
    2837     var i = 0,
    2838         len = contexts.length;
    2839     for ( ; i < len; i++ ) {
    2840         Sizzle( selector, contexts[i], results );
    2841     }
    2842     return results;
    2843 }
    2844 
    2845 function select( selector, context, results, seed ) {
    2846     var i, tokens, token, type, find,
    2847         match = tokenize( selector );
    2848 
    2849     if ( !seed ) {
    2850         // Try to minimize operations if there is only one group
    2851         if ( match.length === 1 ) {
    2852 
    2853             // Take a shortcut and set the context if the root selector is an ID
    2854             tokens = match[0] = match[0].slice( 0 );
    2855             if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
    2856                     support.getById && context.nodeType === 9 && documentIsHTML &&
    2857                     Expr.relative[ tokens[1].type ] ) {
    2858 
    2859                 context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
    2860                 if ( !context ) {
    2861                     return results;
    2862                 }
    2863                 selector = selector.slice( tokens.shift().value.length );
    2864             }
    2865 
    2866             // Fetch a seed set for right-to-left matching
    2867             i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
    2868             while ( i-- ) {
    2869                 token = tokens[i];
    2870 
    2871                 // Abort if we hit a combinator
    2872                 if ( Expr.relative[ (type = token.type) ] ) {
    2873                     break;
    2874                 }
    2875                 if ( (find = Expr.find[ type ]) ) {
    2876                     // Search, expanding context for leading sibling combinators
    2877                     if ( (seed = find(
    2878                         token.matches[0].replace( runescape, funescape ),
    2879                         rsibling.test( tokens[0].type ) && context.parentNode || context
    2880                     )) ) {
    2881 
    2882                         // If seed is empty or no tokens remain, we can return early
    2883                         tokens.splice( i, 1 );
    2884                         selector = seed.length && toSelector( tokens );
    2885                         if ( !selector ) {
    2886                             push.apply( results, seed );
    2887                             return results;
    2888                         }
    2889 
    2890                         break;
    2891                     }
    2892                 }
    2893             }
    2894         }
    2895     }
    2896 
    2897     // Compile and execute a filtering function
    2898     // Provide `match` to avoid retokenization if we modified the selector above
    2899     compile( selector, match )(
    2900         seed,
    2901         context,
    2902         !documentIsHTML,
    2903         results,
    2904         rsibling.test( selector )
    2905     );
    2906     return results;
    2907 }
    2908 
    2909 // One-time assignments
    2910 
    2911 // Sort stability
    2912 support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
    2913 
    2914 // Support: Chrome<14
    2915 // Always assume duplicates if they aren't passed to the comparison function
    2916 support.detectDuplicates = hasDuplicate;
    2917 
    2918 // Initialize against the default document
    2919 setDocument();
    2920 
    2921 // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
    2922 // Detached nodes confoundingly follow *each other*
    2923 support.sortDetached = assert(function( div1 ) {
    2924     // Should return 1, but returns 4 (following)
    2925     return div1.compareDocumentPosition( document.createElement("div") ) & 1;
    2926 });
    2927 
    2928 // Support: IE<8
    2929 // Prevent attribute/property "interpolation"
    2930 // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
    2931 if ( !assert(function( div ) {
    2932     div.innerHTML = "<a href='#'></a>";
    2933     return div.firstChild.getAttribute("href") === "#" ;
    2934 }) ) {
    2935     addHandle( "type|href|height|width", function( elem, name, isXML ) {
    2936         if ( !isXML ) {
    2937             return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
    2938         }
    2939     });
    2940 }
    2941 
    2942 // Support: IE<9
    2943 // Use defaultValue in place of getAttribute("value")
    2944 if ( !support.attributes || !assert(function( div ) {
    2945     div.innerHTML = "<input/>";
    2946     div.firstChild.setAttribute( "value", "" );
    2947     return div.firstChild.getAttribute( "value" ) === "";
    2948 }) ) {
    2949     addHandle( "value", function( elem, name, isXML ) {
    2950         if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
    2951             return elem.defaultValue;
    2952         }
    2953     });
    2954 }
    2955 
    2956 // Support: IE<9
    2957 // Use getAttributeNode to fetch booleans when getAttribute lies
    2958 if ( !assert(function( div ) {
    2959     return div.getAttribute("disabled") == null;
    2960 }) ) {
    2961     addHandle( booleans, function( elem, name, isXML ) {
    2962         var val;
    2963         if ( !isXML ) {
    2964             return (val = elem.getAttributeNode( name )) && val.specified ?
    2965                 val.value :
    2966                 elem[ name ] === true ? name.toLowerCase() : null;
    2967         }
    2968     });
    2969 }
    2970 
    2971 jQuery.find = Sizzle;
    2972 jQuery.expr = Sizzle.selectors;
    2973 jQuery.expr[":"] = jQuery.expr.pseudos;
    2974 jQuery.unique = Sizzle.uniqueSort;
    2975 jQuery.text = Sizzle.getText;
    2976 jQuery.isXMLDoc = Sizzle.isXML;
    2977 jQuery.contains = Sizzle.contains;
    2978 
    2979 
    2980 })( window );
    2981 // String to Object options format cache
    2982 var optionsCache = {};
    2983 
    2984 // Convert String-formatted options into Object-formatted ones and store in cache
    2985 function createOptions( options ) {
    2986     var object = optionsCache[ options ] = {};
    2987     jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
    2988         object[ flag ] = true;
    2989     });
    2990     return object;
    2991 }
    2992 
    2993 /*
    2994  * Create a callback list using the following parameters:
    2995  *
    2996  *  options: an optional list of space-separated options that will change how
    2997  *          the callback list behaves or a more traditional option object
    2998  *
    2999  * By default a callback list will act like an event callback list and can be
    3000  * "fired" multiple times.
    3001  *
    3002  * Possible options:
    3003  *
    3004  *  once:           will ensure the callback list can only be fired once (like a Deferred)
    3005  *
    3006  *  memory:         will keep track of previous values and will call any callback added
    3007  *                  after the list has been fired right away with the latest "memorized"
    3008  *                  values (like a Deferred)
    3009  *
    3010  *  unique:         will ensure a callback can only be added once (no duplicate in the list)
    3011  *
    3012  *  stopOnFalse:    interrupt callings when a callback returns false
    3013  *
    3014  */
    3015 jQuery.Callbacks = function( options ) {
    3016 
    3017     // Convert options from String-formatted to Object-formatted if needed
    3018     // (we check in cache first)
    3019     options = typeof options === "string" ?
    3020         ( optionsCache[ options ] || createOptions( options ) ) :
    3021         jQuery.extend( {}, options );
    3022 
    3023     var // Flag to know if list is currently firing
    3024         firing,
    3025         // Last fire value (for non-forgettable lists)
    3026         memory,
    3027         // Flag to know if list was already fired
    3028         fired,
    3029         // End of the loop when firing
    3030         firingLength,
    3031         // Index of currently firing callback (modified by remove if needed)
    3032         firingIndex,
    3033         // First callback to fire (used internally by add and fireWith)
    3034         firingStart,
    3035         // Actual callback list
    3036         list = [],
    3037         // Stack of fire calls for repeatable lists
    3038         stack = !options.once && [],
    3039         // Fire callbacks
    3040         fire = function( data ) {
    3041             memory = options.memory && data;
    3042             fired = true;
    3043             firingIndex = firingStart || 0;
    3044             firingStart = 0;
    3045             firingLength = list.length;
    3046             firing = true;
    3047             for ( ; list && firingIndex < firingLength; firingIndex++ ) {
    3048                 if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
    3049                     memory = false; // To prevent further calls using add
    3050                     break;
    3051                 }
    3052             }
    3053             firing = false;
    3054             if ( list ) {
    3055                 if ( stack ) {
    3056                     if ( stack.length ) {
    3057                         fire( stack.shift() );
    3058                     }
    3059                 } else if ( memory ) {
    3060                     list = [];
    3061                 } else {
    3062                     self.disable();
    3063                 }
    3064             }
    3065         },
    3066         // Actual Callbacks object
    3067         self = {
    3068             // Add a callback or a collection of callbacks to the list
    3069             add: function() {
    3070                 if ( list ) {
    3071                     // First, we save the current length
    3072                     var start = list.length;
    3073                     (function add( args ) {
    3074                         jQuery.each( args, function( _, arg ) {
    3075                             var type = jQuery.type( arg );
    3076                             if ( type === "function" ) {
    3077                                 if ( !options.unique || !self.has( arg ) ) {
    3078                                     list.push( arg );
    3079                                 }
    3080                             } else if ( arg && arg.length && type !== "string" ) {
    3081                                 // Inspect recursively
    3082                                 add( arg );
    3083                             }
    3084                         });
    3085                     })( arguments );
    3086                     // Do we need to add the callbacks to the
    3087                     // current firing batch?
    3088                     if ( firing ) {
    3089                         firingLength = list.length;
    3090                     // With memory, if we're not firing then
    3091                     // we should call right away
    3092                     } else if ( memory ) {
    3093                         firingStart = start;
    3094                         fire( memory );
    3095                     }
    3096                 }
    3097                 return this;
    3098             },
    3099             // Remove a callback from the list
    3100             remove: function() {
    3101                 if ( list ) {
    3102                     jQuery.each( arguments, function( _, arg ) {
    3103                         var index;
    3104                         while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
    3105                             list.splice( index, 1 );
    3106                             // Handle firing indexes
    3107                             if ( firing ) {
    3108                                 if ( index <= firingLength ) {
    3109                                     firingLength--;
    3110                                 }
    3111                                 if ( index <= firingIndex ) {
    3112                                     firingIndex--;
    3113                                 }
    3114                             }
    3115                         }
    3116                     });
    3117                 }
    3118                 return this;
    3119             },
    3120             // Check if a given callback is in the list.
    3121             // If no argument is given, return whether or not list has callbacks attached.
    3122             has: function( fn ) {
    3123                 return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
    3124             },
    3125             // Remove all callbacks from the list
    3126             empty: function() {
    3127                 list = [];
    3128                 firingLength = 0;
    3129                 return this;
    3130             },
    3131             // Have the list do nothing anymore
    3132             disable: function() {
    3133                 list = stack = memory = undefined;
    3134                 return this;
    3135             },
    3136             // Is it disabled?
    3137             disabled: function() {
    3138                 return !list;
    3139             },
    3140             // Lock the list in its current state
    3141             lock: function() {
    3142                 stack = undefined;
    3143                 if ( !memory ) {
    3144                     self.disable();
    3145                 }
    3146                 return this;
    3147             },
    3148             // Is it locked?
    3149             locked: function() {
    3150                 return !stack;
    3151             },
    3152             // Call all callbacks with the given context and arguments
    3153             fireWith: function( context, args ) {
    3154                 if ( list && ( !fired || stack ) ) {
    3155                     args = args || [];
    3156                     args = [ context, args.slice ? args.slice() : args ];
    3157                     if ( firing ) {
    3158                         stack.push( args );
    3159                     } else {
    3160                         fire( args );
    3161                     }
    3162                 }
    3163                 return this;
    3164             },
    3165             // Call all the callbacks with the given arguments
    3166             fire: function() {
    3167                 self.fireWith( this, arguments );
    3168                 return this;
    3169             },
    3170             // To know if the callbacks have already been called at least once
    3171             fired: function() {
    3172                 return !!fired;
    3173             }
    3174         };
    3175 
    3176     return self;
    3177 };
    3178 jQuery.extend({
    3179 
    3180     Deferred: function( func ) {
    3181         var tuples = [
    3182                 // action, add listener, listener list, final state
    3183                 [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
    3184                 [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
    3185                 [ "notify", "progress", jQuery.Callbacks("memory") ]
    3186             ],
    3187             state = "pending",
    3188             promise = {
    3189                 state: function() {
    3190                     return state;
    3191                 },
    3192                 always: function() {
    3193                     deferred.done( arguments ).fail( arguments );
    3194                     return this;
    3195                 },
    3196                 then: function( /* fnDone, fnFail, fnProgress */ ) {
    3197                     var fns = arguments;
    3198                     return jQuery.Deferred(function( newDefer ) {
    3199                         jQuery.each( tuples, function( i, tuple ) {
    3200                             var action = tuple[ 0 ],
    3201                                 fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
    3202                             // deferred[ done | fail | progress ] for forwarding actions to newDefer
    3203                             deferred[ tuple[1] ](function() {
    3204                                 var returned = fn && fn.apply( this, arguments );
    3205                                 if ( returned && jQuery.isFunction( returned.promise ) ) {
    3206                                     returned.promise()
    3207                                         .done( newDefer.resolve )
    3208                                         .fail( newDefer.reject )
    3209                                         .progress( newDefer.notify );
    3210                                 } else {
    3211                                     newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
    3212                                 }
    3213                             });
    3214                         });
    3215                         fns = null;
    3216                     }).promise();
    3217                 },
    3218                 // Get a promise for this deferred
    3219                 // If obj is provided, the promise aspect is added to the object
    3220                 promise: function( obj ) {
    3221                     return obj != null ? jQuery.extend( obj, promise ) : promise;
    3222                 }
    3223             },
    3224             deferred = {};
    3225 
    3226         // Keep pipe for back-compat
    3227         promise.pipe = promise.then;
    3228 
    3229         // Add list-specific methods
    3230         jQuery.each( tuples, function( i, tuple ) {
    3231             var list = tuple[ 2 ],
    3232                 stateString = tuple[ 3 ];
    3233 
    3234             // promise[ done | fail | progress ] = list.add
    3235             promise[ tuple[1] ] = list.add;
    3236 
    3237             // Handle state
    3238             if ( stateString ) {
    3239                 list.add(function() {
    3240                     // state = [ resolved | rejected ]
    3241                     state = stateString;
    3242 
    3243                 // [ reject_list | resolve_list ].disable; progress_list.lock
    3244                 }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
    3245             }
    3246 
    3247             // deferred[ resolve | reject | notify ]
    3248             deferred[ tuple[0] ] = function() {
    3249                 deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
    3250                 return this;
    3251             };
    3252             deferred[ tuple[0] + "With" ] = list.fireWith;
    3253         });
    3254 
    3255         // Make the deferred a promise
    3256         promise.promise( deferred );
    3257 
    3258         // Call given func if any
    3259         if ( func ) {
    3260             func.call( deferred, deferred );
    3261         }
    3262 
    3263         // All done!
    3264         return deferred;
    3265     },
    3266 
    3267     // Deferred helper
    3268     when: function( subordinate /* , ..., subordinateN */ ) {
    3269         var i = 0,
    3270             resolveValues = core_slice.call( arguments ),
    3271             length = resolveValues.length,
    3272 
    3273             // the count of uncompleted subordinates
    3274             remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
    3275 
    3276             // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
    3277             deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
    3278 
    3279             // Update function for both resolve and progress values
    3280             updateFunc = function( i, contexts, values ) {
    3281                 return function( value ) {
    3282                     contexts[ i ] = this;
    3283                     values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
    3284                     if( values === progressValues ) {
    3285                         deferred.notifyWith( contexts, values );
    3286                     } else if ( !( --remaining ) ) {
    3287                         deferred.resolveWith( contexts, values );
    3288                     }
    3289                 };
    3290             },
    3291 
    3292             progressValues, progressContexts, resolveContexts;
    3293 
    3294         // add listeners to Deferred subordinates; treat others as resolved
    3295         if ( length > 1 ) {
    3296             progressValues = new Array( length );
    3297             progressContexts = new Array( length );
    3298             resolveContexts = new Array( length );
    3299             for ( ; i < length; i++ ) {
    3300                 if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
    3301                     resolveValues[ i ].promise()
    3302                         .done( updateFunc( i, resolveContexts, resolveValues ) )
    3303                         .fail( deferred.reject )
    3304                         .progress( updateFunc( i, progressContexts, progressValues ) );
    3305                 } else {
    3306                     --remaining;
    3307                 }
    3308             }
    3309         }
    3310 
    3311         // if we're not waiting on anything, resolve the master
    3312         if ( !remaining ) {
    3313             deferred.resolveWith( resolveContexts, resolveValues );
    3314         }
    3315 
    3316         return deferred.promise();
    3317     }
    3318 });
    3319 jQuery.support = (function( support ) {
    3320 
    3321     var all, a, input, select, fragment, opt, eventName, isSupported, i,
    3322         div = document.createElement("div");
    3323 
    3324     // Setup
    3325     div.setAttribute( "className", "t" );
    3326     div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
    3327 
    3328     // Finish early in limited (non-browser) environments
    3329     all = div.getElementsByTagName("*") || [];
    3330     a = div.getElementsByTagName("a")[ 0 ];
    3331     if ( !a || !a.style || !all.length ) {
    3332         return support;
    3333     }
    3334 
    3335     // First batch of tests
    3336     select = document.createElement("select");
    3337     opt = select.appendChild( document.createElement("option") );
    3338     input = div.getElementsByTagName("input")[ 0 ];
    3339 
    3340     a.style.cssText = "top:1px;float:left;opacity:.5";
    3341 
    3342     // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
    3343     support.getSetAttribute = div.className !== "t";
    3344 
    3345     // IE strips leading whitespace when .innerHTML is used
    3346     support.leadingWhitespace = div.firstChild.nodeType === 3;
    3347 
    3348     // Make sure that tbody elements aren't automatically inserted
    3349     // IE will insert them into empty tables
    3350     support.tbody = !div.getElementsByTagName("tbody").length;
    3351 
    3352     // Make sure that link elements get serialized correctly by innerHTML
    3353     // This requires a wrapper element in IE
    3354     support.htmlSerialize = !!div.getElementsByTagName("link").length;
    3355 
    3356     // Get the style information from getAttribute
    3357     // (IE uses .cssText instead)
    3358     support.style = /top/.test( a.getAttribute("style") );
    3359 
    3360     // Make sure that URLs aren't manipulated
    3361     // (IE normalizes it by default)
    3362     support.hrefNormalized = a.getAttribute("href") === "/a";
    3363 
    3364     // Make sure that element opacity exists
    3365     // (IE uses filter instead)
    3366     // Use a regex to work around a WebKit issue. See #5145
    3367     support.opacity = /^0.5/.test( a.style.opacity );
    3368 
    3369     // Verify style float existence
    3370     // (IE uses styleFloat instead of cssFloat)
    3371     support.cssFloat = !!a.style.cssFloat;
    3372 
    3373     // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
    3374     support.checkOn = !!input.value;
    3375 
    3376     // Make sure that a selected-by-default option has a working selected property.
    3377     // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
    3378     support.optSelected = opt.selected;
    3379 
    3380     // Tests for enctype support on a form (#6743)
    3381     support.enctype = !!document.createElement("form").enctype;
    3382 
    3383     // Makes sure cloning an html5 element does not cause problems
    3384     // Where outerHTML is undefined, this still works
    3385     support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>";
    3386 
    3387     // Will be defined later
    3388     support.inlineBlockNeedsLayout = false;
    3389     support.shrinkWrapBlocks = false;
    3390     support.pixelPosition = false;
    3391     support.deleteExpando = true;
    3392     support.noCloneEvent = true;
    3393     support.reliableMarginRight = true;
    3394     support.boxSizingReliable = true;
    3395 
    3396     // Make sure checked status is properly cloned
    3397     input.checked = true;
    3398     support.noCloneChecked = input.cloneNode( true ).checked;
    3399 
    3400     // Make sure that the options inside disabled selects aren't marked as disabled
    3401     // (WebKit marks them as disabled)
    3402     select.disabled = true;
    3403     support.optDisabled = !opt.disabled;
    3404 
    3405     // Support: IE<9
    3406     try {
    3407         delete div.test;
    3408     } catch( e ) {
    3409         support.deleteExpando = false;
    3410     }
    3411 
    3412     // Check if we can trust getAttribute("value")
    3413     input = document.createElement("input");
    3414     input.setAttribute( "value", "" );
    3415     support.input = input.getAttribute( "value" ) === "";
    3416 
    3417     // Check if an input maintains its value after becoming a radio
    3418     input.value = "t";
    3419     input.setAttribute( "type", "radio" );
    3420     support.radioValue = input.value === "t";
    3421 
    3422     // #11217 - WebKit loses check when the name is after the checked attribute
    3423     input.setAttribute( "checked", "t" );
    3424     input.setAttribute( "name", "t" );
    3425 
    3426     fragment = document.createDocumentFragment();
    3427     fragment.appendChild( input );
    3428 
    3429     // Check if a disconnected checkbox will retain its checked
    3430     // value of true after appended to the DOM (IE6/7)
    3431     support.appendChecked = input.checked;
    3432 
    3433     // WebKit doesn't clone checked state correctly in fragments
    3434     support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
    3435 
    3436     // Support: IE<9
    3437     // Opera does not clone events (and typeof div.attachEvent === undefined).
    3438     // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
    3439     if ( div.attachEvent ) {
    3440         div.attachEvent( "onclick", function() {
    3441             support.noCloneEvent = false;
    3442         });
    3443 
    3444         div.cloneNode( true ).click();
    3445     }
    3446 
    3447     // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
    3448     // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
    3449     for ( i in { submit: true, change: true, focusin: true }) {
    3450         div.setAttribute( eventName = "on" + i, "t" );
    3451 
    3452         support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
    3453     }
    3454 
    3455     div.style.backgroundClip = "content-box";
    3456     div.cloneNode( true ).style.backgroundClip = "";
    3457     support.clearCloneStyle = div.style.backgroundClip === "content-box";
    3458 
    3459     // Support: IE<9
    3460     // Iteration over object's inherited properties before its own.
    3461     for ( i in jQuery( support ) ) {
    3462         break;
    3463     }
    3464     support.ownLast = i !== "0";
    3465 
    3466     // Run tests that need a body at doc ready
    3467     jQuery(function() {
    3468         var container, marginDiv, tds,
    3469             divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
    3470             body = document.getElementsByTagName("body")[0];
    3471 
    3472         if ( !body ) {
    3473             // Return for frameset docs that don't have a body
    3474             return;
    3475         }
    3476 
    3477         container = document.createElement("div");
    3478         container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
    3479 
    3480         body.appendChild( container ).appendChild( div );
    3481 
    3482         // Support: IE8
    3483         // Check if table cells still have offsetWidth/Height when they are set
    3484         // to display:none and there are still other visible table cells in a
    3485         // table row; if so, offsetWidth/Height are not reliable for use when
    3486         // determining if an element has been hidden directly using
    3487         // display:none (it is still safe to use offsets if a parent element is
    3488         // hidden; don safety goggles and see bug #4512 for more information).
    3489         div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
    3490         tds = div.getElementsByTagName("td");
    3491         tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
    3492         isSupported = ( tds[ 0 ].offsetHeight === 0 );
    3493 
    3494         tds[ 0 ].style.display = "";
    3495         tds[ 1 ].style.display = "none";
    3496 
    3497         // Support: IE8
    3498         // Check if empty table cells still have offsetWidth/Height
    3499         support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
    3500 
    3501         // Check box-sizing and margin behavior.
    3502         div.innerHTML = "";
    3503         div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
    3504 
    3505         // Workaround failing boxSizing test due to offsetWidth returning wrong value
    3506         // with some non-1 values of body zoom, ticket #13543
    3507         jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
    3508             support.boxSizing = div.offsetWidth === 4;
    3509         });
    3510 
    3511         // Use window.getComputedStyle because jsdom on node.js will break without it.
    3512         if ( window.getComputedStyle ) {
    3513             support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
    3514             support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
    3515 
    3516             // Check if div with explicit width and no margin-right incorrectly
    3517             // gets computed margin-right based on width of container. (#3333)
    3518             // Fails in WebKit before Feb 2011 nightlies
    3519             // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
    3520             marginDiv = div.appendChild( document.createElement("div") );
    3521             marginDiv.style.cssText = div.style.cssText = divReset;
    3522             marginDiv.style.marginRight = marginDiv.style.width = "0";
    3523             div.style.width = "1px";
    3524 
    3525             support.reliableMarginRight =
    3526                 !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
    3527         }
    3528 
    3529         if ( typeof div.style.zoom !== core_strundefined ) {
    3530             // Support: IE<8
    3531             // Check if natively block-level elements act like inline-block
    3532             // elements when setting their display to 'inline' and giving
    3533             // them layout
    3534             div.innerHTML = "";
    3535             div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
    3536             support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
    3537 
    3538             // Support: IE6
    3539             // Check if elements with layout shrink-wrap their children
    3540             div.style.display = "block";
    3541             div.innerHTML = "<div></div>";
    3542             div.firstChild.style.width = "5px";
    3543             support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
    3544 
    3545             if ( support.inlineBlockNeedsLayout ) {
    3546                 // Prevent IE 6 from affecting layout for positioned elements #11048
    3547                 // Prevent IE from shrinking the body in IE 7 mode #12869
    3548                 // Support: IE<8
    3549                 body.style.zoom = 1;
    3550             }
    3551         }
    3552 
    3553         body.removeChild( container );
    3554 
    3555         // Null elements to avoid leaks in IE
    3556         container = div = tds = marginDiv = null;
    3557     });
    3558 
    3559     // Null elements to avoid leaks in IE
    3560     all = select = fragment = opt = a = input = null;
    3561 
    3562     return support;
    3563 })({});
    3564 
    3565 var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
    3566     rmultiDash = /([A-Z])/g;
    3567 
    3568 function internalData( elem, name, data, pvt /* Internal Use Only */ ){
    3569     if ( !jQuery.acceptData( elem ) ) {
    3570         return;
    3571     }
    3572 
    3573     var ret, thisCache,
    3574         internalKey = jQuery.expando,
    3575 
    3576         // We have to handle DOM nodes and JS objects differently because IE6-7
    3577         // can't GC object references properly across the DOM-JS boundary
    3578         isNode = elem.nodeType,
    3579 
    3580         // Only DOM nodes need the global jQuery cache; JS object data is
    3581         // attached directly to the object so GC can occur automatically
    3582         cache = isNode ? jQuery.cache : elem,
    3583 
    3584         // Only defining an ID for JS objects if its cache already exists allows
    3585         // the code to shortcut on the same path as a DOM node with no cache
    3586         id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
    3587 
    3588     // Avoid doing any more work than we need to when trying to get data on an
    3589     // object that has no data at all
    3590     if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
    3591         return;
    3592     }
    3593 
    3594     if ( !id ) {
    3595         // Only DOM nodes need a new unique ID for each element since their data
    3596         // ends up in the global cache
    3597         if ( isNode ) {
    3598             id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;
    3599         } else {
    3600             id = internalKey;
    3601         }
    3602     }
    3603 
    3604     if ( !cache[ id ] ) {
    3605         // Avoid exposing jQuery metadata on plain JS objects when the object
    3606         // is serialized using JSON.stringify
    3607         cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
    3608     }
    3609 
    3610     // An object can be passed to jQuery.data instead of a key/value pair; this gets
    3611     // shallow copied over onto the existing cache
    3612     if ( typeof name === "object" || typeof name === "function" ) {
    3613         if ( pvt ) {
    3614             cache[ id ] = jQuery.extend( cache[ id ], name );
    3615         } else {
    3616             cache[ id ].data = jQuery.extend( cache[ id ].data, name );
    3617         }
    3618     }
    3619 
    3620     thisCache = cache[ id ];
    3621 
    3622     // jQuery data() is stored in a separate object inside the object's internal data
    3623     // cache in order to avoid key collisions between internal data and user-defined
    3624     // data.
    3625     if ( !pvt ) {
    3626         if ( !thisCache.data ) {
    3627             thisCache.data = {};
    3628         }
    3629 
    3630         thisCache = thisCache.data;
    3631     }
    3632 
    3633     if ( data !== undefined ) {
    3634         thisCache[ jQuery.camelCase( name ) ] = data;
    3635     }
    3636 
    3637     // Check for both converted-to-camel and non-converted data property names
    3638     // If a data property was specified
    3639     if ( typeof name === "string" ) {
    3640 
    3641         // First Try to find as-is property data
    3642         ret = thisCache[ name ];
    3643 
    3644         // Test for null|undefined property data
    3645         if ( ret == null ) {
    3646 
    3647             // Try to find the camelCased property
    3648             ret = thisCache[ jQuery.camelCase( name ) ];
    3649         }
    3650     } else {
    3651         ret = thisCache;
    3652     }
    3653 
    3654     return ret;
    3655 }
    3656 
    3657 function internalRemoveData( elem, name, pvt ) {
    3658     if ( !jQuery.acceptData( elem ) ) {
    3659         return;
    3660     }
    3661 
    3662     var thisCache, i,
    3663         isNode = elem.nodeType,
    3664 
    3665         // See jQuery.data for more information
    3666         cache = isNode ? jQuery.cache : elem,
    3667         id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
    3668 
    3669     // If there is already no cache entry for this object, there is no
    3670     // purpose in continuing
    3671     if ( !cache[ id ] ) {
    3672         return;
    3673     }
    3674 
    3675     if ( name ) {
    3676 
    3677         thisCache = pvt ? cache[ id ] : cache[ id ].data;
    3678 
    3679         if ( thisCache ) {
    3680 
    3681             // Support array or space separated string names for data keys
    3682             if ( !jQuery.isArray( name ) ) {
    3683 
    3684                 // try the string as a key before any manipulation
    3685                 if ( name in thisCache ) {
    3686                     name = [ name ];
    3687                 } else {
    3688 
    3689                     // split the camel cased version by spaces unless a key with the spaces exists
    3690                     name = jQuery.camelCase( name );
    3691                     if ( name in thisCache ) {
    3692                         name = [ name ];
    3693                     } else {
    3694                         name = name.split(" ");
    3695                     }
    3696                 }
    3697             } else {
    3698                 // If "name" is an array of keys...
    3699                 // When data is initially created, via ("key", "val") signature,
    3700                 // keys will be converted to camelCase.
    3701                 // Since there is no way to tell _how_ a key was added, remove
    3702                 // both plain key and camelCase key. #12786
    3703                 // This will only penalize the array argument path.
    3704                 name = name.concat( jQuery.map( name, jQuery.camelCase ) );
    3705             }
    3706 
    3707             i = name.length;
    3708             while ( i-- ) {
    3709                 delete thisCache[ name[i] ];
    3710             }
    3711 
    3712             // If there is no data left in the cache, we want to continue
    3713             // and let the cache object itself get destroyed
    3714             if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
    3715                 return;
    3716             }
    3717         }
    3718     }
    3719 
    3720     // See jQuery.data for more information
    3721     if ( !pvt ) {
    3722         delete cache[ id ].data;
    3723 
    3724         // Don't destroy the parent cache unless the internal data object
    3725         // had been the only thing left in it
    3726         if ( !isEmptyDataObject( cache[ id ] ) ) {
    3727             return;
    3728         }
    3729     }
    3730 
    3731     // Destroy the cache
    3732     if ( isNode ) {
    3733         jQuery.cleanData( [ elem ], true );
    3734 
    3735     // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
    3736     /* jshint eqeqeq: false */
    3737     } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
    3738         /* jshint eqeqeq: true */
    3739         delete cache[ id ];
    3740 
    3741     // When all else fails, null
    3742     } else {
    3743         cache[ id ] = null;
    3744     }
    3745 }
    3746 
    3747 jQuery.extend({
    3748     cache: {},
    3749 
    3750     // The following elements throw uncatchable exceptions if you
    3751     // attempt to add expando properties to them.
    3752     noData: {
    3753         "applet": true,
    3754         "embed": true,
    3755         // Ban all objects except for Flash (which handle expandos)
    3756         "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
    3757     },
    3758 
    3759     hasData: function( elem ) {
    3760         elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
    3761         return !!elem && !isEmptyDataObject( elem );
    3762     },
    3763 
    3764     data: function( elem, name, data ) {
    3765         return internalData( elem, name, data );
    3766     },
    3767 
    3768     removeData: function( elem, name ) {
    3769         return internalRemoveData( elem, name );
    3770     },
    3771 
    3772     // For internal use only.
    3773     _data: function( elem, name, data ) {
    3774         return internalData( elem, name, data, true );
    3775     },
    3776 
    3777     _removeData: function( elem, name ) {
    3778         return internalRemoveData( elem, name, true );
    3779     },
    3780 
    3781     // A method for determining if a DOM node can handle the data expando
    3782     acceptData: function( elem ) {
    3783         // Do not set data on non-element because it will not be cleared (#8335).
    3784         if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
    3785             return false;
    3786         }
    3787 
    3788         var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
    3789 
    3790         // nodes accept data unless otherwise specified; rejection can be conditional
    3791         return !noData || noData !== true && elem.getAttribute("classid") === noData;
    3792     }
    3793 });
    3794 
    3795 jQuery.fn.extend({
    3796     data: function( key, value ) {
    3797         var attrs, name,
    3798             data = null,
    3799             i = 0,
    3800             elem = this[0];
    3801 
    3802         // Special expections of .data basically thwart jQuery.access,
    3803         // so implement the relevant behavior ourselves
    3804 
    3805         // Gets all values
    3806         if ( key === undefined ) {
    3807             if ( this.length ) {
    3808                 data = jQuery.data( elem );
    3809 
    3810                 if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
    3811                     attrs = elem.attributes;
    3812                     for ( ; i < attrs.length; i++ ) {
    3813                         name = attrs[i].name;
    3814 
    3815                         if ( name.indexOf("data-") === 0 ) {
    3816                             name = jQuery.camelCase( name.slice(5) );
    3817 
    3818                             dataAttr( elem, name, data[ name ] );
    3819                         }
    3820                     }
    3821                     jQuery._data( elem, "parsedAttrs", true );
    3822                 }
    3823             }
    3824 
    3825             return data;
    3826         }
    3827 
    3828         // Sets multiple values
    3829         if ( typeof key === "object" ) {
    3830             return this.each(function() {
    3831                 jQuery.data( this, key );
    3832             });
    3833         }
    3834 
    3835         return arguments.length > 1 ?
    3836 
    3837             // Sets one value
    3838             this.each(function() {
    3839                 jQuery.data( this, key, value );
    3840             }) :
    3841 
    3842             // Gets one value
    3843             // Try to fetch any internally stored data first
    3844             elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
    3845     },
    3846 
    3847     removeData: function( key ) {
    3848         return this.each(function() {
    3849             jQuery.removeData( this, key );
    3850         });
    3851     }
    3852 });
    3853 
    3854 function dataAttr( elem, key, data ) {
    3855     // If nothing was found internally, try to fetch any
    3856     // data from the HTML5 data-* attribute
    3857     if ( data === undefined && elem.nodeType === 1 ) {
    3858 
    3859         var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
    3860 
    3861         data = elem.getAttribute( name );
    3862 
    3863         if ( typeof data === "string" ) {
    3864             try {
    3865                 data = data === "true" ? true :
    3866                     data === "false" ? false :
    3867                     data === "null" ? null :
    3868                     // Only convert to a number if it doesn't change the string
    3869                     +data + "" === data ? +data :
    3870                     rbrace.test( data ) ? jQuery.parseJSON( data ) :
    3871                         data;
    3872             } catch( e ) {}
    3873 
    3874             // Make sure we set the data so it isn't changed later
    3875             jQuery.data( elem, key, data );
    3876 
    3877         } else {
    3878             data = undefined;
    3879         }
    3880     }
    3881 
    3882     return data;
    3883 }
    3884 
    3885 // checks a cache object for emptiness
    3886 function isEmptyDataObject( obj ) {
    3887     var name;
    3888     for ( name in obj ) {
    3889 
    3890         // if the public data object is empty, the private is still empty
    3891         if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
    3892             continue;
    3893         }
    3894         if ( name !== "toJSON" ) {
    3895             return false;
    3896         }
    3897     }
    3898 
    3899     return true;
    3900 }
    3901 jQuery.extend({
    3902     queue: function( elem, type, data ) {
    3903         var queue;
    3904 
    3905         if ( elem ) {
    3906             type = ( type || "fx" ) + "queue";
    3907             queue = jQuery._data( elem, type );
    3908 
    3909             // Speed up dequeue by getting out quickly if this is just a lookup
    3910             if ( data ) {
    3911                 if ( !queue || jQuery.isArray(data) ) {
    3912                     queue = jQuery._data( elem, type, jQuery.makeArray(data) );
    3913                 } else {
    3914                     queue.push( data );
    3915                 }
    3916             }
    3917             return queue || [];
    3918         }
    3919     },
    3920 
    3921     dequeue: function( elem, type ) {
    3922         type = type || "fx";
    3923 
    3924         var queue = jQuery.queue( elem, type ),
    3925             startLength = queue.length,
    3926             fn = queue.shift(),
    3927             hooks = jQuery._queueHooks( elem, type ),
    3928             next = function() {
    3929                 jQuery.dequeue( elem, type );
    3930             };
    3931 
    3932         // If the fx queue is dequeued, always remove the progress sentinel
    3933         if ( fn === "inprogress" ) {
    3934             fn = queue.shift();
    3935             startLength--;
    3936         }
    3937 
    3938         if ( fn ) {
    3939 
    3940             // Add a progress sentinel to prevent the fx queue from being
    3941             // automatically dequeued
    3942             if ( type === "fx" ) {
    3943                 queue.unshift( "inprogress" );
    3944             }
    3945 
    3946             // clear up the last queue stop function
    3947             delete hooks.stop;
    3948             fn.call( elem, next, hooks );
    3949         }
    3950 
    3951         if ( !startLength && hooks ) {
    3952             hooks.empty.fire();
    3953         }
    3954     },
    3955 
    3956     // not intended for public consumption - generates a queueHooks object, or returns the current one
    3957     _queueHooks: function( elem, type ) {
    3958         var key = type + "queueHooks";
    3959         return jQuery._data( elem, key ) || jQuery._data( elem, key, {
    3960             empty: jQuery.Callbacks("once memory").add(function() {
    3961                 jQuery._removeData( elem, type + "queue" );
    3962                 jQuery._removeData( elem, key );
    3963             })
    3964         });
    3965     }
    3966 });
    3967 
    3968 jQuery.fn.extend({
    3969     queue: function( type, data ) {
    3970         var setter = 2;
    3971 
    3972         if ( typeof type !== "string" ) {
    3973             data = type;
    3974             type = "fx";
    3975             setter--;
    3976         }
    3977 
    3978         if ( arguments.length < setter ) {
    3979             return jQuery.queue( this[0], type );
    3980         }
    3981 
    3982         return data === undefined ?
    3983             this :
    3984             this.each(function() {
    3985                 var queue = jQuery.queue( this, type, data );
    3986 
    3987                 // ensure a hooks for this queue
    3988                 jQuery._queueHooks( this, type );
    3989 
    3990                 if ( type === "fx" && queue[0] !== "inprogress" ) {
    3991                     jQuery.dequeue( this, type );
    3992                 }
    3993             });
    3994     },
    3995     dequeue: function( type ) {
    3996         return this.each(function() {
    3997             jQuery.dequeue( this, type );
    3998         });
    3999     },
    4000     // Based off of the plugin by Clint Helfers, with permission.
    4001     // http://blindsignals.com/index.php/2009/07/jquery-delay/
    4002     delay: function( time, type ) {
    4003         time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
    4004         type = type || "fx";
    4005 
    4006         return this.queue( type, function( next, hooks ) {
    4007             var timeout = setTimeout( next, time );
    4008             hooks.stop = function() {
    4009                 clearTimeout( timeout );
    4010             };
    4011         });
    4012     },
    4013     clearQueue: function( type ) {
    4014         return this.queue( type || "fx", [] );
    4015     },
    4016     // Get a promise resolved when queues of a certain type
    4017     // are emptied (fx is the type by default)
    4018     promise: function( type, obj ) {
    4019         var tmp,
    4020             count = 1,
    4021             defer = jQuery.Deferred(),
    4022             elements = this,
    4023             i = this.length,
    4024             resolve = function() {
    4025                 if ( !( --count ) ) {
    4026                     defer.resolveWith( elements, [ elements ] );
    4027                 }
    4028             };
    4029 
    4030         if ( typeof type !== "string" ) {
    4031             obj = type;
    4032             type = undefined;
    4033         }
    4034         type = type || "fx";
    4035 
    4036         while( i-- ) {
    4037             tmp = jQuery._data( elements[ i ], type + "queueHooks" );
    4038             if ( tmp && tmp.empty ) {
    4039                 count++;
    4040                 tmp.empty.add( resolve );
    4041             }
    4042         }
    4043         resolve();
    4044         return defer.promise( obj );
    4045     }
    4046 });
    4047 var nodeHook, boolHook,
    4048     rclass = /[\t\r\n\f]/g,
    4049     rreturn = /\r/g,
    4050     rfocusable = /^(?:input|select|textarea|button|object)$/i,
    4051     rclickable = /^(?:a|area)$/i,
    4052     ruseDefault = /^(?:checked|selected)$/i,
    4053     getSetAttribute = jQuery.support.getSetAttribute,
    4054     getSetInput = jQuery.support.input;
    4055 
    4056 jQuery.fn.extend({
    4057     attr: function( name, value ) {
    4058         return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
    4059     },
    4060 
    4061     removeAttr: function( name ) {
    4062         return this.each(function() {
    4063             jQuery.removeAttr( this, name );
    4064         });
    4065     },
    4066 
    4067     prop: function( name, value ) {
    4068         return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
    4069     },
    4070 
    4071     removeProp: function( name ) {
    4072         name = jQuery.propFix[ name ] || name;
    4073         return this.each(function() {
    4074             // try/catch handles cases where IE balks (such as removing a property on window)
    4075             try {
    4076                 this[ name ] = undefined;
    4077                 delete this[ name ];
    4078             } catch( e ) {}
    4079         });
    4080     },
    4081 
    4082     addClass: function( value ) {
    4083         var classes, elem, cur, clazz, j,
    4084             i = 0,
    4085             len = this.length,
    4086             proceed = typeof value === "string" && value;
    4087 
    4088         if ( jQuery.isFunction( value ) ) {
    4089             return this.each(function( j ) {
    4090                 jQuery( this ).addClass( value.call( this, j, this.className ) );
    4091             });
    4092         }
    4093 
    4094         if ( proceed ) {
    4095             // The disjunction here is for better compressibility (see removeClass)
    4096             classes = ( value || "" ).match( core_rnotwhite ) || [];
    4097 
    4098             for ( ; i < len; i++ ) {
    4099                 elem = this[ i ];
    4100                 cur = elem.nodeType === 1 && ( elem.className ?
    4101                     ( " " + elem.className + " " ).replace( rclass, " " ) :
    4102                     " "
    4103                 );
    4104 
    4105                 if ( cur ) {
    4106                     j = 0;
    4107                     while ( (clazz = classes[j++]) ) {
    4108                         if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
    4109                             cur += clazz + " ";
    4110                         }
    4111                     }
    4112                     elem.className = jQuery.trim( cur );
    4113 
    4114                 }
    4115             }
    4116         }
    4117 
    4118         return this;
    4119     },
    4120 
    4121     removeClass: function( value ) {
    4122         var classes, elem, cur, clazz, j,
    4123             i = 0,
    4124             len = this.length,
    4125             proceed = arguments.length === 0 || typeof value === "string" && value;
    4126 
    4127         if ( jQuery.isFunction( value ) ) {
    4128             return this.each(function( j ) {
    4129                 jQuery( this ).removeClass( value.call( this, j, this.className ) );
    4130             });
    4131         }
    4132         if ( proceed ) {
    4133             classes = ( value || "" ).match( core_rnotwhite ) || [];
    4134 
    4135             for ( ; i < len; i++ ) {
    4136                 elem = this[ i ];
    4137                 // This expression is here for better compressibility (see addClass)
    4138                 cur = elem.nodeType === 1 && ( elem.className ?
    4139                     ( " " + elem.className + " " ).replace( rclass, " " ) :
    4140                     ""
    4141                 );
    4142 
    4143                 if ( cur ) {
    4144                     j = 0;
    4145                     while ( (clazz = classes[j++]) ) {
    4146                         // Remove *all* instances
    4147                         while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
    4148                             cur = cur.replace( " " + clazz + " ", " " );
    4149                         }
    4150                     }
    4151                     elem.className = value ? jQuery.trim( cur ) : "";
    4152                 }
    4153             }
    4154         }
    4155 
    4156         return this;
    4157     },
    4158 
    4159     toggleClass: function( value, stateVal ) {
    4160         var type = typeof value;
    4161 
    4162         if ( typeof stateVal === "boolean" && type === "string" ) {
    4163             return stateVal ? this.addClass( value ) : this.removeClass( value );
    4164         }
    4165 
    4166         if ( jQuery.isFunction( value ) ) {
    4167             return this.each(function( i ) {
    4168                 jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
    4169             });
    4170         }
    4171 
    4172         return this.each(function() {
    4173             if ( type === "string" ) {
    4174                 // toggle individual class names
    4175                 var className,
    4176                     i = 0,
    4177                     self = jQuery( this ),
    4178                     classNames = value.match( core_rnotwhite ) || [];
    4179 
    4180                 while ( (className = classNames[ i++ ]) ) {
    4181                     // check each className given, space separated list
    4182                     if ( self.hasClass( className ) ) {
    4183                         self.removeClass( className );
    4184                     } else {
    4185                         self.addClass( className );
    4186                     }
    4187                 }
    4188 
    4189             // Toggle whole class name
    4190             } else if ( type === core_strundefined || type === "boolean" ) {
    4191                 if ( this.className ) {
    4192                     // store className if set
    4193                     jQuery._data( this, "__className__", this.className );
    4194                 }
    4195 
    4196                 // If the element has a class name or if we're passed "false",
    4197                 // then remove the whole classname (if there was one, the above saved it).
    4198                 // Otherwise bring back whatever was previously saved (if anything),
    4199                 // falling back to the empty string if nothing was stored.
    4200                 this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
    4201             }
    4202         });
    4203     },
    4204 
    4205     hasClass: function( selector ) {
    4206         var className = " " + selector + " ",
    4207             i = 0,
    4208             l = this.length;
    4209         for ( ; i < l; i++ ) {
    4210             if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
    4211                 return true;
    4212             }
    4213         }
    4214 
    4215         return false;
    4216     },
    4217 
    4218     val: function( value ) {
    4219         var ret, hooks, isFunction,
    4220             elem = this[0];
    4221 
    4222         if ( !arguments.length ) {
    4223             if ( elem ) {
    4224                 hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
    4225 
    4226                 if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
    4227                     return ret;
    4228                 }
    4229 
    4230                 ret = elem.value;
    4231 
    4232                 return typeof ret === "string" ?
    4233                     // handle most common string cases
    4234                     ret.replace(rreturn, "") :
    4235                     // handle cases where value is null/undef or number
    4236                     ret == null ? "" : ret;
    4237             }
    4238 
    4239             return;
    4240         }
    4241 
    4242         isFunction = jQuery.isFunction( value );
    4243 
    4244         return this.each(function( i ) {
    4245             var val;
    4246 
    4247             if ( this.nodeType !== 1 ) {
    4248                 return;
    4249             }
    4250 
    4251             if ( isFunction ) {
    4252                 val = value.call( this, i, jQuery( this ).val() );
    4253             } else {
    4254                 val = value;
    4255             }
    4256 
    4257             // Treat null/undefined as ""; convert numbers to string
    4258             if ( val == null ) {
    4259                 val = "";
    4260             } else if ( typeof val === "number" ) {
    4261                 val += "";
    4262             } else if ( jQuery.isArray( val ) ) {
    4263                 val = jQuery.map(val, function ( value ) {
    4264                     return value == null ? "" : value + "";
    4265                 });
    4266             }
    4267 
    4268             hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
    4269 
    4270             // If set returns undefined, fall back to normal setting
    4271             if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
    4272                 this.value = val;
    4273             }
    4274         });
    4275     }
    4276 });
    4277 
    4278 jQuery.extend({
    4279     valHooks: {
    4280         option: {
    4281             get: function( elem ) {
    4282                 // Use proper attribute retrieval(#6932, #12072)
    4283                 var val = jQuery.find.attr( elem, "value" );
    4284                 return val != null ?
    4285                     val :
    4286                     elem.text;
    4287             }
    4288         },
    4289         select: {
    4290             get: function( elem ) {
    4291                 var value, option,
    4292                     options = elem.options,
    4293                     index = elem.selectedIndex,
    4294                     one = elem.type === "select-one" || index < 0,
    4295                     values = one ? null : [],
    4296                     max = one ? index + 1 : options.length,
    4297                     i = index < 0 ?
    4298                         max :
    4299                         one ? index : 0;
    4300 
    4301                 // Loop through all the selected options
    4302                 for ( ; i < max; i++ ) {
    4303                     option = options[ i ];
    4304 
    4305                     // oldIE doesn't update selected after form reset (#2551)
    4306                     if ( ( option.selected || i === index ) &&
    4307                             // Don't return options that are disabled or in a disabled optgroup
    4308                             ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
    4309                             ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
    4310 
    4311                         // Get the specific value for the option
    4312                         value = jQuery( option ).val();
    4313 
    4314                         // We don't need an array for one selects
    4315                         if ( one ) {
    4316                             return value;
    4317                         }
    4318 
    4319                         // Multi-Selects return an array
    4320                         values.push( value );
    4321                     }
    4322                 }
    4323 
    4324                 return values;
    4325             },
    4326 
    4327             set: function( elem, value ) {
    4328                 var optionSet, option,
    4329                     options = elem.options,
    4330                     values = jQuery.makeArray( value ),
    4331                     i = options.length;
    4332 
    4333                 while ( i-- ) {
    4334                     option = options[ i ];
    4335                     if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
    4336                         optionSet = true;
    4337                     }
    4338                 }
    4339 
    4340                 // force browsers to behave consistently when non-matching value is set
    4341                 if ( !optionSet ) {
    4342                     elem.selectedIndex = -1;
    4343                 }
    4344                 return values;
    4345             }
    4346         }
    4347     },
    4348 
    4349     attr: function( elem, name, value ) {
    4350         var hooks, ret,
    4351             nType = elem.nodeType;
    4352 
    4353         // don't get/set attributes on text, comment and attribute nodes
    4354         if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
    4355             return;
    4356         }
    4357 
    4358         // Fallback to prop when attributes are not supported
    4359         if ( typeof elem.getAttribute === core_strundefined ) {
    4360             return jQuery.prop( elem, name, value );
    4361         }
    4362 
    4363         // All attributes are lowercase
    4364         // Grab necessary hook if one is defined
    4365         if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
    4366             name = name.toLowerCase();
    4367             hooks = jQuery.attrHooks[ name ] ||
    4368                 ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
    4369         }
    4370 
    4371         if ( value !== undefined ) {
    4372 
    4373             if ( value === null ) {
    4374                 jQuery.removeAttr( elem, name );
    4375 
    4376             } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
    4377                 return ret;
    4378 
    4379             } else {
    4380                 elem.setAttribute( name, value + "" );
    4381                 return value;
    4382             }
    4383 
    4384         } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
    4385             return ret;
    4386 
    4387         } else {
    4388             ret = jQuery.find.attr( elem, name );
    4389 
    4390             // Non-existent attributes return null, we normalize to undefined
    4391             return ret == null ?
    4392                 undefined :
    4393                 ret;
    4394         }
    4395     },
    4396 
    4397     removeAttr: function( elem, value ) {
    4398         var name, propName,
    4399             i = 0,
    4400             attrNames = value && value.match( core_rnotwhite );
    4401 
    4402         if ( attrNames && elem.nodeType === 1 ) {
    4403             while ( (name = attrNames[i++]) ) {
    4404                 propName = jQuery.propFix[ name ] || name;
    4405 
    4406                 // Boolean attributes get special treatment (#10870)
    4407                 if ( jQuery.expr.match.bool.test( name ) ) {
    4408                     // Set corresponding property to false
    4409                     if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
    4410                         elem[ propName ] = false;
    4411                     // Support: IE<9
    4412                     // Also clear defaultChecked/defaultSelected (if appropriate)
    4413                     } else {
    4414                         elem[ jQuery.camelCase( "default-" + name ) ] =
    4415                             elem[ propName ] = false;
    4416                     }
    4417 
    4418                 // See #9699 for explanation of this approach (setting first, then removal)
    4419                 } else {
    4420                     jQuery.attr( elem, name, "" );
    4421                 }
    4422 
    4423                 elem.removeAttribute( getSetAttribute ? name : propName );
    4424             }
    4425         }
    4426     },
    4427 
    4428     attrHooks: {
    4429         type: {
    4430             set: function( elem, value ) {
    4431                 if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
    4432                     // Setting the type on a radio button after the value resets the value in IE6-9
    4433                     // Reset value to default in case type is set after value during creation
    4434                     var val = elem.value;
    4435                     elem.setAttribute( "type", value );
    4436                     if ( val ) {
    4437                         elem.value = val;
    4438                     }
    4439                     return value;
    4440                 }
    4441             }
    4442         }
    4443     },
    4444 
    4445     propFix: {
    4446         "for": "htmlFor",
    4447         "class": "className"
    4448     },
    4449 
    4450     prop: function( elem, name, value ) {
    4451         var ret, hooks, notxml,
    4452             nType = elem.nodeType;
    4453 
    4454         // don't get/set properties on text, comment and attribute nodes
    4455         if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
    4456             return;
    4457         }
    4458 
    4459         notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
    4460 
    4461         if ( notxml ) {
    4462             // Fix name and attach hooks
    4463             name = jQuery.propFix[ name ] || name;
    4464             hooks = jQuery.propHooks[ name ];
    4465         }
    4466 
    4467         if ( value !== undefined ) {
    4468             return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
    4469                 ret :
    4470                 ( elem[ name ] = value );
    4471 
    4472         } else {
    4473             return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
    4474                 ret :
    4475                 elem[ name ];
    4476         }
    4477     },
    4478 
    4479     propHooks: {
    4480         tabIndex: {
    4481             get: function( elem ) {
    4482                 // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
    4483                 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
    4484                 // Use proper attribute retrieval(#12072)
    4485                 var tabindex = jQuery.find.attr( elem, "tabindex" );
    4486 
    4487                 return tabindex ?
    4488                     parseInt( tabindex, 10 ) :
    4489                     rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
    4490                         0 :
    4491                         -1;
    4492             }
    4493         }
    4494     }
    4495 });
    4496 
    4497 // Hooks for boolean attributes
    4498 boolHook = {
    4499     set: function( elem, value, name ) {
    4500         if ( value === false ) {
    4501             // Remove boolean attributes when set to false
    4502             jQuery.removeAttr( elem, name );
    4503         } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
    4504             // IE<8 needs the *property* name
    4505             elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
    4506 
    4507         // Use defaultChecked and defaultSelected for oldIE
    4508         } else {
    4509             elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
    4510         }
    4511 
    4512         return name;
    4513     }
    4514 };
    4515 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
    4516     var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
    4517 
    4518     jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
    4519         function( elem, name, isXML ) {
    4520             var fn = jQuery.expr.attrHandle[ name ],
    4521                 ret = isXML ?
    4522                     undefined :
    4523                     /* jshint eqeqeq: false */
    4524                     (jQuery.expr.attrHandle[ name ] = undefined) !=
    4525                         getter( elem, name, isXML ) ?
    4526 
    4527                         name.toLowerCase() :
    4528                         null;
    4529             jQuery.expr.attrHandle[ name ] = fn;
    4530             return ret;
    4531         } :
    4532         function( elem, name, isXML ) {
    4533             return isXML ?
    4534                 undefined :
    4535                 elem[ jQuery.camelCase( "default-" + name ) ] ?
    4536                     name.toLowerCase() :
    4537                     null;
    4538         };
    4539 });
    4540 
    4541 // fix oldIE attroperties
    4542 if ( !getSetInput || !getSetAttribute ) {
    4543     jQuery.attrHooks.value = {
    4544         set: function( elem, value, name ) {
    4545             if ( jQuery.nodeName( elem, "input" ) ) {
    4546                 // Does not return so that setAttribute is also used
    4547                 elem.defaultValue = value;
    4548             } else {
    4549                 // Use nodeHook if defined (#1954); otherwise setAttribute is fine
    4550                 return nodeHook && nodeHook.set( elem, value, name );
    4551             }
    4552         }
    4553     };
    4554 }
    4555 
    4556 // IE6/7 do not support getting/setting some attributes with get/setAttribute
    4557 if ( !getSetAttribute ) {
    4558 
    4559     // Use this for any attribute in IE6/7
    4560     // This fixes almost every IE6/7 issue
    4561     nodeHook = {
    4562         set: function( elem, value, name ) {
    4563             // Set the existing or create a new attribute node
    4564             var ret = elem.getAttributeNode( name );
    4565             if ( !ret ) {
    4566                 elem.setAttributeNode(
    4567                     (ret = elem.ownerDocument.createAttribute( name ))
    4568                 );
    4569             }
    4570 
    4571             ret.value = value += "";
    4572 
    4573             // Break association with cloned elements by also using setAttribute (#9646)
    4574             return name === "value" || value === elem.getAttribute( name ) ?
    4575                 value :
    4576                 undefined;
    4577         }
    4578     };
    4579     jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =
    4580         // Some attributes are constructed with empty-string values when not defined
    4581         function( elem, name, isXML ) {
    4582             var ret;
    4583             return isXML ?
    4584                 undefined :
    4585                 (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
    4586                     ret.value :
    4587                     null;
    4588         };
    4589     jQuery.valHooks.button = {
    4590         get: function( elem, name ) {
    4591             var ret = elem.getAttributeNode( name );
    4592             return ret && ret.specified ?
    4593                 ret.value :
    4594                 undefined;
    4595         },
    4596         set: nodeHook.set
    4597     };
    4598 
    4599     // Set contenteditable to false on removals(#10429)
    4600     // Setting to empty string throws an error as an invalid value
    4601     jQuery.attrHooks.contenteditable = {
    4602         set: function( elem, value, name ) {
    4603             nodeHook.set( elem, value === "" ? false : value, name );
    4604         }
    4605     };
    4606 
    4607     // Set width and height to auto instead of 0 on empty string( Bug #8150 )
    4608     // This is for removals
    4609     jQuery.each([ "width", "height" ], function( i, name ) {
    4610         jQuery.attrHooks[ name ] = {
    4611             set: function( elem, value ) {
    4612                 if ( value === "" ) {
    4613                     elem.setAttribute( name, "auto" );
    4614                     return value;
    4615                 }
    4616             }
    4617         };
    4618     });
    4619 }
    4620 
    4621 
    4622 // Some attributes require a special call on IE
    4623 // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
    4624 if ( !jQuery.support.hrefNormalized ) {
    4625     // href/src property should get the full normalized URL (#10299/#12915)
    4626     jQuery.each([ "href", "src" ], function( i, name ) {
    4627         jQuery.propHooks[ name ] = {
    4628             get: function( elem ) {
    4629                 return elem.getAttribute( name, 4 );
    4630             }
    4631         };
    4632     });
    4633 }
    4634 
    4635 if ( !jQuery.support.style ) {
    4636     jQuery.attrHooks.style = {
    4637         get: function( elem ) {
    4638             // Return undefined in the case of empty string
    4639             // Note: IE uppercases css property names, but if we were to .toLowerCase()
    4640             // .cssText, that would destroy case senstitivity in URL's, like in "background"
    4641             return elem.style.cssText || undefined;
    4642         },
    4643         set: function( elem, value ) {
    4644             return ( elem.style.cssText = value + "" );
    4645         }
    4646     };
    4647 }
    4648 
    4649 // Safari mis-reports the default selected property of an option
    4650 // Accessing the parent's selectedIndex property fixes it
    4651 if ( !jQuery.support.optSelected ) {
    4652     jQuery.propHooks.selected = {
    4653         get: function( elem ) {
    4654             var parent = elem.parentNode;
    4655 
    4656             if ( parent ) {
    4657                 parent.selectedIndex;
    4658 
    4659                 // Make sure that it also works with optgroups, see #5701
    4660                 if ( parent.parentNode ) {
    4661                     parent.parentNode.selectedIndex;
    4662                 }
    4663             }
    4664             return null;
    4665         }
    4666     };
    4667 }
    4668 
    4669 jQuery.each([
    4670     "tabIndex",
    4671     "readOnly",
    4672     "maxLength",
    4673     "cellSpacing",
    4674     "cellPadding",
    4675     "rowSpan",
    4676     "colSpan",
    4677     "useMap",
    4678     "frameBorder",
    4679     "contentEditable"
    4680 ], function() {
    4681     jQuery.propFix[ this.toLowerCase() ] = this;
    4682 });
    4683 
    4684 // IE6/7 call enctype encoding
    4685 if ( !jQuery.support.enctype ) {
    4686     jQuery.propFix.enctype = "encoding";
    4687 }
    4688 
    4689 // Radios and checkboxes getter/setter
    4690 jQuery.each([ "radio", "checkbox" ], function() {
    4691     jQuery.valHooks[ this ] = {
    4692         set: function( elem, value ) {
    4693             if ( jQuery.isArray( value ) ) {
    4694                 return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
    4695             }
    4696         }
    4697     };
    4698     if ( !jQuery.support.checkOn ) {
    4699         jQuery.valHooks[ this ].get = function( elem ) {
    4700             // Support: Webkit
    4701             // "" is returned instead of "on" if a value isn't specified
    4702             return elem.getAttribute("value") === null ? "on" : elem.value;
    4703         };
    4704     }
    4705 });
    4706 var rformElems = /^(?:input|select|textarea)$/i,
    4707     rkeyEvent = /^key/,
    4708     rmouseEvent = /^(?:mouse|contextmenu)|click/,
    4709     rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
    4710     rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
    4711 
    4712 function returnTrue() {
    4713     return true;
    4714 }
    4715 
    4716 function returnFalse() {
    4717     return false;
    4718 }
    4719 
    4720 function safeActiveElement() {
    4721     try {
    4722         return document.activeElement;
    4723     } catch ( err ) { }
    4724 }
    4725 
    4726 /*
    4727  * Helper functions for managing events -- not part of the public interface.
    4728  * Props to Dean Edwards' addEvent library for many of the ideas.
    4729  */
    4730 jQuery.event = {
    4731 
    4732     global: {},
    4733 
    4734     add: function( elem, types, handler, data, selector ) {
    4735         var tmp, events, t, handleObjIn,
    4736             special, eventHandle, handleObj,
    4737             handlers, type, namespaces, origType,
    4738             elemData = jQuery._data( elem );
    4739 
    4740         // Don't attach events to noData or text/comment nodes (but allow plain objects)
    4741         if ( !elemData ) {
    4742             return;
    4743         }
    4744 
    4745         // Caller can pass in an object of custom data in lieu of the handler
    4746         if ( handler.handler ) {
    4747             handleObjIn = handler;
    4748             handler = handleObjIn.handler;
    4749             selector = handleObjIn.selector;
    4750         }
    4751 
    4752         // Make sure that the handler has a unique ID, used to find/remove it later
    4753         if ( !handler.guid ) {
    4754             handler.guid = jQuery.guid++;
    4755         }
    4756 
    4757         // Init the element's event structure and main handler, if this is the first
    4758         if ( !(events = elemData.events) ) {
    4759             events = elemData.events = {};
    4760         }
    4761         if ( !(eventHandle = elemData.handle) ) {
    4762             eventHandle = elemData.handle = function( e ) {
    4763                 // Discard the second event of a jQuery.event.trigger() and
    4764                 // when an event is called after a page has unloaded
    4765                 return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
    4766                     jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
    4767                     undefined;
    4768             };
    4769             // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
    4770             eventHandle.elem = elem;
    4771         }
    4772 
    4773         // Handle multiple events separated by a space
    4774         types = ( types || "" ).match( core_rnotwhite ) || [""];
    4775         t = types.length;
    4776         while ( t-- ) {
    4777             tmp = rtypenamespace.exec( types[t] ) || [];
    4778             type = origType = tmp[1];
    4779             namespaces = ( tmp[2] || "" ).split( "." ).sort();
    4780 
    4781             // There *must* be a type, no attaching namespace-only handlers
    4782             if ( !type ) {
    4783                 continue;
    4784             }
    4785 
    4786             // If event changes its type, use the special event handlers for the changed type
    4787             special = jQuery.event.special[ type ] || {};
    4788 
    4789             // If selector defined, determine special event api type, otherwise given type
    4790             type = ( selector ? special.delegateType : special.bindType ) || type;
    4791 
    4792             // Update special based on newly reset type
    4793             special = jQuery.event.special[ type ] || {};
    4794 
    4795             // handleObj is passed to all event handlers
    4796             handleObj = jQuery.extend({
    4797                 type: type,
    4798                 origType: origType,
    4799                 data: data,
    4800                 handler: handler,
    4801                 guid: handler.guid,
    4802                 selector: selector,
    4803                 needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
    4804                 namespace: namespaces.join(".")
    4805             }, handleObjIn );
    4806 
    4807             // Init the event handler queue if we're the first
    4808             if ( !(handlers = events[ type ]) ) {
    4809                 handlers = events[ type ] = [];
    4810                 handlers.delegateCount = 0;
    4811 
    4812                 // Only use addEventListener/attachEvent if the special events handler returns false
    4813                 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
    4814                     // Bind the global event handler to the element
    4815                     if ( elem.addEventListener ) {
    4816                         elem.addEventListener( type, eventHandle, false );
    4817 
    4818                     } else if ( elem.attachEvent ) {
    4819                         elem.attachEvent( "on" + type, eventHandle );
    4820                     }
    4821                 }
    4822             }
    4823 
    4824             if ( special.add ) {
    4825                 special.add.call( elem, handleObj );
    4826 
    4827                 if ( !handleObj.handler.guid ) {
    4828                     handleObj.handler.guid = handler.guid;
    4829                 }
    4830             }
    4831 
    4832             // Add to the element's handler list, delegates in front
    4833             if ( selector ) {
    4834                 handlers.splice( handlers.delegateCount++, 0, handleObj );
    4835             } else {
    4836                 handlers.push( handleObj );
    4837             }
    4838 
    4839             // Keep track of which events have ever been used, for event optimization
    4840             jQuery.event.global[ type ] = true;
    4841         }
    4842 
    4843         // Nullify elem to prevent memory leaks in IE
    4844         elem = null;
    4845     },
    4846 
    4847     // Detach an event or set of events from an element
    4848     remove: function( elem, types, handler, selector, mappedTypes ) {
    4849         var j, handleObj, tmp,
    4850             origCount, t, events,
    4851             special, handlers, type,
    4852             namespaces, origType,
    4853             elemData = jQuery.hasData( elem ) && jQuery._data( elem );
    4854 
    4855         if ( !elemData || !(events = elemData.events) ) {
    4856             return;
    4857         }
    4858 
    4859         // Once for each type.namespace in types; type may be omitted
    4860         types = ( types || "" ).match( core_rnotwhite ) || [""];
    4861         t = types.length;
    4862         while ( t-- ) {
    4863             tmp = rtypenamespace.exec( types[t] ) || [];
    4864             type = origType = tmp[1];
    4865             namespaces = ( tmp[2] || "" ).split( "." ).sort();
    4866 
    4867             // Unbind all events (on this namespace, if provided) for the element
    4868             if ( !type ) {
    4869                 for ( type in events ) {
    4870                     jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
    4871                 }
    4872                 continue;
    4873             }
    4874 
    4875             special = jQuery.event.special[ type ] || {};
    4876             type = ( selector ? special.delegateType : special.bindType ) || type;
    4877             handlers = events[ type ] || [];
    4878             tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
    4879 
    4880             // Remove matching events
    4881             origCount = j = handlers.length;
    4882             while ( j-- ) {
    4883                 handleObj = handlers[ j ];
    4884 
    4885                 if ( ( mappedTypes || origType === handleObj.origType ) &&
    4886                     ( !handler || handler.guid === handleObj.guid ) &&
    4887                     ( !tmp || tmp.test( handleObj.namespace ) ) &&
    4888                     ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
    4889                     handlers.splice( j, 1 );
    4890 
    4891                     if ( handleObj.selector ) {
    4892                         handlers.delegateCount--;
    4893                     }
    4894                     if ( special.remove ) {
    4895                         special.remove.call( elem, handleObj );
    4896                     }
    4897                 }
    4898             }
    4899 
    4900             // Remove generic event handler if we removed something and no more handlers exist
    4901             // (avoids potential for endless recursion during removal of special event handlers)
    4902             if ( origCount && !handlers.length ) {
    4903                 if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
    4904                     jQuery.removeEvent( elem, type, elemData.handle );
    4905                 }
    4906 
    4907                 delete events[ type ];
    4908             }
    4909         }
    4910 
    4911         // Remove the expando if it's no longer used
    4912         if ( jQuery.isEmptyObject( events ) ) {
    4913             delete elemData.handle;
    4914 
    4915             // removeData also checks for emptiness and clears the expando if empty
    4916             // so use it instead of delete
    4917             jQuery._removeData( elem, "events" );
    4918         }
    4919     },
    4920 
    4921     trigger: function( event, data, elem, onlyHandlers ) {
    4922         var handle, ontype, cur,
    4923             bubbleType, special, tmp, i,
    4924             eventPath = [ elem || document ],
    4925             type = core_hasOwn.call( event, "type" ) ? event.type : event,
    4926             namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
    4927 
    4928         cur = tmp = elem = elem || document;
    4929 
    4930         // Don't do events on text and comment nodes
    4931         if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
    4932             return;
    4933         }
    4934 
    4935         // focus/blur morphs to focusin/out; ensure we're not firing them right now
    4936         if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
    4937             return;
    4938         }
    4939 
    4940         if ( type.indexOf(".") >= 0 ) {
    4941             // Namespaced trigger; create a regexp to match event type in handle()
    4942             namespaces = type.split(".");
    4943             type = namespaces.shift();
    4944             namespaces.sort();
    4945         }
    4946         ontype = type.indexOf(":") < 0 && "on" + type;
    4947 
    4948         // Caller can pass in a jQuery.Event object, Object, or just an event type string
    4949         event = event[ jQuery.expando ] ?
    4950             event :
    4951             new jQuery.Event( type, typeof event === "object" && event );
    4952 
    4953         // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
    4954         event.isTrigger = onlyHandlers ? 2 : 3;
    4955         event.namespace = namespaces.join(".");
    4956         event.namespace_re = event.namespace ?
    4957             new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
    4958             null;
    4959 
    4960         // Clean up the event in case it is being reused
    4961         event.result = undefined;
    4962         if ( !event.target ) {
    4963             event.target = elem;
    4964         }
    4965 
    4966         // Clone any incoming data and prepend the event, creating the handler arg list
    4967         data = data == null ?
    4968             [ event ] :
    4969             jQuery.makeArray( data, [ event ] );
    4970 
    4971         // Allow special events to draw outside the lines
    4972         special = jQuery.event.special[ type ] || {};
    4973         if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
    4974             return;
    4975         }
    4976 
    4977         // Determine event propagation path in advance, per W3C events spec (#9951)
    4978         // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
    4979         if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
    4980 
    4981             bubbleType = special.delegateType || type;
    4982             if ( !rfocusMorph.test( bubbleType + type ) ) {
    4983                 cur = cur.parentNode;
    4984             }
    4985             for ( ; cur; cur = cur.parentNode ) {
    4986                 eventPath.push( cur );
    4987                 tmp = cur;
    4988             }
    4989 
    4990             // Only add window if we got to document (e.g., not plain obj or detached DOM)
    4991             if ( tmp === (elem.ownerDocument || document) ) {
    4992                 eventPath.push( tmp.defaultView || tmp.parentWindow || window );
    4993             }
    4994         }
    4995 
    4996         // Fire handlers on the event path
    4997         i = 0;
    4998         while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
    4999 
    5000             event.type = i > 1 ?
    5001                 bubbleType :
    5002                 special.bindType || type;
    5003 
    5004             // jQuery handler
    5005             handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
    5006             if ( handle ) {
    5007                 handle.apply( cur, data );
    5008             }
    5009 
    5010             // Native handler
    5011             handle = ontype && cur[ ontype ];
    5012             if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
    5013                 event.preventDefault();
    5014             }
    5015         }
    5016         event.type = type;
    5017 
    5018         // If nobody prevented the default action, do it now
    5019         if ( !onlyHandlers && !event.isDefaultPrevented() ) {
    5020 
    5021             if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
    5022                 jQuery.acceptData( elem ) ) {
    5023 
    5024                 // Call a native DOM method on the target with the same name name as the event.
    5025                 // Can't use an .isFunction() check here because IE6/7 fails that test.
    5026                 // Don't do default actions on window, that's where global variables be (#6170)
    5027                 if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
    5028 
    5029                     // Don't re-trigger an onFOO event when we call its FOO() method
    5030                     tmp = elem[ ontype ];
    5031 
    5032                     if ( tmp ) {
    5033                         elem[ ontype ] = null;
    5034                     }
    5035 
    5036                     // Prevent re-triggering of the same event, since we already bubbled it above
    5037                     jQuery.event.triggered = type;
    5038                     try {
    5039                         elem[ type ]();
    5040                     } catch ( e ) {
    5041                         // IE<9 dies on focus/blur to hidden element (#1486,#12518)
    5042                         // only reproducible on winXP IE8 native, not IE9 in IE8 mode
    5043                     }
    5044                     jQuery.event.triggered = undefined;
    5045 
    5046                     if ( tmp ) {
    5047                         elem[ ontype ] = tmp;
    5048                     }
    5049                 }
    5050             }
    5051         }
    5052 
    5053         return event.result;
    5054     },
    5055 
    5056     dispatch: function( event ) {
    5057 
    5058         // Make a writable jQuery.Event from the native event object
    5059         event = jQuery.event.fix( event );
    5060 
    5061         var i, ret, handleObj, matched, j,
    5062             handlerQueue = [],
    5063             args = core_slice.call( arguments ),
    5064             handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
    5065             special = jQuery.event.special[ event.type ] || {};
    5066 
    5067         // Use the fix-ed jQuery.Event rather than the (read-only) native event
    5068         args[0] = event;
    5069         event.delegateTarget = this;
    5070 
    5071         // Call the preDispatch hook for the mapped type, and let it bail if desired
    5072         if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
    5073             return;
    5074         }
    5075 
    5076         // Determine handlers
    5077         handlerQueue = jQuery.event.handlers.call( this, event, handlers );
    5078 
    5079         // Run delegates first; they may want to stop propagation beneath us
    5080         i = 0;
    5081         while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
    5082             event.currentTarget = matched.elem;
    5083 
    5084             j = 0;
    5085             while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
    5086 
    5087                 // Triggered event must either 1) have no namespace, or
    5088                 // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
    5089                 if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
    5090 
    5091                     event.handleObj = handleObj;
    5092                     event.data = handleObj.data;
    5093 
    5094                     ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
    5095                             .apply( matched.elem, args );
    5096 
    5097                     if ( ret !== undefined ) {
    5098                         if ( (event.result = ret) === false ) {
    5099                             event.preventDefault();
    5100                             event.stopPropagation();
    5101                         }
    5102                     }
    5103                 }
    5104             }
    5105         }
    5106 
    5107         // Call the postDispatch hook for the mapped type
    5108         if ( special.postDispatch ) {
    5109             special.postDispatch.call( this, event );
    5110         }
    5111 
    5112         return event.result;
    5113     },
    5114 
    5115     handlers: function( event, handlers ) {
    5116         var sel, handleObj, matches, i,
    5117             handlerQueue = [],
    5118             delegateCount = handlers.delegateCount,
    5119             cur = event.target;
    5120 
    5121         // Find delegate handlers
    5122         // Black-hole SVG <use> instance trees (#13180)
    5123         // Avoid non-left-click bubbling in Firefox (#3861)
    5124         if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
    5125 
    5126             /* jshint eqeqeq: false */
    5127             for ( ; cur != this; cur = cur.parentNode || this ) {
    5128                 /* jshint eqeqeq: true */
    5129 
    5130                 // Don't check non-elements (#13208)
    5131                 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
    5132                 if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
    5133                     matches = [];
    5134                     for ( i = 0; i < delegateCount; i++ ) {
    5135                         handleObj = handlers[ i ];
    5136 
    5137                         // Don't conflict with Object.prototype properties (#13203)
    5138                         sel = handleObj.selector + " ";
    5139 
    5140                         if ( matches[ sel ] === undefined ) {
    5141                             matches[ sel ] = handleObj.needsContext ?
    5142                                 jQuery( sel, this ).index( cur ) >= 0 :
    5143                                 jQuery.find( sel, this, null, [ cur ] ).length;
    5144                         }
    5145                         if ( matches[ sel ] ) {
    5146                             matches.push( handleObj );
    5147                         }
    5148                     }
    5149                     if ( matches.length ) {
    5150                         handlerQueue.push({ elem: cur, handlers: matches });
    5151                     }
    5152                 }
    5153             }
    5154         }
    5155 
    5156         // Add the remaining (directly-bound) handlers
    5157         if ( delegateCount < handlers.length ) {
    5158             handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
    5159         }
    5160 
    5161         return handlerQueue;
    5162     },
    5163 
    5164     fix: function( event ) {
    5165         if ( event[ jQuery.expando ] ) {
    5166             return event;
    5167         }
    5168 
    5169         // Create a writable copy of the event object and normalize some properties
    5170         var i, prop, copy,
    5171             type = event.type,
    5172             originalEvent = event,
    5173             fixHook = this.fixHooks[ type ];
    5174 
    5175         if ( !fixHook ) {
    5176             this.fixHooks[ type ] = fixHook =
    5177                 rmouseEvent.test( type ) ? this.mouseHooks :
    5178                 rkeyEvent.test( type ) ? this.keyHooks :
    5179                 {};
    5180         }
    5181         copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
    5182 
    5183         event = new jQuery.Event( originalEvent );
    5184 
    5185         i = copy.length;
    5186         while ( i-- ) {
    5187             prop = copy[ i ];
    5188             event[ prop ] = originalEvent[ prop ];
    5189         }
    5190 
    5191         // Support: IE<9
    5192         // Fix target property (#1925)
    5193         if ( !event.target ) {
    5194             event.target = originalEvent.srcElement || document;
    5195         }
    5196 
    5197         // Support: Chrome 23+, Safari?
    5198         // Target should not be a text node (#504, #13143)
    5199         if ( event.target.nodeType === 3 ) {
    5200             event.target = event.target.parentNode;
    5201         }
    5202 
    5203         // Support: IE<9
    5204         // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
    5205         event.metaKey = !!event.metaKey;
    5206 
    5207         return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
    5208     },
    5209 
    5210     // Includes some event props shared by KeyEvent and MouseEvent
    5211     props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
    5212 
    5213     fixHooks: {},
    5214 
    5215     keyHooks: {
    5216         props: "char charCode key keyCode".split(" "),
    5217         filter: function( event, original ) {
    5218 
    5219             // Add which for key events
    5220             if ( event.which == null ) {
    5221                 event.which = original.charCode != null ? original.charCode : original.keyCode;
    5222             }
    5223 
    5224             return event;
    5225         }
    5226     },
    5227 
    5228     mouseHooks: {
    5229         props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
    5230         filter: function( event, original ) {
    5231             var body, eventDoc, doc,
    5232                 button = original.button,
    5233                 fromElement = original.fromElement;
    5234 
    5235             // Calculate pageX/Y if missing and clientX/Y available
    5236             if ( event.pageX == null && original.clientX != null ) {
    5237                 eventDoc = event.target.ownerDocument || document;
    5238                 doc = eventDoc.documentElement;
    5239                 body = eventDoc.body;
    5240 
    5241                 event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
    5242                 event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
    5243             }
    5244 
    5245             // Add relatedTarget, if necessary
    5246             if ( !event.relatedTarget && fromElement ) {
    5247                 event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
    5248             }
    5249 
    5250             // Add which for click: 1 === left; 2 === middle; 3 === right
    5251             // Note: button is not normalized, so don't use it
    5252             if ( !event.which && button !== undefined ) {
    5253                 event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
    5254             }
    5255 
    5256             return event;
    5257         }
    5258     },
    5259 
    5260     special: {
    5261         load: {
    5262             // Prevent triggered image.load events from bubbling to window.load
    5263             noBubble: true
    5264         },
    5265         focus: {
    5266             // Fire native event if possible so blur/focus sequence is correct
    5267             trigger: function() {
    5268                 if ( this !== safeActiveElement() && this.focus ) {
    5269                     try {
    5270                         this.focus();
    5271                         return false;
    5272                     } catch ( e ) {
    5273                         // Support: IE<9
    5274                         // If we error on focus to hidden element (#1486, #12518),
    5275                         // let .trigger() run the handlers
    5276                     }
    5277                 }
    5278             },
    5279             delegateType: "focusin"
    5280         },
    5281         blur: {
    5282             trigger: function() {
    5283                 if ( this === safeActiveElement() && this.blur ) {
    5284                     this.blur();
    5285                     return false;
    5286                 }
    5287             },
    5288             delegateType: "focusout"
    5289         },
    5290         click: {
    5291             // For checkbox, fire native event so checked state will be right
    5292             trigger: function() {
    5293                 if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
    5294                     this.click();
    5295                     return false;
    5296                 }
    5297             },
    5298 
    5299             // For cross-browser consistency, don't fire native .click() on links
    5300             _default: function( event ) {
    5301                 return jQuery.nodeName( event.target, "a" );
    5302             }
    5303         },
    5304 
    5305         beforeunload: {
    5306             postDispatch: function( event ) {
    5307 
    5308                 // Even when returnValue equals to undefined Firefox will still show alert
    5309                 if ( event.result !== undefined ) {
    5310                     event.originalEvent.returnValue = event.result;
    5311                 }
    5312             }
    5313         }
    5314     },
    5315 
    5316     simulate: function( type, elem, event, bubble ) {
    5317         // Piggyback on a donor event to simulate a different one.
    5318         // Fake originalEvent to avoid donor's stopPropagation, but if the
    5319         // simulated event prevents default then we do the same on the donor.
    5320         var e = jQuery.extend(
    5321             new jQuery.Event(),
    5322             event,
    5323             {
    5324                 type: type,
    5325                 isSimulated: true,
    5326                 originalEvent: {}
    5327             }
    5328         );
    5329         if ( bubble ) {
    5330             jQuery.event.trigger( e, null, elem );
    5331         } else {
    5332             jQuery.event.dispatch.call( elem, e );
    5333         }
    5334         if ( e.isDefaultPrevented() ) {
    5335             event.preventDefault();
    5336         }
    5337     }
    5338 };
    5339 
    5340 jQuery.removeEvent = document.removeEventListener ?
    5341     function( elem, type, handle ) {
    5342         if ( elem.removeEventListener ) {
    5343             elem.removeEventListener( type, handle, false );
    5344         }
    5345     } :
    5346     function( elem, type, handle ) {
    5347         var name = "on" + type;
    5348 
    5349         if ( elem.detachEvent ) {
    5350 
    5351             // #8545, #7054, preventing memory leaks for custom events in IE6-8
    5352             // detachEvent needed property on element, by name of that event, to properly expose it to GC
    5353             if ( typeof elem[ name ] === core_strundefined ) {
    5354                 elem[ name ] = null;
    5355             }
    5356 
    5357             elem.detachEvent( name, handle );
    5358         }
    5359     };
    5360 
    5361 jQuery.Event = function( src, props ) {
    5362     // Allow instantiation without the 'new' keyword
    5363     if ( !(this instanceof jQuery.Event) ) {
    5364         return new jQuery.Event( src, props );
    5365     }
    5366 
    5367     // Event object
    5368     if ( src && src.type ) {
    5369         this.originalEvent = src;
    5370         this.type = src.type;
    5371 
    5372         // Events bubbling up the document may have been marked as prevented
    5373         // by a handler lower down the tree; reflect the correct value.
    5374         this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
    5375             src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
    5376 
    5377     // Event type
    5378     } else {
    5379         this.type = src;
    5380     }
    5381 
    5382     // Put explicitly provided properties onto the event object
    5383     if ( props ) {
    5384         jQuery.extend( this, props );
    5385     }
    5386 
    5387     // Create a timestamp if incoming event doesn't have one
    5388     this.timeStamp = src && src.timeStamp || jQuery.now();
    5389 
    5390     // Mark it as fixed
    5391     this[ jQuery.expando ] = true;
    5392 };
    5393 
    5394 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
    5395 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
    5396 jQuery.Event.prototype = {
    5397     isDefaultPrevented: returnFalse,
    5398     isPropagationStopped: returnFalse,
    5399     isImmediatePropagationStopped: returnFalse,
    5400 
    5401     preventDefault: function() {
    5402         var e = this.originalEvent;
    5403 
    5404         this.isDefaultPrevented = returnTrue;
    5405         if ( !e ) {
    5406             return;
    5407         }
    5408 
    5409         // If preventDefault exists, run it on the original event
    5410         if ( e.preventDefault ) {
    5411             e.preventDefault();
    5412 
    5413         // Support: IE
    5414         // Otherwise set the returnValue property of the original event to false
    5415         } else {
    5416             e.returnValue = false;
    5417         }
    5418     },
    5419     stopPropagation: function() {
    5420         var e = this.originalEvent;
    5421 
    5422         this.isPropagationStopped = returnTrue;
    5423         if ( !e ) {
    5424             return;
    5425         }
    5426         // If stopPropagation exists, run it on the original event
    5427         if ( e.stopPropagation ) {
    5428             e.stopPropagation();
    5429         }
    5430 
    5431         // Support: IE
    5432         // Set the cancelBubble property of the original event to true
    5433         e.cancelBubble = true;
    5434     },
    5435     stopImmediatePropagation: function() {
    5436         this.isImmediatePropagationStopped = returnTrue;
    5437         this.stopPropagation();
    5438     }
    5439 };
    5440 
    5441 // Create mouseenter/leave events using mouseover/out and event-time checks
    5442 jQuery.each({
    5443     mouseenter: "mouseover",
    5444     mouseleave: "mouseout"
    5445 }, function( orig, fix ) {
    5446     jQuery.event.special[ orig ] = {
    5447         delegateType: fix,
    5448         bindType: fix,
    5449 
    5450         handle: function( event ) {
    5451             var ret,
    5452                 target = this,
    5453                 related = event.relatedTarget,
    5454                 handleObj = event.handleObj;
    5455 
    5456             // For mousenter/leave call the handler if related is outside the target.
    5457             // NB: No relatedTarget if the mouse left/entered the browser window
    5458             if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
    5459                 event.type = handleObj.origType;
    5460                 ret = handleObj.handler.apply( this, arguments );
    5461                 event.type = fix;
    5462             }
    5463             return ret;
    5464         }
    5465     };
    5466 });
    5467 
    5468 // IE submit delegation
    5469 if ( !jQuery.support.submitBubbles ) {
    5470 
    5471     jQuery.event.special.submit = {
    5472         setup: function() {
    5473             // Only need this for delegated form submit events
    5474             if ( jQuery.nodeName( this, "form" ) ) {
    5475                 return false;
    5476             }
    5477 
    5478             // Lazy-add a submit handler when a descendant form may potentially be submitted
    5479             jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
    5480                 // Node name check avoids a VML-related crash in IE (#9807)
    5481                 var elem = e.target,
    5482                     form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
    5483                 if ( form && !jQuery._data( form, "submitBubbles" ) ) {
    5484                     jQuery.event.add( form, "submit._submit", function( event ) {
    5485                         event._submit_bubble = true;
    5486                     });
    5487                     jQuery._data( form, "submitBubbles", true );
    5488                 }
    5489             });
    5490             // return undefined since we don't need an event listener
    5491         },
    5492 
    5493         postDispatch: function( event ) {
    5494             // If form was submitted by the user, bubble the event up the tree
    5495             if ( event._submit_bubble ) {
    5496                 delete event._submit_bubble;
    5497                 if ( this.parentNode && !event.isTrigger ) {
    5498                     jQuery.event.simulate( "submit", this.parentNode, event, true );
    5499                 }
    5500             }
    5501         },
    5502 
    5503         teardown: function() {
    5504             // Only need this for delegated form submit events
    5505             if ( jQuery.nodeName( this, "form" ) ) {
    5506                 return false;
    5507             }
    5508 
    5509             // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
    5510             jQuery.event.remove( this, "._submit" );
    5511         }
    5512     };
    5513 }
    5514 
    5515 // IE change delegation and checkbox/radio fix
    5516 if ( !jQuery.support.changeBubbles ) {
    5517 
    5518     jQuery.event.special.change = {
    5519 
    5520         setup: function() {
    5521 
    5522             if ( rformElems.test( this.nodeName ) ) {
    5523                 // IE doesn't fire change on a check/radio until blur; trigger it on click
    5524                 // after a propertychange. Eat the blur-change in special.change.handle.
    5525                 // This still fires onchange a second time for check/radio after blur.
    5526                 if ( this.type === "checkbox" || this.type === "radio" ) {
    5527                     jQuery.event.add( this, "propertychange._change", function( event ) {
    5528                         if ( event.originalEvent.propertyName === "checked" ) {
    5529                             this._just_changed = true;
    5530                         }
    5531                     });
    5532                     jQuery.event.add( this, "click._change", function( event ) {
    5533                         if ( this._just_changed && !event.isTrigger ) {
    5534                             this._just_changed = false;
    5535                         }
    5536                         // Allow triggered, simulated change events (#11500)
    5537                         jQuery.event.simulate( "change", this, event, true );
    5538                     });
    5539                 }
    5540                 return false;
    5541             }
    5542             // Delegated event; lazy-add a change handler on descendant inputs
    5543             jQuery.event.add( this, "beforeactivate._change", function( e ) {
    5544                 var elem = e.target;
    5545 
    5546                 if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
    5547                     jQuery.event.add( elem, "change._change", function( event ) {
    5548                         if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
    5549                             jQuery.event.simulate( "change", this.parentNode, event, true );
    5550                         }
    5551                     });
    5552                     jQuery._data( elem, "changeBubbles", true );
    5553                 }
    5554             });
    5555         },
    5556 
    5557         handle: function( event ) {
    5558             var elem = event.target;
    5559 
    5560             // Swallow native change events from checkbox/radio, we already triggered them above
    5561             if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
    5562                 return event.handleObj.handler.apply( this, arguments );
    5563             }
    5564         },
    5565 
    5566         teardown: function() {
    5567             jQuery.event.remove( this, "._change" );
    5568 
    5569             return !rformElems.test( this.nodeName );
    5570         }
    5571     };
    5572 }
    5573 
    5574 // Create "bubbling" focus and blur events
    5575 if ( !jQuery.support.focusinBubbles ) {
    5576     jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
    5577 
    5578         // Attach a single capturing handler while someone wants focusin/focusout
    5579         var attaches = 0,
    5580             handler = function( event ) {
    5581                 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
    5582             };
    5583 
    5584         jQuery.event.special[ fix ] = {
    5585             setup: function() {
    5586                 if ( attaches++ === 0 ) {
    5587                     document.addEventListener( orig, handler, true );
    5588                 }
    5589             },
    5590             teardown: function() {
    5591                 if ( --attaches === 0 ) {
    5592                     document.removeEventListener( orig, handler, true );
    5593                 }
    5594             }
    5595         };
    5596     });
    5597 }
    5598 
    5599 jQuery.fn.extend({
    5600 
    5601     on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
    5602         var type, origFn;
    5603 
    5604         // Types can be a map of types/handlers
    5605         if ( typeof types === "object" ) {
    5606             // ( types-Object, selector, data )
    5607             if ( typeof selector !== "string" ) {
    5608                 // ( types-Object, data )
    5609                 data = data || selector;
    5610                 selector = undefined;
    5611             }
    5612             for ( type in types ) {
    5613                 this.on( type, selector, data, types[ type ], one );
    5614             }
    5615             return this;
    5616         }
    5617 
    5618         if ( data == null && fn == null ) {
    5619             // ( types, fn )
    5620             fn = selector;
    5621             data = selector = undefined;
    5622         } else if ( fn == null ) {
    5623             if ( typeof selector === "string" ) {
    5624                 // ( types, selector, fn )
    5625                 fn = data;
    5626                 data = undefined;
    5627             } else {
    5628                 // ( types, data, fn )
    5629                 fn = data;
    5630                 data = selector;
    5631                 selector = undefined;
    5632             }
    5633         }
    5634         if ( fn === false ) {
    5635             fn = returnFalse;
    5636         } else if ( !fn ) {
    5637             return this;
    5638         }
    5639 
    5640         if ( one === 1 ) {
    5641             origFn = fn;
    5642             fn = function( event ) {
    5643                 // Can use an empty set, since event contains the info
    5644                 jQuery().off( event );
    5645                 return origFn.apply( this, arguments );
    5646             };
    5647             // Use same guid so caller can remove using origFn
    5648             fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
    5649         }
    5650         return this.each( function() {
    5651             jQuery.event.add( this, types, fn, data, selector );
    5652         });
    5653     },
    5654     one: function( types, selector, data, fn ) {
    5655         return this.on( types, selector, data, fn, 1 );
    5656     },
    5657     off: function( types, selector, fn ) {
    5658         var handleObj, type;
    5659         if ( types && types.preventDefault && types.handleObj ) {
    5660             // ( event )  dispatched jQuery.Event
    5661             handleObj = types.handleObj;
    5662             jQuery( types.delegateTarget ).off(
    5663                 handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
    5664                 handleObj.selector,
    5665                 handleObj.handler
    5666             );
    5667             return this;
    5668         }
    5669         if ( typeof types === "object" ) {
    5670             // ( types-object [, selector] )
    5671             for ( type in types ) {
    5672                 this.off( type, selector, types[ type ] );
    5673             }
    5674             return this;
    5675         }
    5676         if ( selector === false || typeof selector === "function" ) {
    5677             // ( types [, fn] )
    5678             fn = selector;
    5679             selector = undefined;
    5680         }
    5681         if ( fn === false ) {
    5682             fn = returnFalse;
    5683         }
    5684         return this.each(function() {
    5685             jQuery.event.remove( this, types, fn, selector );
    5686         });
    5687     },
    5688 
    5689     trigger: function( type, data ) {
    5690         return this.each(function() {
    5691             jQuery.event.trigger( type, data, this );
    5692         });
    5693     },
    5694     triggerHandler: function( type, data ) {
    5695         var elem = this[0];
    5696         if ( elem ) {
    5697             return jQuery.event.trigger( type, data, elem, true );
    5698         }
    5699     }
    5700 });
    5701 var isSimple = /^.[^:#\[\.,]*$/,
    5702     rparentsprev = /^(?:parents|prev(?:Until|All))/,
    5703     rneedsContext = jQuery.expr.match.needsContext,
    5704     // methods guaranteed to produce a unique set when starting from a unique set
    5705     guaranteedUnique = {
    5706         children: true,
    5707         contents: true,
    5708         next: true,
    5709         prev: true
    5710     };
    5711 
    5712 jQuery.fn.extend({
    5713     find: function( selector ) {
    5714         var i,
    5715             ret = [],
    5716             self = this,
    5717             len = self.length;
    5718 
    5719         if ( typeof selector !== "string" ) {
    5720             return this.pushStack( jQuery( selector ).filter(function() {
    5721                 for ( i = 0; i < len; i++ ) {
    5722                     if ( jQuery.contains( self[ i ], this ) ) {
    5723                         return true;
    5724                     }
    5725                 }
    5726             }) );
    5727         }
    5728 
    5729         for ( i = 0; i < len; i++ ) {
    5730             jQuery.find( selector, self[ i ], ret );
    5731         }
    5732 
    5733         // Needed because $( selector, context ) becomes $( context ).find( selector )
    5734         ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
    5735         ret.selector = this.selector ? this.selector + " " + selector : selector;
    5736         return ret;
    5737     },
    5738 
    5739     has: function( target ) {
    5740         var i,
    5741             targets = jQuery( target, this ),
    5742             len = targets.length;
    5743 
    5744         return this.filter(function() {
    5745             for ( i = 0; i < len; i++ ) {
    5746                 if ( jQuery.contains( this, targets[i] ) ) {
    5747                     return true;
    5748                 }
    5749             }
    5750         });
    5751     },
    5752 
    5753     not: function( selector ) {
    5754         return this.pushStack( winnow(this, selector || [], true) );
    5755     },
    5756 
    5757     filter: function( selector ) {
    5758         return this.pushStack( winnow(this, selector || [], false) );
    5759     },
    5760 
    5761     is: function( selector ) {
    5762         return !!winnow(
    5763             this,
    5764 
    5765             // If this is a positional/relative selector, check membership in the returned set
    5766             // so $("p:first").is("p:last") won't return true for a doc with two "p".
    5767             typeof selector === "string" && rneedsContext.test( selector ) ?
    5768                 jQuery( selector ) :
    5769                 selector || [],
    5770             false
    5771         ).length;
    5772     },
    5773 
    5774     closest: function( selectors, context ) {
    5775         var cur,
    5776             i = 0,
    5777             l = this.length,
    5778             ret = [],
    5779             pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
    5780                 jQuery( selectors, context || this.context ) :
    5781                 0;
    5782 
    5783         for ( ; i < l; i++ ) {
    5784             for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
    5785                 // Always skip document fragments
    5786                 if ( cur.nodeType < 11 && (pos ?
    5787                     pos.index(cur) > -1 :
    5788 
    5789                     // Don't pass non-elements to Sizzle
    5790                     cur.nodeType === 1 &&
    5791                         jQuery.find.matchesSelector(cur, selectors)) ) {
    5792 
    5793                     cur = ret.push( cur );
    5794                     break;
    5795                 }
    5796             }
    5797         }
    5798 
    5799         return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
    5800     },
    5801 
    5802     // Determine the position of an element within
    5803     // the matched set of elements
    5804     index: function( elem ) {
    5805 
    5806         // No argument, return index in parent
    5807         if ( !elem ) {
    5808             return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
    5809         }
    5810 
    5811         // index in selector
    5812         if ( typeof elem === "string" ) {
    5813             return jQuery.inArray( this[0], jQuery( elem ) );
    5814         }
    5815 
    5816         // Locate the position of the desired element
    5817         return jQuery.inArray(
    5818             // If it receives a jQuery object, the first element is used
    5819             elem.jquery ? elem[0] : elem, this );
    5820     },
    5821 
    5822     add: function( selector, context ) {
    5823         var set = typeof selector === "string" ?
    5824                 jQuery( selector, context ) :
    5825                 jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
    5826             all = jQuery.merge( this.get(), set );
    5827 
    5828         return this.pushStack( jQuery.unique(all) );
    5829     },
    5830 
    5831     addBack: function( selector ) {
    5832         return this.add( selector == null ?
    5833             this.prevObject : this.prevObject.filter(selector)
    5834         );
    5835     }
    5836 });
    5837 
    5838 function sibling( cur, dir ) {
    5839     do {
    5840         cur = cur[ dir ];
    5841     } while ( cur && cur.nodeType !== 1 );
    5842 
    5843     return cur;
    5844 }
    5845 
    5846 jQuery.each({
    5847     parent: function( elem ) {
    5848         var parent = elem.parentNode;
    5849         return parent && parent.nodeType !== 11 ? parent : null;
    5850     },
    5851     parents: function( elem ) {
    5852         return jQuery.dir( elem, "parentNode" );
    5853     },
    5854     parentsUntil: function( elem, i, until ) {
    5855         return jQuery.dir( elem, "parentNode", until );
    5856     },
    5857     next: function( elem ) {
    5858         return sibling( elem, "nextSibling" );
    5859     },
    5860     prev: function( elem ) {
    5861         return sibling( elem, "previousSibling" );
    5862     },
    5863     nextAll: function( elem ) {
    5864         return jQuery.dir( elem, "nextSibling" );
    5865     },
    5866     prevAll: function( elem ) {
    5867         return jQuery.dir( elem, "previousSibling" );
    5868     },
    5869     nextUntil: function( elem, i, until ) {
    5870         return jQuery.dir( elem, "nextSibling", until );
    5871     },
    5872     prevUntil: function( elem, i, until ) {
    5873         return jQuery.dir( elem, "previousSibling", until );
    5874     },
    5875     siblings: function( elem ) {
    5876         return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
    5877     },
    5878     children: function( elem ) {
    5879         return jQuery.sibling( elem.firstChild );
    5880     },
    5881     contents: function( elem ) {
    5882         return jQuery.nodeName( elem, "iframe" ) ?
    5883             elem.contentDocument || elem.contentWindow.document :
    5884             jQuery.merge( [], elem.childNodes );
    5885     }
    5886 }, function( name, fn ) {
    5887     jQuery.fn[ name ] = function( until, selector ) {
    5888         var ret = jQuery.map( this, fn, until );
    5889 
    5890         if ( name.slice( -5 ) !== "Until" ) {
    5891             selector = until;
    5892         }
    5893 
    5894         if ( selector && typeof selector === "string" ) {
    5895             ret = jQuery.filter( selector, ret );
    5896         }
    5897 
    5898         if ( this.length > 1 ) {
    5899             // Remove duplicates
    5900             if ( !guaranteedUnique[ name ] ) {
    5901                 ret = jQuery.unique( ret );
    5902             }
    5903 
    5904             // Reverse order for parents* and prev-derivatives
    5905             if ( rparentsprev.test( name ) ) {
    5906                 ret = ret.reverse();
    5907             }
    5908         }
    5909 
    5910         return this.pushStack( ret );
    5911     };
    5912 });
    5913 
    5914 jQuery.extend({
    5915     filter: function( expr, elems, not ) {
    5916         var elem = elems[ 0 ];
    5917 
    5918         if ( not ) {
    5919             expr = ":not(" + expr + ")";
    5920         }
    5921 
    5922         return elems.length === 1 && elem.nodeType === 1 ?
    5923             jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
    5924             jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
    5925                 return elem.nodeType === 1;
    5926             }));
    5927     },
    5928 
    5929     dir: function( elem, dir, until ) {
    5930         var matched = [],
    5931             cur = elem[ dir ];
    5932 
    5933         while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
    5934             if ( cur.nodeType === 1 ) {
    5935                 matched.push( cur );
    5936             }
    5937             cur = cur[dir];
    5938         }
    5939         return matched;
    5940     },
    5941 
    5942     sibling: function( n, elem ) {
    5943         var r = [];
    5944 
    5945         for ( ; n; n = n.nextSibling ) {
    5946             if ( n.nodeType === 1 && n !== elem ) {
    5947                 r.push( n );
    5948             }
    5949         }
    5950 
    5951         return r;
    5952     }
    5953 });
    5954 
    5955 // Implement the identical functionality for filter and not
    5956 function winnow( elements, qualifier, not ) {
    5957     if ( jQuery.isFunction( qualifier ) ) {
    5958         return jQuery.grep( elements, function( elem, i ) {
    5959             /* jshint -W018 */
    5960             return !!qualifier.call( elem, i, elem ) !== not;
    5961         });
    5962 
    5963     }
    5964 
    5965     if ( qualifier.nodeType ) {
    5966         return jQuery.grep( elements, function( elem ) {
    5967             return ( elem === qualifier ) !== not;
    5968         });
    5969 
    5970     }
    5971 
    5972     if ( typeof qualifier === "string" ) {
    5973         if ( isSimple.test( qualifier ) ) {
    5974             return jQuery.filter( qualifier, elements, not );
    5975         }
    5976 
    5977         qualifier = jQuery.filter( qualifier, elements );
    5978     }
    5979 
    5980     return jQuery.grep( elements, function( elem ) {
    5981         return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
    5982     });
    5983 }
    5984 function createSafeFragment( document ) {
    5985     var list = nodeNames.split( "|" ),
    5986         safeFrag = document.createDocumentFragment();
    5987 
    5988     if ( safeFrag.createElement ) {
    5989         while ( list.length ) {
    5990             safeFrag.createElement(
    5991                 list.pop()
    5992             );
    5993         }
    5994     }
    5995     return safeFrag;
    5996 }
    5997 
    5998 var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
    5999         "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
    6000     rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
    6001     rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
    6002     rleadingWhitespace = /^\s+/,
    6003     rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
    6004     rtagName = /<([\w:]+)/,
    6005     rtbody = /<tbody/i,
    6006     rhtml = /<|&#?\w+;/,
    6007     rnoInnerhtml = /<(?:script|style|link)/i,
    6008     manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
    6009     // checked="checked" or checked
    6010     rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
    6011     rscriptType = /^$|\/(?:java|ecma)script/i,
    6012     rscriptTypeMasked = /^true\/(.*)/,
    6013     rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
    6014 
    6015     // We have to close these tags to support XHTML (#13200)
    6016     wrapMap = {
    6017         option: [ 1, "<select multiple='multiple'>", "</select>" ],
    6018         legend: [ 1, "<fieldset>", "</fieldset>" ],
    6019         area: [ 1, "<map>", "</map>" ],
    6020         param: [ 1, "<object>", "</object>" ],
    6021         thead: [ 1, "<table>", "</table>" ],
    6022         tr: [ 2, "<table><tbody>", "</tbody></table>" ],
    6023         col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
    6024         td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
    6025 
    6026         // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
    6027         // unless wrapped in a div with non-breaking characters in front of it.
    6028         _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
    6029     },
    6030     safeFragment = createSafeFragment( document ),
    6031     fragmentDiv = safeFragment.appendChild( document.createElement("div") );
    6032 
    6033 wrapMap.optgroup = wrapMap.option;
    6034 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
    6035 wrapMap.th = wrapMap.td;
    6036 
    6037 jQuery.fn.extend({
    6038     text: function( value ) {
    6039         return jQuery.access( this, function( value ) {
    6040             return value === undefined ?
    6041                 jQuery.text( this ) :
    6042                 this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
    6043         }, null, value, arguments.length );
    6044     },
    6045 
    6046     append: function() {
    6047         return this.domManip( arguments, function( elem ) {
    6048             if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
    6049                 var target = manipulationTarget( this, elem );
    6050                 target.appendChild( elem );
    6051             }
    6052         });
    6053     },
    6054 
    6055     prepend: function() {
    6056         return this.domManip( arguments, function( elem ) {
    6057             if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
    6058                 var target = manipulationTarget( this, elem );
    6059                 target.insertBefore( elem, target.firstChild );
    6060             }
    6061         });
    6062     },
    6063 
    6064     before: function() {
    6065         return this.domManip( arguments, function( elem ) {
    6066             if ( this.parentNode ) {
    6067                 this.parentNode.insertBefore( elem, this );
    6068             }
    6069         });
    6070     },
    6071 
    6072     after: function() {
    6073         return this.domManip( arguments, function( elem ) {
    6074             if ( this.parentNode ) {
    6075                 this.parentNode.insertBefore( elem, this.nextSibling );
    6076             }
    6077         });
    6078     },
    6079 
    6080     // keepData is for internal use only--do not document
    6081     remove: function( selector, keepData ) {
    6082         var elem,
    6083             elems = selector ? jQuery.filter( selector, this ) : this,
    6084             i = 0;
    6085 
    6086         for ( ; (elem = elems[i]) != null; i++ ) {
    6087 
    6088             if ( !keepData && elem.nodeType === 1 ) {
    6089                 jQuery.cleanData( getAll( elem ) );
    6090             }
    6091 
    6092             if ( elem.parentNode ) {
    6093                 if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
    6094                     setGlobalEval( getAll( elem, "script" ) );
    6095                 }
    6096                 elem.parentNode.removeChild( elem );
    6097             }
    6098         }
    6099 
    6100         return this;
    6101     },
    6102 
    6103     empty: function() {
    6104         var elem,
    6105             i = 0;
    6106 
    6107         for ( ; (elem = this[i]) != null; i++ ) {
    6108             // Remove element nodes and prevent memory leaks
    6109             if ( elem.nodeType === 1 ) {
    6110                 jQuery.cleanData( getAll( elem, false ) );
    6111             }
    6112 
    6113             // Remove any remaining nodes
    6114             while ( elem.firstChild ) {
    6115                 elem.removeChild( elem.firstChild );
    6116             }
    6117 
    6118             // If this is a select, ensure that it displays empty (#12336)
    6119             // Support: IE<9
    6120             if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
    6121                 elem.options.length = 0;
    6122             }
    6123         }
    6124 
    6125         return this;
    6126     },
    6127 
    6128     clone: function( dataAndEvents, deepDataAndEvents ) {
    6129         dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
    6130         deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
    6131 
    6132         return this.map( function () {
    6133             return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
    6134         });
    6135     },
    6136 
    6137     html: function( value ) {
    6138         return jQuery.access( this, function( value ) {
    6139             var elem = this[0] || {},
    6140                 i = 0,
    6141                 l = this.length;
    6142 
    6143             if ( value === undefined ) {
    6144                 return elem.nodeType === 1 ?
    6145                     elem.innerHTML.replace( rinlinejQuery, "" ) :
    6146                     undefined;
    6147             }
    6148 
    6149             // See if we can take a shortcut and just use innerHTML
    6150             if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
    6151                 ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
    6152                 ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
    6153                 !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
    6154 
    6155                 value = value.replace( rxhtmlTag, "<$1></$2>" );
    6156 
    6157                 try {
    6158                     for (; i < l; i++ ) {
    6159                         // Remove element nodes and prevent memory leaks
    6160                         elem = this[i] || {};
    6161                         if ( elem.nodeType === 1 ) {
    6162                             jQuery.cleanData( getAll( elem, false ) );
    6163                             elem.innerHTML = value;
    6164                         }
    6165                     }
    6166 
    6167                     elem = 0;
    6168 
    6169                 // If using innerHTML throws an exception, use the fallback method
    6170                 } catch(e) {}
    6171             }
    6172 
    6173             if ( elem ) {
    6174                 this.empty().append( value );
    6175             }
    6176         }, null, value, arguments.length );
    6177     },
    6178 
    6179     replaceWith: function() {
    6180         var
    6181             // Snapshot the DOM in case .domManip sweeps something relevant into its fragment
    6182             args = jQuery.map( this, function( elem ) {
    6183                 return [ elem.nextSibling, elem.parentNode ];
    6184             }),
    6185             i = 0;
    6186 
    6187         // Make the changes, replacing each context element with the new content
    6188         this.domManip( arguments, function( elem ) {
    6189             var next = args[ i++ ],
    6190                 parent = args[ i++ ];
    6191 
    6192             if ( parent ) {
    6193                 // Don't use the snapshot next if it has moved (#13810)
    6194                 if ( next && next.parentNode !== parent ) {
    6195                     next = this.nextSibling;
    6196                 }
    6197                 jQuery( this ).remove();
    6198                 parent.insertBefore( elem, next );
    6199             }
    6200         // Allow new content to include elements from the context set
    6201         }, true );
    6202 
    6203         // Force removal if there was no new content (e.g., from empty arguments)
    6204         return i ? this : this.remove();
    6205     },
    6206 
    6207     detach: function( selector ) {
    6208         return this.remove( selector, true );
    6209     },
    6210 
    6211     domManip: function( args, callback, allowIntersection ) {
    6212 
    6213         // Flatten any nested arrays
    6214         args = core_concat.apply( [], args );
    6215 
    6216         var first, node, hasScripts,
    6217             scripts, doc, fragment,
    6218             i = 0,
    6219             l = this.length,
    6220             set = this,
    6221             iNoClone = l - 1,
    6222             value = args[0],
    6223             isFunction = jQuery.isFunction( value );
    6224 
    6225         // We can't cloneNode fragments that contain checked, in WebKit
    6226         if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
    6227             return this.each(function( index ) {
    6228                 var self = set.eq( index );
    6229                 if ( isFunction ) {
    6230                     args[0] = value.call( this, index, self.html() );
    6231                 }
    6232                 self.domManip( args, callback, allowIntersection );
    6233             });
    6234         }
    6235 
    6236         if ( l ) {
    6237             fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
    6238             first = fragment.firstChild;
    6239 
    6240             if ( fragment.childNodes.length === 1 ) {
    6241                 fragment = first;
    6242             }
    6243 
    6244             if ( first ) {
    6245                 scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
    6246                 hasScripts = scripts.length;
    6247 
    6248                 // Use the original fragment for the last item instead of the first because it can end up
    6249                 // being emptied incorrectly in certain situations (#8070).
    6250                 for ( ; i < l; i++ ) {
    6251                     node = fragment;
    6252 
    6253                     if ( i !== iNoClone ) {
    6254                         node = jQuery.clone( node, true, true );
    6255 
    6256                         // Keep references to cloned scripts for later restoration
    6257                         if ( hasScripts ) {
    6258                             jQuery.merge( scripts, getAll( node, "script" ) );
    6259                         }
    6260                     }
    6261 
    6262                     callback.call( this[i], node, i );
    6263                 }
    6264 
    6265                 if ( hasScripts ) {
    6266                     doc = scripts[ scripts.length - 1 ].ownerDocument;
    6267 
    6268                     // Reenable scripts
    6269                     jQuery.map( scripts, restoreScript );
    6270 
    6271                     // Evaluate executable scripts on first document insertion
    6272                     for ( i = 0; i < hasScripts; i++ ) {
    6273                         node = scripts[ i ];
    6274                         if ( rscriptType.test( node.type || "" ) &&
    6275                             !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
    6276 
    6277                             if ( node.src ) {
    6278                                 // Hope ajax is available...
    6279                                 jQuery._evalUrl( node.src );
    6280                             } else {
    6281                                 jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
    6282                             }
    6283                         }
    6284                     }
    6285                 }
    6286 
    6287                 // Fix #11809: Avoid leaking memory
    6288                 fragment = first = null;
    6289             }
    6290         }
    6291 
    6292         return this;
    6293     }
    6294 });
    6295 
    6296 // Support: IE<8
    6297 // Manipulating tables requires a tbody
    6298 function manipulationTarget( elem, content ) {
    6299     return jQuery.nodeName( elem, "table" ) &&
    6300         jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
    6301 
    6302         elem.getElementsByTagName("tbody")[0] ||
    6303             elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
    6304         elem;
    6305 }
    6306 
    6307 // Replace/restore the type attribute of script elements for safe DOM manipulation
    6308 function disableScript( elem ) {
    6309     elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
    6310     return elem;
    6311 }
    6312 function restoreScript( elem ) {
    6313     var match = rscriptTypeMasked.exec( elem.type );
    6314     if ( match ) {
    6315         elem.type = match[1];
    6316     } else {
    6317         elem.removeAttribute("type");
    6318     }
    6319     return elem;
    6320 }
    6321 
    6322 // Mark scripts as having already been evaluated
    6323 function setGlobalEval( elems, refElements ) {
    6324     var elem,
    6325         i = 0;
    6326     for ( ; (elem = elems[i]) != null; i++ ) {
    6327         jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
    6328     }
    6329 }
    6330 
    6331 function cloneCopyEvent( src, dest ) {
    6332 
    6333     if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
    6334         return;
    6335     }
    6336 
    6337     var type, i, l,
    6338         oldData = jQuery._data( src ),
    6339         curData = jQuery._data( dest, oldData ),
    6340         events = oldData.events;
    6341 
    6342     if ( events ) {
    6343         delete curData.handle;
    6344         curData.events = {};
    6345 
    6346         for ( type in events ) {
    6347             for ( i = 0, l = events[ type ].length; i < l; i++ ) {
    6348                 jQuery.event.add( dest, type, events[ type ][ i ] );
    6349             }
    6350         }
    6351     }
    6352 
    6353     // make the cloned public data object a copy from the original
    6354     if ( curData.data ) {
    6355         curData.data = jQuery.extend( {}, curData.data );
    6356     }
    6357 }
    6358 
    6359 function fixCloneNodeIssues( src, dest ) {
    6360     var nodeName, e, data;
    6361 
    6362     // We do not need to do anything for non-Elements
    6363     if ( dest.nodeType !== 1 ) {
    6364         return;
    6365     }
    6366 
    6367     nodeName = dest.nodeName.toLowerCase();
    6368 
    6369     // IE6-8 copies events bound via attachEvent when using cloneNode.
    6370     if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
    6371         data = jQuery._data( dest );
    6372 
    6373         for ( e in data.events ) {
    6374             jQuery.removeEvent( dest, e, data.handle );
    6375         }
    6376 
    6377         // Event data gets referenced instead of copied if the expando gets copied too
    6378         dest.removeAttribute( jQuery.expando );
    6379     }
    6380 
    6381     // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
    6382     if ( nodeName === "script" && dest.text !== src.text ) {
    6383         disableScript( dest ).text = src.text;
    6384         restoreScript( dest );
    6385 
    6386     // IE6-10 improperly clones children of object elements using classid.
    6387     // IE10 throws NoModificationAllowedError if parent is null, #12132.
    6388     } else if ( nodeName === "object" ) {
    6389         if ( dest.parentNode ) {
    6390             dest.outerHTML = src.outerHTML;
    6391         }
    6392 
    6393         // This path appears unavoidable for IE9. When cloning an object
    6394         // element in IE9, the outerHTML strategy above is not sufficient.
    6395         // If the src has innerHTML and the destination does not,
    6396         // copy the src.innerHTML into the dest.innerHTML. #10324
    6397         if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
    6398             dest.innerHTML = src.innerHTML;
    6399         }
    6400 
    6401     } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
    6402         // IE6-8 fails to persist the checked state of a cloned checkbox
    6403         // or radio button. Worse, IE6-7 fail to give the cloned element
    6404         // a checked appearance if the defaultChecked value isn't also set
    6405 
    6406         dest.defaultChecked = dest.checked = src.checked;
    6407 
    6408         // IE6-7 get confused and end up setting the value of a cloned
    6409         // checkbox/radio button to an empty string instead of "on"
    6410         if ( dest.value !== src.value ) {
    6411             dest.value = src.value;
    6412         }
    6413 
    6414     // IE6-8 fails to return the selected option to the default selected
    6415     // state when cloning options
    6416     } else if ( nodeName === "option" ) {
    6417         dest.defaultSelected = dest.selected = src.defaultSelected;
    6418 
    6419     // IE6-8 fails to set the defaultValue to the correct value when
    6420     // cloning other types of input fields
    6421     } else if ( nodeName === "input" || nodeName === "textarea" ) {
    6422         dest.defaultValue = src.defaultValue;
    6423     }
    6424 }
    6425 
    6426 jQuery.each({
    6427     appendTo: "append",
    6428     prependTo: "prepend",
    6429     insertBefore: "before",
    6430     insertAfter: "after",
    6431     replaceAll: "replaceWith"
    6432 }, function( name, original ) {
    6433     jQuery.fn[ name ] = function( selector ) {
    6434         var elems,
    6435             i = 0,
    6436             ret = [],
    6437             insert = jQuery( selector ),
    6438             last = insert.length - 1;
    6439 
    6440         for ( ; i <= last; i++ ) {
    6441             elems = i === last ? this : this.clone(true);
    6442             jQuery( insert[i] )[ original ]( elems );
    6443 
    6444             // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
    6445             core_push.apply( ret, elems.get() );
    6446         }
    6447 
    6448         return this.pushStack( ret );
    6449     };
    6450 });
    6451 
    6452 function getAll( context, tag ) {
    6453     var elems, elem,
    6454         i = 0,
    6455         found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
    6456             typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
    6457             undefined;
    6458 
    6459     if ( !found ) {
    6460         for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
    6461             if ( !tag || jQuery.nodeName( elem, tag ) ) {
    6462                 found.push( elem );
    6463             } else {
    6464                 jQuery.merge( found, getAll( elem, tag ) );
    6465             }
    6466         }
    6467     }
    6468 
    6469     return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
    6470         jQuery.merge( [ context ], found ) :
    6471         found;
    6472 }
    6473 
    6474 // Used in buildFragment, fixes the defaultChecked property
    6475 function fixDefaultChecked( elem ) {
    6476     if ( manipulation_rcheckableType.test( elem.type ) ) {
    6477         elem.defaultChecked = elem.checked;
    6478     }
    6479 }
    6480 
    6481 jQuery.extend({
    6482     clone: function( elem, dataAndEvents, deepDataAndEvents ) {
    6483         var destElements, node, clone, i, srcElements,
    6484             inPage = jQuery.contains( elem.ownerDocument, elem );
    6485 
    6486         if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
    6487             clone = elem.cloneNode( true );
    6488 
    6489         // IE<=8 does not properly clone detached, unknown element nodes
    6490         } else {
    6491             fragmentDiv.innerHTML = elem.outerHTML;
    6492             fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
    6493         }
    6494 
    6495         if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
    6496                 (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
    6497 
    6498             // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
    6499             destElements = getAll( clone );
    6500             srcElements = getAll( elem );
    6501 
    6502             // Fix all IE cloning issues
    6503             for ( i = 0; (node = srcElements[i]) != null; ++i ) {
    6504                 // Ensure that the destination node is not null; Fixes #9587
    6505                 if ( destElements[i] ) {
    6506                     fixCloneNodeIssues( node, destElements[i] );
    6507                 }
    6508             }
    6509         }
    6510 
    6511         // Copy the events from the original to the clone
    6512         if ( dataAndEvents ) {
    6513             if ( deepDataAndEvents ) {
    6514                 srcElements = srcElements || getAll( elem );
    6515                 destElements = destElements || getAll( clone );
    6516 
    6517                 for ( i = 0; (node = srcElements[i]) != null; i++ ) {
    6518                     cloneCopyEvent( node, destElements[i] );
    6519                 }
    6520             } else {
    6521                 cloneCopyEvent( elem, clone );
    6522             }
    6523         }
    6524 
    6525         // Preserve script evaluation history
    6526         destElements = getAll( clone, "script" );
    6527         if ( destElements.length > 0 ) {
    6528             setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
    6529         }
    6530 
    6531         destElements = srcElements = node = null;
    6532 
    6533         // Return the cloned set
    6534         return clone;
    6535     },
    6536 
    6537     buildFragment: function( elems, context, scripts, selection ) {
    6538         var j, elem, contains,
    6539             tmp, tag, tbody, wrap,
    6540             l = elems.length,
    6541 
    6542             // Ensure a safe fragment
    6543             safe = createSafeFragment( context ),
    6544 
    6545             nodes = [],
    6546             i = 0;
    6547 
    6548         for ( ; i < l; i++ ) {
    6549             elem = elems[ i ];
    6550 
    6551             if ( elem || elem === 0 ) {
    6552 
    6553                 // Add nodes directly
    6554                 if ( jQuery.type( elem ) === "object" ) {
    6555                     jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
    6556 
    6557                 // Convert non-html into a text node
    6558                 } else if ( !rhtml.test( elem ) ) {
    6559                     nodes.push( context.createTextNode( elem ) );
    6560 
    6561                 // Convert html into DOM nodes
    6562                 } else {
    6563                     tmp = tmp || safe.appendChild( context.createElement("div") );
    6564 
    6565                     // Deserialize a standard representation
    6566                     tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
    6567                     wrap = wrapMap[ tag ] || wrapMap._default;
    6568 
    6569                     tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
    6570 
    6571                     // Descend through wrappers to the right content
    6572                     j = wrap[0];
    6573                     while ( j-- ) {
    6574                         tmp = tmp.lastChild;
    6575                     }
    6576 
    6577                     // Manually add leading whitespace removed by IE
    6578                     if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
    6579                         nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
    6580                     }
    6581 
    6582                     // Remove IE's autoinserted <tbody> from table fragments
    6583                     if ( !jQuery.support.tbody ) {
    6584 
    6585                         // String was a <table>, *may* have spurious <tbody>
    6586                         elem = tag === "table" && !rtbody.test( elem ) ?
    6587                             tmp.firstChild :
    6588 
    6589                             // String was a bare <thead> or <tfoot>
    6590                             wrap[1] === "<table>" && !rtbody.test( elem ) ?
    6591                                 tmp :
    6592                                 0;
    6593 
    6594                         j = elem && elem.childNodes.length;
    6595                         while ( j-- ) {
    6596                             if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
    6597                                 elem.removeChild( tbody );
    6598                             }
    6599                         }
    6600                     }
    6601 
    6602                     jQuery.merge( nodes, tmp.childNodes );
    6603 
    6604                     // Fix #12392 for WebKit and IE > 9
    6605                     tmp.textContent = "";
    6606 
    6607                     // Fix #12392 for oldIE
    6608                     while ( tmp.firstChild ) {
    6609                         tmp.removeChild( tmp.firstChild );
    6610                     }
    6611 
    6612                     // Remember the top-level container for proper cleanup
    6613                     tmp = safe.lastChild;
    6614                 }
    6615             }
    6616         }
    6617 
    6618         // Fix #11356: Clear elements from fragment
    6619         if ( tmp ) {
    6620             safe.removeChild( tmp );
    6621         }
    6622 
    6623         // Reset defaultChecked for any radios and checkboxes
    6624         // about to be appended to the DOM in IE 6/7 (#8060)
    6625         if ( !jQuery.support.appendChecked ) {
    6626             jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
    6627         }
    6628 
    6629         i = 0;
    6630         while ( (elem = nodes[ i++ ]) ) {
    6631 
    6632             // #4087 - If origin and destination elements are the same, and this is
    6633             // that element, do not do anything
    6634             if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
    6635                 continue;
    6636             }
    6637 
    6638             contains = jQuery.contains( elem.ownerDocument, elem );
    6639 
    6640             // Append to fragment
    6641             tmp = getAll( safe.appendChild( elem ), "script" );
    6642 
    6643             // Preserve script evaluation history
    6644             if ( contains ) {
    6645                 setGlobalEval( tmp );
    6646             }
    6647 
    6648             // Capture executables
    6649             if ( scripts ) {
    6650                 j = 0;
    6651                 while ( (elem = tmp[ j++ ]) ) {
    6652                     if ( rscriptType.test( elem.type || "" ) ) {
    6653                         scripts.push( elem );
    6654                     }
    6655                 }
    6656             }
    6657         }
    6658 
    6659         tmp = null;
    6660 
    6661         return safe;
    6662     },
    6663 
    6664     cleanData: function( elems, /* internal */ acceptData ) {
    6665         var elem, type, id, data,
    6666             i = 0,
    6667             internalKey = jQuery.expando,
    6668             cache = jQuery.cache,
    6669             deleteExpando = jQuery.support.deleteExpando,
    6670             special = jQuery.event.special;
    6671 
    6672         for ( ; (elem = elems[i]) != null; i++ ) {
    6673 
    6674             if ( acceptData || jQuery.acceptData( elem ) ) {
    6675 
    6676                 id = elem[ internalKey ];
    6677                 data = id && cache[ id ];
    6678 
    6679                 if ( data ) {
    6680                     if ( data.events ) {
    6681                         for ( type in data.events ) {
    6682                             if ( special[ type ] ) {
    6683                                 jQuery.event.remove( elem, type );
    6684 
    6685                             // This is a shortcut to avoid jQuery.event.remove's overhead
    6686                             } else {
    6687                                 jQuery.removeEvent( elem, type, data.handle );
    6688                             }
    6689                         }
    6690                     }
    6691 
    6692                     // Remove cache only if it was not already removed by jQuery.event.remove
    6693                     if ( cache[ id ] ) {
    6694 
    6695                         delete cache[ id ];
    6696 
    6697                         // IE does not allow us to delete expando properties from nodes,
    6698                         // nor does it have a removeAttribute function on Document nodes;
    6699                         // we must handle all of these cases
    6700                         if ( deleteExpando ) {
    6701                             delete elem[ internalKey ];
    6702 
    6703                         } else if ( typeof elem.removeAttribute !== core_strundefined ) {
    6704                             elem.removeAttribute( internalKey );
    6705 
    6706                         } else {
    6707                             elem[ internalKey ] = null;
    6708                         }
    6709 
    6710                         core_deletedIds.push( id );
    6711                     }
    6712                 }
    6713             }
    6714         }
    6715     },
    6716 
    6717     _evalUrl: function( url ) {
    6718         return jQuery.ajax({
    6719             url: url,
    6720             type: "GET",
    6721             dataType: "script",
    6722             async: false,
    6723             global: false,
    6724             "throws": true
    6725         });
    6726     }
    6727 });
    6728 jQuery.fn.extend({
    6729     wrapAll: function( html ) {
    6730         if ( jQuery.isFunction( html ) ) {
    6731             return this.each(function(i) {
    6732                 jQuery(this).wrapAll( html.call(this, i) );
    6733             });
    6734         }
    6735 
    6736         if ( this[0] ) {
    6737             // The elements to wrap the target around
    6738             var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
    6739 
    6740             if ( this[0].parentNode ) {
    6741                 wrap.insertBefore( this[0] );
    6742             }
    6743 
    6744             wrap.map(function() {
    6745                 var elem = this;
    6746 
    6747                 while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
    6748                     elem = elem.firstChild;
    6749                 }
    6750 
    6751                 return elem;
    6752             }).append( this );
    6753         }
    6754 
    6755         return this;
    6756     },
    6757 
    6758     wrapInner: function( html ) {
    6759         if ( jQuery.isFunction( html ) ) {
    6760             return this.each(function(i) {
    6761                 jQuery(this).wrapInner( html.call(this, i) );
    6762             });
    6763         }
    6764 
    6765         return this.each(function() {
    6766             var self = jQuery( this ),
    6767                 contents = self.contents();
    6768 
    6769             if ( contents.length ) {
    6770                 contents.wrapAll( html );
    6771 
    6772             } else {
    6773                 self.append( html );
    6774             }
    6775         });
    6776     },
    6777 
    6778     wrap: function( html ) {
    6779         var isFunction = jQuery.isFunction( html );
    6780 
    6781         return this.each(function(i) {
    6782             jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
    6783         });
    6784     },
    6785 
    6786     unwrap: function() {
    6787         return this.parent().each(function() {
    6788             if ( !jQuery.nodeName( this, "body" ) ) {
    6789                 jQuery( this ).replaceWith( this.childNodes );
    6790             }
    6791         }).end();
    6792     }
    6793 });
    6794 var iframe, getStyles, curCSS,
    6795     ralpha = /alpha\([^)]*\)/i,
    6796     ropacity = /opacity\s*=\s*([^)]*)/,
    6797     rposition = /^(top|right|bottom|left)$/,
    6798     // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
    6799     // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
    6800     rdisplayswap = /^(none|table(?!-c[ea]).+)/,
    6801     rmargin = /^margin/,
    6802     rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
    6803     rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
    6804     rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
    6805     elemdisplay = { BODY: "block" },
    6806 
    6807     cssShow = { position: "absolute", visibility: "hidden", display: "block" },
    6808     cssNormalTransform = {
    6809         letterSpacing: 0,
    6810         fontWeight: 400
    6811     },
    6812 
    6813     cssExpand = [ "Top", "Right", "Bottom", "Left" ],
    6814     cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
    6815 
    6816 // return a css property mapped to a potentially vendor prefixed property
    6817 function vendorPropName( style, name ) {
    6818 
    6819     // shortcut for names that are not vendor prefixed
    6820     if ( name in style ) {
    6821         return name;
    6822     }
    6823 
    6824     // check for vendor prefixed names
    6825     var capName = name.charAt(0).toUpperCase() + name.slice(1),
    6826         origName = name,
    6827         i = cssPrefixes.length;
    6828 
    6829     while ( i-- ) {
    6830         name = cssPrefixes[ i ] + capName;
    6831         if ( name in style ) {
    6832             return name;
    6833         }
    6834     }
    6835 
    6836     return origName;
    6837 }
    6838 
    6839 function isHidden( elem, el ) {
    6840     // isHidden might be called from jQuery#filter function;
    6841     // in that case, element will be second argument
    6842     elem = el || elem;
    6843     return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
    6844 }
    6845 
    6846 function showHide( elements, show ) {
    6847     var display, elem, hidden,
    6848         values = [],
    6849         index = 0,
    6850         length = elements.length;
    6851 
    6852     for ( ; index < length; index++ ) {
    6853         elem = elements[ index ];
    6854         if ( !elem.style ) {
    6855             continue;
    6856         }
    6857 
    6858         values[ index ] = jQuery._data( elem, "olddisplay" );
    6859         display = elem.style.display;
    6860         if ( show ) {
    6861             // Reset the inline display of this element to learn if it is
    6862             // being hidden by cascaded rules or not
    6863             if ( !values[ index ] && display === "none" ) {
    6864                 elem.style.display = "";
    6865             }
    6866 
    6867             // Set elements which have been overridden with display: none
    6868             // in a stylesheet to whatever the default browser style is
    6869             // for such an element
    6870             if ( elem.style.display === "" && isHidden( elem ) ) {
    6871                 values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
    6872             }
    6873         } else {
    6874 
    6875             if ( !values[ index ] ) {
    6876                 hidden = isHidden( elem );
    6877 
    6878                 if ( display && display !== "none" || !hidden ) {
    6879                     jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
    6880                 }
    6881             }
    6882         }
    6883     }
    6884 
    6885     // Set the display of most of the elements in a second loop
    6886     // to avoid the constant reflow
    6887     for ( index = 0; index < length; index++ ) {
    6888         elem = elements[ index ];
    6889         if ( !elem.style ) {
    6890             continue;
    6891         }
    6892         if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
    6893             elem.style.display = show ? values[ index ] || "" : "none";
    6894         }
    6895     }
    6896 
    6897     return elements;
    6898 }
    6899 
    6900 jQuery.fn.extend({
    6901     css: function( name, value ) {
    6902         return jQuery.access( this, function( elem, name, value ) {
    6903             var len, styles,
    6904                 map = {},
    6905                 i = 0;
    6906 
    6907             if ( jQuery.isArray( name ) ) {
    6908                 styles = getStyles( elem );
    6909                 len = name.length;
    6910 
    6911                 for ( ; i < len; i++ ) {
    6912                     map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
    6913                 }
    6914 
    6915                 return map;
    6916             }
    6917 
    6918             return value !== undefined ?
    6919                 jQuery.style( elem, name, value ) :
    6920                 jQuery.css( elem, name );
    6921         }, name, value, arguments.length > 1 );
    6922     },
    6923     show: function() {
    6924         return showHide( this, true );
    6925     },
    6926     hide: function() {
    6927         return showHide( this );
    6928     },
    6929     toggle: function( state ) {
    6930         if ( typeof state === "boolean" ) {
    6931             return state ? this.show() : this.hide();
    6932         }
    6933 
    6934         return this.each(function() {
    6935             if ( isHidden( this ) ) {
    6936                 jQuery( this ).show();
    6937             } else {
    6938                 jQuery( this ).hide();
    6939             }
    6940         });
    6941     }
    6942 });
    6943 
    6944 jQuery.extend({
    6945     // Add in style property hooks for overriding the default
    6946     // behavior of getting and setting a style property
    6947     cssHooks: {
    6948         opacity: {
    6949             get: function( elem, computed ) {
    6950                 if ( computed ) {
    6951                     // We should always get a number back from opacity
    6952                     var ret = curCSS( elem, "opacity" );
    6953                     return ret === "" ? "1" : ret;
    6954                 }
    6955             }
    6956         }
    6957     },
    6958 
    6959     // Don't automatically add "px" to these possibly-unitless properties
    6960     cssNumber: {
    6961         "columnCount": true,
    6962         "fillOpacity": true,
    6963         "fontWeight": true,
    6964         "lineHeight": true,
    6965         "opacity": true,
    6966         "order": true,
    6967         "orphans": true,
    6968         "widows": true,
    6969         "zIndex": true,
    6970         "zoom": true
    6971     },
    6972 
    6973     // Add in properties whose names you wish to fix before
    6974     // setting or getting the value
    6975     cssProps: {
    6976         // normalize float css property
    6977         "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
    6978     },
    6979 
    6980     // Get and set the style property on a DOM Node
    6981     style: function( elem, name, value, extra ) {
    6982         // Don't set styles on text and comment nodes
    6983         if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
    6984             return;
    6985         }
    6986 
    6987         // Make sure that we're working with the right name
    6988         var ret, type, hooks,
    6989             origName = jQuery.camelCase( name ),
    6990             style = elem.style;
    6991 
    6992         name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
    6993 
    6994         // gets hook for the prefixed version
    6995         // followed by the unprefixed version
    6996         hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
    6997 
    6998         // Check if we're setting a value
    6999         if ( value !== undefined ) {
    7000             type = typeof value;
    7001 
    7002             // convert relative number strings (+= or -=) to relative numbers. #7345
    7003             if ( type === "string" && (ret = rrelNum.exec( value )) ) {
    7004                 value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
    7005                 // Fixes bug #9237
    7006                 type = "number";
    7007             }
    7008 
    7009             // Make sure that NaN and null values aren't set. See: #7116
    7010             if ( value == null || type === "number" && isNaN( value ) ) {
    7011                 return;
    7012             }
    7013 
    7014             // If a number was passed in, add 'px' to the (except for certain CSS properties)
    7015             if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
    7016                 value += "px";
    7017             }
    7018 
    7019             // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
    7020             // but it would mean to define eight (for every problematic property) identical functions
    7021             if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
    7022                 style[ name ] = "inherit";
    7023             }
    7024 
    7025             // If a hook was provided, use that value, otherwise just set the specified value
    7026             if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
    7027 
    7028                 // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
    7029                 // Fixes bug #5509
    7030                 try {
    7031                     style[ name ] = value;
    7032                 } catch(e) {}
    7033             }
    7034 
    7035         } else {
    7036             // If a hook was provided get the non-computed value from there
    7037             if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
    7038                 return ret;
    7039             }
    7040 
    7041             // Otherwise just get the value from the style object
    7042             return style[ name ];
    7043         }
    7044     },
    7045 
    7046     css: function( elem, name, extra, styles ) {
    7047         var num, val, hooks,
    7048             origName = jQuery.camelCase( name );
    7049 
    7050         // Make sure that we're working with the right name
    7051         name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
    7052 
    7053         // gets hook for the prefixed version
    7054         // followed by the unprefixed version
    7055         hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
    7056 
    7057         // If a hook was provided get the computed value from there
    7058         if ( hooks && "get" in hooks ) {
    7059             val = hooks.get( elem, true, extra );
    7060         }
    7061 
    7062         // Otherwise, if a way to get the computed value exists, use that
    7063         if ( val === undefined ) {
    7064             val = curCSS( elem, name, styles );
    7065         }
    7066 
    7067         //convert "normal" to computed value
    7068         if ( val === "normal" && name in cssNormalTransform ) {
    7069             val = cssNormalTransform[ name ];
    7070         }
    7071 
    7072         // Return, converting to number if forced or a qualifier was provided and val looks numeric
    7073         if ( extra === "" || extra ) {
    7074             num = parseFloat( val );
    7075             return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
    7076         }
    7077         return val;
    7078     }
    7079 });
    7080 
    7081 // NOTE: we've included the "window" in window.getComputedStyle
    7082 // because jsdom on node.js will break without it.
    7083 if ( window.getComputedStyle ) {
    7084     getStyles = function( elem ) {
    7085         return window.getComputedStyle( elem, null );
    7086     };
    7087 
    7088     curCSS = function( elem, name, _computed ) {
    7089         var width, minWidth, maxWidth,
    7090             computed = _computed || getStyles( elem ),
    7091 
    7092             // getPropertyValue is only needed for .css('filter') in IE9, see #12537
    7093             ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
    7094             style = elem.style;
    7095 
    7096         if ( computed ) {
    7097 
    7098             if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
    7099                 ret = jQuery.style( elem, name );
    7100             }
    7101 
    7102             // A tribute to the "awesome hack by Dean Edwards"
    7103             // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
    7104             // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
    7105             // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
    7106             if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
    7107 
    7108                 // Remember the original values
    7109                 width = style.width;
    7110                 minWidth = style.minWidth;
    7111                 maxWidth = style.maxWidth;
    7112 
    7113                 // Put in the new values to get a computed value out
    7114                 style.minWidth = style.maxWidth = style.width = ret;
    7115                 ret = computed.width;
    7116 
    7117                 // Revert the changed values
    7118                 style.width = width;
    7119                 style.minWidth = minWidth;
    7120                 style.maxWidth = maxWidth;
    7121             }
    7122         }
    7123 
    7124         return ret;
    7125     };
    7126 } else if ( document.documentElement.currentStyle ) {
    7127     getStyles = function( elem ) {
    7128         return elem.currentStyle;
    7129     };
    7130 
    7131     curCSS = function( elem, name, _computed ) {
    7132         var left, rs, rsLeft,
    7133             computed = _computed || getStyles( elem ),
    7134             ret = computed ? computed[ name ] : undefined,
    7135             style = elem.style;
    7136 
    7137         // Avoid setting ret to empty string here
    7138         // so we don't default to auto
    7139         if ( ret == null && style && style[ name ] ) {
    7140             ret = style[ name ];
    7141         }
    7142 
    7143         // From the awesome hack by Dean Edwards
    7144         // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
    7145 
    7146         // If we're not dealing with a regular pixel number
    7147         // but a number that has a weird ending, we need to convert it to pixels
    7148         // but not position css attributes, as those are proportional to the parent element instead
    7149         // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
    7150         if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
    7151 
    7152             // Remember the original values
    7153             left = style.left;
    7154             rs = elem.runtimeStyle;
    7155             rsLeft = rs && rs.left;
    7156 
    7157             // Put in the new values to get a computed value out
    7158             if ( rsLeft ) {
    7159                 rs.left = elem.currentStyle.left;
    7160             }
    7161             style.left = name === "fontSize" ? "1em" : ret;
    7162             ret = style.pixelLeft + "px";
    7163 
    7164             // Revert the changed values
    7165             style.left = left;
    7166             if ( rsLeft ) {
    7167                 rs.left = rsLeft;
    7168             }
    7169         }
    7170 
    7171         return ret === "" ? "auto" : ret;
    7172     };
    7173 }
    7174 
    7175 function setPositiveNumber( elem, value, subtract ) {
    7176     var matches = rnumsplit.exec( value );
    7177     return matches ?
    7178         // Guard against undefined "subtract", e.g., when used as in cssHooks
    7179         Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
    7180         value;
    7181 }
    7182 
    7183 function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
    7184     var i = extra === ( isBorderBox ? "border" : "content" ) ?
    7185         // If we already have the right measurement, avoid augmentation
    7186         4 :
    7187         // Otherwise initialize for horizontal or vertical properties
    7188         name === "width" ? 1 : 0,
    7189 
    7190         val = 0;
    7191 
    7192     for ( ; i < 4; i += 2 ) {
    7193         // both box models exclude margin, so add it if we want it
    7194         if ( extra === "margin" ) {
    7195             val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
    7196         }
    7197 
    7198         if ( isBorderBox ) {
    7199             // border-box includes padding, so remove it if we want content
    7200             if ( extra === "content" ) {
    7201                 val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
    7202             }
    7203 
    7204             // at this point, extra isn't border nor margin, so remove border
    7205             if ( extra !== "margin" ) {
    7206                 val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
    7207             }
    7208         } else {
    7209             // at this point, extra isn't content, so add padding
    7210             val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
    7211 
    7212             // at this point, extra isn't content nor padding, so add border
    7213             if ( extra !== "padding" ) {
    7214                 val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
    7215             }
    7216         }
    7217     }
    7218 
    7219     return val;
    7220 }
    7221 
    7222 function getWidthOrHeight( elem, name, extra ) {
    7223 
    7224     // Start with offset property, which is equivalent to the border-box value
    7225     var valueIsBorderBox = true,
    7226         val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
    7227         styles = getStyles( elem ),
    7228         isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
    7229 
    7230     // some non-html elements return undefined for offsetWidth, so check for null/undefined
    7231     // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
    7232     // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
    7233     if ( val <= 0 || val == null ) {
    7234         // Fall back to computed then uncomputed css if necessary
    7235         val = curCSS( elem, name, styles );
    7236         if ( val < 0 || val == null ) {
    7237             val = elem.style[ name ];
    7238         }
    7239 
    7240         // Computed unit is not pixels. Stop here and return.
    7241         if ( rnumnonpx.test(val) ) {
    7242             return val;
    7243         }
    7244 
    7245         // we need the check for style in case a browser which returns unreliable values
    7246         // for getComputedStyle silently falls back to the reliable elem.style
    7247         valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
    7248 
    7249         // Normalize "", auto, and prepare for extra
    7250         val = parseFloat( val ) || 0;
    7251     }
    7252 
    7253     // use the active box-sizing model to add/subtract irrelevant styles
    7254     return ( val +
    7255         augmentWidthOrHeight(
    7256             elem,
    7257             name,
    7258             extra || ( isBorderBox ? "border" : "content" ),
    7259             valueIsBorderBox,
    7260             styles
    7261         )
    7262     ) + "px";
    7263 }
    7264 
    7265 // Try to determine the default display value of an element
    7266 function css_defaultDisplay( nodeName ) {
    7267     var doc = document,
    7268         display = elemdisplay[ nodeName ];
    7269 
    7270     if ( !display ) {
    7271         display = actualDisplay( nodeName, doc );
    7272 
    7273         // If the simple way fails, read from inside an iframe
    7274         if ( display === "none" || !display ) {
    7275             // Use the already-created iframe if possible
    7276             iframe = ( iframe ||
    7277                 jQuery("<iframe frameborder='0' width='0' height='0'/>")
    7278                 .css( "cssText", "display:block !important" )
    7279             ).appendTo( doc.documentElement );
    7280 
    7281             // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
    7282             doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
    7283             doc.write("<!doctype html><html><body>");
    7284             doc.close();
    7285 
    7286             display = actualDisplay( nodeName, doc );
    7287             iframe.detach();
    7288         }
    7289 
    7290         // Store the correct default display
    7291         elemdisplay[ nodeName ] = display;
    7292     }
    7293 
    7294     return display;
    7295 }
    7296 
    7297 // Called ONLY from within css_defaultDisplay
    7298 function actualDisplay( name, doc ) {
    7299     var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
    7300         display = jQuery.css( elem[0], "display" );
    7301     elem.remove();
    7302     return display;
    7303 }
    7304 
    7305 jQuery.each([ "height", "width" ], function( i, name ) {
    7306     jQuery.cssHooks[ name ] = {
    7307         get: function( elem, computed, extra ) {
    7308             if ( computed ) {
    7309                 // certain elements can have dimension info if we invisibly show them
    7310                 // however, it must have a current display style that would benefit from this
    7311                 return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
    7312                     jQuery.swap( elem, cssShow, function() {
    7313                         return getWidthOrHeight( elem, name, extra );
    7314                     }) :
    7315                     getWidthOrHeight( elem, name, extra );
    7316             }
    7317         },
    7318 
    7319         set: function( elem, value, extra ) {
    7320             var styles = extra && getStyles( elem );
    7321             return setPositiveNumber( elem, value, extra ?
    7322                 augmentWidthOrHeight(
    7323                     elem,
    7324                     name,
    7325                     extra,
    7326                     jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
    7327                     styles
    7328                 ) : 0
    7329             );
    7330         }
    7331     };
    7332 });
    7333 
    7334 if ( !jQuery.support.opacity ) {
    7335     jQuery.cssHooks.opacity = {
    7336         get: function( elem, computed ) {
    7337             // IE uses filters for opacity
    7338             return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
    7339                 ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
    7340                 computed ? "1" : "";
    7341         },
    7342 
    7343         set: function( elem, value ) {
    7344             var style = elem.style,
    7345                 currentStyle = elem.currentStyle,
    7346                 opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
    7347                 filter = currentStyle && currentStyle.filter || style.filter || "";
    7348 
    7349             // IE has trouble with opacity if it does not have layout
    7350             // Force it by setting the zoom level
    7351             style.zoom = 1;
    7352 
    7353             // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
    7354             // if value === "", then remove inline opacity #12685
    7355             if ( ( value >= 1 || value === "" ) &&
    7356                     jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
    7357                     style.removeAttribute ) {
    7358 
    7359                 // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
    7360                 // if "filter:" is present at all, clearType is disabled, we want to avoid this
    7361                 // style.removeAttribute is IE Only, but so apparently is this code path...
    7362                 style.removeAttribute( "filter" );
    7363 
    7364                 // if there is no filter style applied in a css rule or unset inline opacity, we are done
    7365                 if ( value === "" || currentStyle && !currentStyle.filter ) {
    7366                     return;
    7367                 }
    7368             }
    7369 
    7370             // otherwise, set new filter values
    7371             style.filter = ralpha.test( filter ) ?
    7372                 filter.replace( ralpha, opacity ) :
    7373                 filter + " " + opacity;
    7374         }
    7375     };
    7376 }
    7377 
    7378 // These hooks cannot be added until DOM ready because the support test
    7379 // for it is not run until after DOM ready
    7380 jQuery(function() {
    7381     if ( !jQuery.support.reliableMarginRight ) {
    7382         jQuery.cssHooks.marginRight = {
    7383             get: function( elem, computed ) {
    7384                 if ( computed ) {
    7385                     // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
    7386                     // Work around by temporarily setting element display to inline-block
    7387                     return jQuery.swap( elem, { "display": "inline-block" },
    7388                         curCSS, [ elem, "marginRight" ] );
    7389                 }
    7390             }
    7391         };
    7392     }
    7393 
    7394     // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
    7395     // getComputedStyle returns percent when specified for top/left/bottom/right
    7396     // rather than make the css module depend on the offset module, we just check for it here
    7397     if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
    7398         jQuery.each( [ "top", "left" ], function( i, prop ) {
    7399             jQuery.cssHooks[ prop ] = {
    7400                 get: function( elem, computed ) {
    7401                     if ( computed ) {
    7402                         computed = curCSS( elem, prop );
    7403                         // if curCSS returns percentage, fallback to offset
    7404                         return rnumnonpx.test( computed ) ?
    7405                             jQuery( elem ).position()[ prop ] + "px" :
    7406                             computed;
    7407                     }
    7408                 }
    7409             };
    7410         });
    7411     }
    7412 
    7413 });
    7414 
    7415 if ( jQuery.expr && jQuery.expr.filters ) {
    7416     jQuery.expr.filters.hidden = function( elem ) {
    7417         // Support: Opera <= 12.12
    7418         // Opera reports offsetWidths and offsetHeights less than zero on some elements
    7419         return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
    7420             (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
    7421     };
    7422 
    7423     jQuery.expr.filters.visible = function( elem ) {
    7424         return !jQuery.expr.filters.hidden( elem );
    7425     };
    7426 }
    7427 
    7428 // These hooks are used by animate to expand properties
    7429 jQuery.each({
    7430     margin: "",
    7431     padding: "",
    7432     border: "Width"
    7433 }, function( prefix, suffix ) {
    7434     jQuery.cssHooks[ prefix + suffix ] = {
    7435         expand: function( value ) {
    7436             var i = 0,
    7437                 expanded = {},
    7438 
    7439                 // assumes a single number if not a string
    7440                 parts = typeof value === "string" ? value.split(" ") : [ value ];
    7441 
    7442             for ( ; i < 4; i++ ) {
    7443                 expanded[ prefix + cssExpand[ i ] + suffix ] =
    7444                     parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
    7445             }
    7446 
    7447             return expanded;
    7448         }
    7449     };
    7450 
    7451     if ( !rmargin.test( prefix ) ) {
    7452         jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
    7453     }
    7454 });
    7455 var r20 = /%20/g,
    7456     rbracket = /\[\]$/,
    7457     rCRLF = /\r?\n/g,
    7458     rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
    7459     rsubmittable = /^(?:input|select|textarea|keygen)/i;
    7460 
    7461 jQuery.fn.extend({
    7462     serialize: function() {
    7463         return jQuery.param( this.serializeArray() );
    7464     },
    7465     serializeArray: function() {
    7466         return this.map(function(){
    7467             // Can add propHook for "elements" to filter or add form elements
    7468             var elements = jQuery.prop( this, "elements" );
    7469             return elements ? jQuery.makeArray( elements ) : this;
    7470         })
    7471         .filter(function(){
    7472             var type = this.type;
    7473             // Use .is(":disabled") so that fieldset[disabled] works
    7474             return this.name && !jQuery( this ).is( ":disabled" ) &&
    7475                 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
    7476                 ( this.checked || !manipulation_rcheckableType.test( type ) );
    7477         })
    7478         .map(function( i, elem ){
    7479             var val = jQuery( this ).val();
    7480 
    7481             return val == null ?
    7482                 null :
    7483                 jQuery.isArray( val ) ?
    7484                     jQuery.map( val, function( val ){
    7485                         return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
    7486                     }) :
    7487                     { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
    7488         }).get();
    7489     }
    7490 });
    7491 
    7492 //Serialize an array of form elements or a set of
    7493 //key/values into a query string
    7494 jQuery.param = function( a, traditional ) {
    7495     var prefix,
    7496         s = [],
    7497         add = function( key, value ) {
    7498             // If value is a function, invoke it and return its value
    7499             value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
    7500             s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
    7501         };
    7502 
    7503     // Set traditional to true for jQuery <= 1.3.2 behavior.
    7504     if ( traditional === undefined ) {
    7505         traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
    7506     }
    7507 
    7508     // If an array was passed in, assume that it is an array of form elements.
    7509     if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
    7510         // Serialize the form elements
    7511         jQuery.each( a, function() {
    7512             add( this.name, this.value );
    7513         });
    7514 
    7515     } else {
    7516         // If traditional, encode the "old" way (the way 1.3.2 or older
    7517         // did it), otherwise encode params recursively.
    7518         for ( prefix in a ) {
    7519             buildParams( prefix, a[ prefix ], traditional, add );
    7520         }
    7521     }
    7522 
    7523     // Return the resulting serialization
    7524     return s.join( "&" ).replace( r20, "+" );
    7525 };
    7526 
    7527 function buildParams( prefix, obj, traditional, add ) {
    7528     var name;
    7529 
    7530     if ( jQuery.isArray( obj ) ) {
    7531         // Serialize array item.
    7532         jQuery.each( obj, function( i, v ) {
    7533             if ( traditional || rbracket.test( prefix ) ) {
    7534                 // Treat each array item as a scalar.
    7535                 add( prefix, v );
    7536 
    7537             } else {
    7538                 // Item is non-scalar (array or object), encode its numeric index.
    7539                 buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
    7540             }
    7541         });
    7542 
    7543     } else if ( !traditional && jQuery.type( obj ) === "object" ) {
    7544         // Serialize object item.
    7545         for ( name in obj ) {
    7546             buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
    7547         }
    7548 
    7549     } else {
    7550         // Serialize scalar item.
    7551         add( prefix, obj );
    7552     }
    7553 }
    7554 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
    7555     "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
    7556     "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
    7557 
    7558     // Handle event binding
    7559     jQuery.fn[ name ] = function( data, fn ) {
    7560         return arguments.length > 0 ?
    7561             this.on( name, null, data, fn ) :
    7562             this.trigger( name );
    7563     };
    7564 });
    7565 
    7566 jQuery.fn.extend({
    7567     hover: function( fnOver, fnOut ) {
    7568         return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
    7569     },
    7570 
    7571     bind: function( types, data, fn ) {
    7572         return this.on( types, null, data, fn );
    7573     },
    7574     unbind: function( types, fn ) {
    7575         return this.off( types, null, fn );
    7576     },
    7577 
    7578     delegate: function( selector, types, data, fn ) {
    7579         return this.on( types, selector, data, fn );
    7580     },
    7581     undelegate: function( selector, types, fn ) {
    7582         // ( namespace ) or ( selector, types [, fn] )
    7583         return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
    7584     }
    7585 });
    7586 var
    7587     // Document location
    7588     ajaxLocParts,
    7589     ajaxLocation,
    7590     ajax_nonce = jQuery.now(),
    7591 
    7592     ajax_rquery = /\?/,
    7593     rhash = /#.*$/,
    7594     rts = /([?&])_=[^&]*/,
    7595     rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
    7596     // #7653, #8125, #8152: local protocol detection
    7597     rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
    7598     rnoContent = /^(?:GET|HEAD)$/,
    7599     rprotocol = /^\/\//,
    7600     rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
    7601 
    7602     // Keep a copy of the old load method
    7603     _load = jQuery.fn.load,
    7604 
    7605     /* Prefilters
    7606      * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
    7607      * 2) These are called:
    7608      *    - BEFORE asking for a transport
    7609      *    - AFTER param serialization (s.data is a string if s.processData is true)
    7610      * 3) key is the dataType
    7611      * 4) the catchall symbol "*" can be used
    7612      * 5) execution will start with transport dataType and THEN continue down to "*" if needed
    7613      */
    7614     prefilters = {},
    7615 
    7616     /* Transports bindings
    7617      * 1) key is the dataType
    7618      * 2) the catchall symbol "*" can be used
    7619      * 3) selection will start with transport dataType and THEN go to "*" if needed
    7620      */
    7621     transports = {},
    7622 
    7623     // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
    7624     allTypes = "*/".concat("*");
    7625 
    7626 // #8138, IE may throw an exception when accessing
    7627 // a field from window.location if document.domain has been set
    7628 try {
    7629     ajaxLocation = location.href;
    7630 } catch( e ) {
    7631     // Use the href attribute of an A element
    7632     // since IE will modify it given document.location
    7633     ajaxLocation = document.createElement( "a" );
    7634     ajaxLocation.href = "";
    7635     ajaxLocation = ajaxLocation.href;
    7636 }
    7637 
    7638 // Segment location into parts
    7639 ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
    7640 
    7641 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
    7642 function addToPrefiltersOrTransports( structure ) {
    7643 
    7644     // dataTypeExpression is optional and defaults to "*"
    7645     return function( dataTypeExpression, func ) {
    7646 
    7647         if ( typeof dataTypeExpression !== "string" ) {
    7648             func = dataTypeExpression;
    7649             dataTypeExpression = "*";
    7650         }
    7651 
    7652         var dataType,
    7653             i = 0,
    7654             dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
    7655 
    7656         if ( jQuery.isFunction( func ) ) {
    7657             // For each dataType in the dataTypeExpression
    7658             while ( (dataType = dataTypes[i++]) ) {
    7659                 // Prepend if requested
    7660                 if ( dataType[0] === "+" ) {
    7661                     dataType = dataType.slice( 1 ) || "*";
    7662                     (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
    7663 
    7664                 // Otherwise append
    7665                 } else {
    7666                     (structure[ dataType ] = structure[ dataType ] || []).push( func );
    7667                 }
    7668             }
    7669         }
    7670     };
    7671 }
    7672 
    7673 // Base inspection function for prefilters and transports
    7674 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
    7675 
    7676     var inspected = {},
    7677         seekingTransport = ( structure === transports );
    7678 
    7679     function inspect( dataType ) {
    7680         var selected;
    7681         inspected[ dataType ] = true;
    7682         jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
    7683             var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
    7684             if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
    7685                 options.dataTypes.unshift( dataTypeOrTransport );
    7686                 inspect( dataTypeOrTransport );
    7687                 return false;
    7688             } else if ( seekingTransport ) {
    7689                 return !( selected = dataTypeOrTransport );
    7690             }
    7691         });
    7692         return selected;
    7693     }
    7694 
    7695     return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
    7696 }
    7697 
    7698 // A special extend for ajax options
    7699 // that takes "flat" options (not to be deep extended)
    7700 // Fixes #9887
    7701 function ajaxExtend( target, src ) {
    7702     var deep, key,
    7703         flatOptions = jQuery.ajaxSettings.flatOptions || {};
    7704 
    7705     for ( key in src ) {
    7706         if ( src[ key ] !== undefined ) {
    7707             ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
    7708         }
    7709     }
    7710     if ( deep ) {
    7711         jQuery.extend( true, target, deep );
    7712     }
    7713 
    7714     return target;
    7715 }
    7716 
    7717 jQuery.fn.load = function( url, params, callback ) {
    7718     if ( typeof url !== "string" && _load ) {
    7719         return _load.apply( this, arguments );
    7720     }
    7721 
    7722     var selector, response, type,
    7723         self = this,
    7724         off = url.indexOf(" ");
    7725 
    7726     if ( off >= 0 ) {
    7727         selector = url.slice( off, url.length );
    7728         url = url.slice( 0, off );
    7729     }
    7730 
    7731     // If it's a function
    7732     if ( jQuery.isFunction( params ) ) {
    7733 
    7734         // We assume that it's the callback
    7735         callback = params;
    7736         params = undefined;
    7737 
    7738     // Otherwise, build a param string
    7739     } else if ( params && typeof params === "object" ) {
    7740         type = "POST";
    7741     }
    7742 
    7743     // If we have elements to modify, make the request
    7744     if ( self.length > 0 ) {
    7745         jQuery.ajax({
    7746             url: url,
    7747 
    7748             // if "type" variable is undefined, then "GET" method will be used
    7749             type: type,
    7750             dataType: "html",
    7751             data: params
    7752         }).done(function( responseText ) {
    7753 
    7754             // Save response for use in complete callback
    7755             response = arguments;
    7756 
    7757             self.html( selector ?
    7758 
    7759                 // If a selector was specified, locate the right elements in a dummy div
    7760                 // Exclude scripts to avoid IE 'Permission Denied' errors
    7761                 jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
    7762 
    7763                 // Otherwise use the full result
    7764                 responseText );
    7765 
    7766         }).complete( callback && function( jqXHR, status ) {
    7767             self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
    7768         });
    7769     }
    7770 
    7771     return this;
    7772 };
    7773 
    7774 // Attach a bunch of functions for handling common AJAX events
    7775 jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
    7776     jQuery.fn[ type ] = function( fn ){
    7777         return this.on( type, fn );
    7778     };
    7779 });
    7780 
    7781 jQuery.extend({
    7782 
    7783     // Counter for holding the number of active queries
    7784     active: 0,
    7785 
    7786     // Last-Modified header cache for next request
    7787     lastModified: {},
    7788     etag: {},
    7789 
    7790     ajaxSettings: {
    7791         url: ajaxLocation,
    7792         type: "GET",
    7793         isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
    7794         global: true,
    7795         processData: true,
    7796         async: true,
    7797         contentType: "application/x-www-form-urlencoded; charset=UTF-8",
    7798         /*
    7799         timeout: 0,
    7800         data: null,
    7801         dataType: null,
    7802         username: null,
    7803         password: null,
    7804         cache: null,
    7805         throws: false,
    7806         traditional: false,
    7807         headers: {},
    7808         */
    7809 
    7810         accepts: {
    7811             "*": allTypes,
    7812             text: "text/plain",
    7813             html: "text/html",
    7814             xml: "application/xml, text/xml",
    7815             json: "application/json, text/javascript"
    7816         },
    7817 
    7818         contents: {
    7819             xml: /xml/,
    7820             html: /html/,
    7821             json: /json/
    7822         },
    7823 
    7824         responseFields: {
    7825             xml: "responseXML",
    7826             text: "responseText",
    7827             json: "responseJSON"
    7828         },
    7829 
    7830         // Data converters
    7831         // Keys separate source (or catchall "*") and destination types with a single space
    7832         converters: {
    7833 
    7834             // Convert anything to text
    7835             "* text": String,
    7836 
    7837             // Text to html (true = no transformation)
    7838             "text html": true,
    7839 
    7840             // Evaluate text as a json expression
    7841             "text json": jQuery.parseJSON,
    7842 
    7843             // Parse text as xml
    7844             "text xml": jQuery.parseXML
    7845         },
    7846 
    7847         // For options that shouldn't be deep extended:
    7848         // you can add your own custom options here if
    7849         // and when you create one that shouldn't be
    7850         // deep extended (see ajaxExtend)
    7851         flatOptions: {
    7852             url: true,
    7853             context: true
    7854         }
    7855     },
    7856 
    7857     // Creates a full fledged settings object into target
    7858     // with both ajaxSettings and settings fields.
    7859     // If target is omitted, writes into ajaxSettings.
    7860     ajaxSetup: function( target, settings ) {
    7861         return settings ?
    7862 
    7863             // Building a settings object
    7864             ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
    7865 
    7866             // Extending ajaxSettings
    7867             ajaxExtend( jQuery.ajaxSettings, target );
    7868     },
    7869 
    7870     ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
    7871     ajaxTransport: addToPrefiltersOrTransports( transports ),
    7872 
    7873     // Main method
    7874     ajax: function( url, options ) {
    7875 
    7876         // If url is an object, simulate pre-1.5 signature
    7877         if ( typeof url === "object" ) {
    7878             options = url;
    7879             url = undefined;
    7880         }
    7881 
    7882         // Force options to be an object
    7883         options = options || {};
    7884 
    7885         var // Cross-domain detection vars
    7886             parts,
    7887             // Loop variable
    7888             i,
    7889             // URL without anti-cache param
    7890             cacheURL,
    7891             // Response headers as string
    7892             responseHeadersString,
    7893             // timeout handle
    7894             timeoutTimer,
    7895 
    7896             // To know if global events are to be dispatched
    7897             fireGlobals,
    7898 
    7899             transport,
    7900             // Response headers
    7901             responseHeaders,
    7902             // Create the final options object
    7903             s = jQuery.ajaxSetup( {}, options ),
    7904             // Callbacks context
    7905             callbackContext = s.context || s,
    7906             // Context for global events is callbackContext if it is a DOM node or jQuery collection
    7907             globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
    7908                 jQuery( callbackContext ) :
    7909                 jQuery.event,
    7910             // Deferreds
    7911             deferred = jQuery.Deferred(),
    7912             completeDeferred = jQuery.Callbacks("once memory"),
    7913             // Status-dependent callbacks
    7914             statusCode = s.statusCode || {},
    7915             // Headers (they are sent all at once)
    7916             requestHeaders = {},
    7917             requestHeadersNames = {},
    7918             // The jqXHR state
    7919             state = 0,
    7920             // Default abort message
    7921             strAbort = "canceled",
    7922             // Fake xhr
    7923             jqXHR = {
    7924                 readyState: 0,
    7925 
    7926                 // Builds headers hashtable if needed
    7927                 getResponseHeader: function( key ) {
    7928                     var match;
    7929                     if ( state === 2 ) {
    7930                         if ( !responseHeaders ) {
    7931                             responseHeaders = {};
    7932                             while ( (match = rheaders.exec( responseHeadersString )) ) {
    7933                                 responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
    7934                             }
    7935                         }
    7936                         match = responseHeaders[ key.toLowerCase() ];
    7937                     }
    7938                     return match == null ? null : match;
    7939                 },
    7940 
    7941                 // Raw string
    7942                 getAllResponseHeaders: function() {
    7943                     return state === 2 ? responseHeadersString : null;
    7944                 },
    7945 
    7946                 // Caches the header
    7947                 setRequestHeader: function( name, value ) {
    7948                     var lname = name.toLowerCase();
    7949                     if ( !state ) {
    7950                         name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
    7951                         requestHeaders[ name ] = value;
    7952                     }
    7953                     return this;
    7954                 },
    7955 
    7956                 // Overrides response content-type header
    7957                 overrideMimeType: function( type ) {
    7958                     if ( !state ) {
    7959                         s.mimeType = type;
    7960                     }
    7961                     return this;
    7962                 },
    7963 
    7964                 // Status-dependent callbacks
    7965                 statusCode: function( map ) {
    7966                     var code;
    7967                     if ( map ) {
    7968                         if ( state < 2 ) {
    7969                             for ( code in map ) {
    7970                                 // Lazy-add the new callback in a way that preserves old ones
    7971                                 statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
    7972                             }
    7973                         } else {
    7974                             // Execute the appropriate callbacks
    7975                             jqXHR.always( map[ jqXHR.status ] );
    7976                         }
    7977                     }
    7978                     return this;
    7979                 },
    7980 
    7981                 // Cancel the request
    7982                 abort: function( statusText ) {
    7983                     var finalText = statusText || strAbort;
    7984                     if ( transport ) {
    7985                         transport.abort( finalText );
    7986                     }
    7987                     done( 0, finalText );
    7988                     return this;
    7989                 }
    7990             };
    7991 
    7992         // Attach deferreds
    7993         deferred.promise( jqXHR ).complete = completeDeferred.add;
    7994         jqXHR.success = jqXHR.done;
    7995         jqXHR.error = jqXHR.fail;
    7996 
    7997         // Remove hash character (#7531: and string promotion)
    7998         // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
    7999         // Handle falsy url in the settings object (#10093: consistency with old signature)
    8000         // We also use the url parameter if available
    8001         s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
    8002 
    8003         // Alias method option to type as per ticket #12004
    8004         s.type = options.method || options.type || s.method || s.type;
    8005 
    8006         // Extract dataTypes list
    8007         s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
    8008 
    8009         // A cross-domain request is in order when we have a protocol:host:port mismatch
    8010         if ( s.crossDomain == null ) {
    8011             parts = rurl.exec( s.url.toLowerCase() );
    8012             s.crossDomain = !!( parts &&
    8013                 ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
    8014                     ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
    8015                         ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
    8016             );
    8017         }
    8018 
    8019         // Convert data if not already a string
    8020         if ( s.data && s.processData && typeof s.data !== "string" ) {
    8021             s.data = jQuery.param( s.data, s.traditional );
    8022         }
    8023 
    8024         // Apply prefilters
    8025         inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
    8026 
    8027         // If request was aborted inside a prefilter, stop there
    8028         if ( state === 2 ) {
    8029             return jqXHR;
    8030         }
    8031 
    8032         // We can fire global events as of now if asked to
    8033         fireGlobals = s.global;
    8034 
    8035         // Watch for a new set of requests
    8036         if ( fireGlobals && jQuery.active++ === 0 ) {
    8037             jQuery.event.trigger("ajaxStart");
    8038         }
    8039 
    8040         // Uppercase the type
    8041         s.type = s.type.toUpperCase();
    8042 
    8043         // Determine if request has content
    8044         s.hasContent = !rnoContent.test( s.type );
    8045 
    8046         // Save the URL in case we're toying with the If-Modified-Since
    8047         // and/or If-None-Match header later on
    8048         cacheURL = s.url;
    8049 
    8050         // More options handling for requests with no content
    8051         if ( !s.hasContent ) {
    8052 
    8053             // If data is available, append data to url
    8054             if ( s.data ) {
    8055                 cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
    8056                 // #9682: remove data so that it's not used in an eventual retry
    8057                 delete s.data;
    8058             }
    8059 
    8060             // Add anti-cache in url if needed
    8061             if ( s.cache === false ) {
    8062                 s.url = rts.test( cacheURL ) ?
    8063 
    8064                     // If there is already a '_' parameter, set its value
    8065                     cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
    8066 
    8067                     // Otherwise add one to the end
    8068                     cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
    8069             }
    8070         }
    8071 
    8072         // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
    8073         if ( s.ifModified ) {
    8074             if ( jQuery.lastModified[ cacheURL ] ) {
    8075                 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
    8076             }
    8077             if ( jQuery.etag[ cacheURL ] ) {
    8078                 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
    8079             }
    8080         }
    8081 
    8082         // Set the correct header, if data is being sent
    8083         if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
    8084             jqXHR.setRequestHeader( "Content-Type", s.contentType );
    8085         }
    8086 
    8087         // Set the Accepts header for the server, depending on the dataType
    8088         jqXHR.setRequestHeader(
    8089             "Accept",
    8090             s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
    8091                 s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
    8092                 s.accepts[ "*" ]
    8093         );
    8094 
    8095         // Check for headers option
    8096         for ( i in s.headers ) {
    8097             jqXHR.setRequestHeader( i, s.headers[ i ] );
    8098         }
    8099 
    8100         // Allow custom headers/mimetypes and early abort
    8101         if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
    8102             // Abort if not done already and return
    8103             return jqXHR.abort();
    8104         }
    8105 
    8106         // aborting is no longer a cancellation
    8107         strAbort = "abort";
    8108 
    8109         // Install callbacks on deferreds
    8110         for ( i in { success: 1, error: 1, complete: 1 } ) {
    8111             jqXHR[ i ]( s[ i ] );
    8112         }
    8113 
    8114         // Get transport
    8115         transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
    8116 
    8117         // If no transport, we auto-abort
    8118         if ( !transport ) {
    8119             done( -1, "No Transport" );
    8120         } else {
    8121             jqXHR.readyState = 1;
    8122 
    8123             // Send global event
    8124             if ( fireGlobals ) {
    8125                 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
    8126             }
    8127             // Timeout
    8128             if ( s.async && s.timeout > 0 ) {
    8129                 timeoutTimer = setTimeout(function() {
    8130                     jqXHR.abort("timeout");
    8131                 }, s.timeout );
    8132             }
    8133 
    8134             try {
    8135                 state = 1;
    8136                 transport.send( requestHeaders, done );
    8137             } catch ( e ) {
    8138                 // Propagate exception as error if not done
    8139                 if ( state < 2 ) {
    8140                     done( -1, e );
    8141                 // Simply rethrow otherwise
    8142                 } else {
    8143                     throw e;
    8144                 }
    8145             }
    8146         }
    8147 
    8148         // Callback for when everything is done
    8149         function done( status, nativeStatusText, responses, headers ) {
    8150             var isSuccess, success, error, response, modified,
    8151                 statusText = nativeStatusText;
    8152 
    8153             // Called once
    8154             if ( state === 2 ) {
    8155                 return;
    8156             }
    8157 
    8158             // State is "done" now
    8159             state = 2;
    8160 
    8161             // Clear timeout if it exists
    8162             if ( timeoutTimer ) {
    8163                 clearTimeout( timeoutTimer );
    8164             }
    8165 
    8166             // Dereference transport for early garbage collection
    8167             // (no matter how long the jqXHR object will be used)
    8168             transport = undefined;
    8169 
    8170             // Cache response headers
    8171             responseHeadersString = headers || "";
    8172 
    8173             // Set readyState
    8174             jqXHR.readyState = status > 0 ? 4 : 0;
    8175 
    8176             // Determine if successful
    8177             isSuccess = status >= 200 && status < 300 || status === 304;
    8178 
    8179             // Get response data
    8180             if ( responses ) {
    8181                 response = ajaxHandleResponses( s, jqXHR, responses );
    8182             }
    8183 
    8184             // Convert no matter what (that way responseXXX fields are always set)
    8185             response = ajaxConvert( s, response, jqXHR, isSuccess );
    8186 
    8187             // If successful, handle type chaining
    8188             if ( isSuccess ) {
    8189 
    8190                 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
    8191                 if ( s.ifModified ) {
    8192                     modified = jqXHR.getResponseHeader("Last-Modified");
    8193                     if ( modified ) {
    8194                         jQuery.lastModified[ cacheURL ] = modified;
    8195                     }
    8196                     modified = jqXHR.getResponseHeader("etag");
    8197                     if ( modified ) {
    8198                         jQuery.etag[ cacheURL ] = modified;
    8199                     }
    8200                 }
    8201 
    8202                 // if no content
    8203                 if ( status === 204 || s.type === "HEAD" ) {
    8204                     statusText = "nocontent";
    8205 
    8206                 // if not modified
    8207                 } else if ( status === 304 ) {
    8208                     statusText = "notmodified";
    8209 
    8210                 // If we have data, let's convert it
    8211                 } else {
    8212                     statusText = response.state;
    8213                     success = response.data;
    8214                     error = response.error;
    8215                     isSuccess = !error;
    8216                 }
    8217             } else {
    8218                 // We extract error from statusText
    8219                 // then normalize statusText and status for non-aborts
    8220                 error = statusText;
    8221                 if ( status || !statusText ) {
    8222                     statusText = "error";
    8223                     if ( status < 0 ) {
    8224                         status = 0;
    8225                     }
    8226                 }
    8227             }
    8228 
    8229             // Set data for the fake xhr object
    8230             jqXHR.status = status;
    8231             jqXHR.statusText = ( nativeStatusText || statusText ) + "";
    8232 
    8233             // Success/Error
    8234             if ( isSuccess ) {
    8235                 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
    8236             } else {
    8237                 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
    8238             }
    8239 
    8240             // Status-dependent callbacks
    8241             jqXHR.statusCode( statusCode );
    8242             statusCode = undefined;
    8243 
    8244             if ( fireGlobals ) {
    8245                 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
    8246                     [ jqXHR, s, isSuccess ? success : error ] );
    8247             }
    8248 
    8249             // Complete
    8250             completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
    8251 
    8252             if ( fireGlobals ) {
    8253                 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
    8254                 // Handle the global AJAX counter
    8255                 if ( !( --jQuery.active ) ) {
    8256                     jQuery.event.trigger("ajaxStop");
    8257                 }
    8258             }
    8259         }
    8260 
    8261         return jqXHR;
    8262     },
    8263 
    8264     getJSON: function( url, data, callback ) {
    8265         return jQuery.get( url, data, callback, "json" );
    8266     },
    8267 
    8268     getScript: function( url, callback ) {
    8269         return jQuery.get( url, undefined, callback, "script" );
    8270     }
    8271 });
    8272 
    8273 jQuery.each( [ "get", "post" ], function( i, method ) {
    8274     jQuery[ method ] = function( url, data, callback, type ) {
    8275         // shift arguments if data argument was omitted
    8276         if ( jQuery.isFunction( data ) ) {
    8277             type = type || callback;
    8278             callback = data;
    8279             data = undefined;
    8280         }
    8281 
    8282         return jQuery.ajax({
    8283             url: url,
    8284             type: method,
    8285             dataType: type,
    8286             data: data,
    8287             success: callback
    8288         });
    8289     };
    8290 });
    8291 
    8292 /* Handles responses to an ajax request:
    8293  * - finds the right dataType (mediates between content-type and expected dataType)
    8294  * - returns the corresponding response
    8295  */
    8296 function ajaxHandleResponses( s, jqXHR, responses ) {
    8297     var firstDataType, ct, finalDataType, type,
    8298         contents = s.contents,
    8299         dataTypes = s.dataTypes;
    8300 
    8301     // Remove auto dataType and get content-type in the process
    8302     while( dataTypes[ 0 ] === "*" ) {
    8303         dataTypes.shift();
    8304         if ( ct === undefined ) {
    8305             ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
    8306         }
    8307     }
    8308 
    8309     // Check if we're dealing with a known content-type
    8310     if ( ct ) {
    8311         for ( type in contents ) {
    8312             if ( contents[ type ] && contents[ type ].test( ct ) ) {
    8313                 dataTypes.unshift( type );
    8314                 break;
    8315             }
    8316         }
    8317     }
    8318 
    8319     // Check to see if we have a response for the expected dataType
    8320     if ( dataTypes[ 0 ] in responses ) {
    8321         finalDataType = dataTypes[ 0 ];
    8322     } else {
    8323         // Try convertible dataTypes
    8324         for ( type in responses ) {
    8325             if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
    8326                 finalDataType = type;
    8327                 break;
    8328             }
    8329             if ( !firstDataType ) {
    8330                 firstDataType = type;
    8331             }
    8332         }
    8333         // Or just use first one
    8334         finalDataType = finalDataType || firstDataType;
    8335     }
    8336 
    8337     // If we found a dataType
    8338     // We add the dataType to the list if needed
    8339     // and return the corresponding response
    8340     if ( finalDataType ) {
    8341         if ( finalDataType !== dataTypes[ 0 ] ) {
    8342             dataTypes.unshift( finalDataType );
    8343         }
    8344         return responses[ finalDataType ];
    8345     }
    8346 }
    8347 
    8348 /* Chain conversions given the request and the original response
    8349  * Also sets the responseXXX fields on the jqXHR instance
    8350  */
    8351 function ajaxConvert( s, response, jqXHR, isSuccess ) {
    8352     var conv2, current, conv, tmp, prev,
    8353         converters = {},
    8354         // Work with a copy of dataTypes in case we need to modify it for conversion
    8355         dataTypes = s.dataTypes.slice();
    8356 
    8357     // Create converters map with lowercased keys
    8358     if ( dataTypes[ 1 ] ) {
    8359         for ( conv in s.converters ) {
    8360             converters[ conv.toLowerCase() ] = s.converters[ conv ];
    8361         }
    8362     }
    8363 
    8364     current = dataTypes.shift();
    8365 
    8366     // Convert to each sequential dataType
    8367     while ( current ) {
    8368 
    8369         if ( s.responseFields[ current ] ) {
    8370             jqXHR[ s.responseFields[ current ] ] = response;
    8371         }
    8372 
    8373         // Apply the dataFilter if provided
    8374         if ( !prev && isSuccess && s.dataFilter ) {
    8375             response = s.dataFilter( response, s.dataType );
    8376         }
    8377 
    8378         prev = current;
    8379         current = dataTypes.shift();
    8380 
    8381         if ( current ) {
    8382 
    8383             // There's only work to do if current dataType is non-auto
    8384             if ( current === "*" ) {
    8385 
    8386                 current = prev;
    8387 
    8388             // Convert response if prev dataType is non-auto and differs from current
    8389             } else if ( prev !== "*" && prev !== current ) {
    8390 
    8391                 // Seek a direct converter
    8392                 conv = converters[ prev + " " + current ] || converters[ "* " + current ];
    8393 
    8394                 // If none found, seek a pair
    8395                 if ( !conv ) {
    8396                     for ( conv2 in converters ) {
    8397 
    8398                         // If conv2 outputs current
    8399                         tmp = conv2.split( " " );
    8400                         if ( tmp[ 1 ] === current ) {
    8401 
    8402                             // If prev can be converted to accepted input
    8403                             conv = converters[ prev + " " + tmp[ 0 ] ] ||
    8404                                 converters[ "* " + tmp[ 0 ] ];
    8405                             if ( conv ) {
    8406                                 // Condense equivalence converters
    8407                                 if ( conv === true ) {
    8408                                     conv = converters[ conv2 ];
    8409 
    8410                                 // Otherwise, insert the intermediate dataType
    8411                                 } else if ( converters[ conv2 ] !== true ) {
    8412                                     current = tmp[ 0 ];
    8413                                     dataTypes.unshift( tmp[ 1 ] );
    8414                                 }
    8415                                 break;
    8416                             }
    8417                         }
    8418                     }
    8419                 }
    8420 
    8421                 // Apply converter (if not an equivalence)
    8422                 if ( conv !== true ) {
    8423 
    8424                     // Unless errors are allowed to bubble, catch and return them
    8425                     if ( conv && s[ "throws" ] ) {
    8426                         response = conv( response );
    8427                     } else {
    8428                         try {
    8429                             response = conv( response );
    8430                         } catch ( e ) {
    8431                             return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
    8432                         }
    8433                     }
    8434                 }
    8435             }
    8436         }
    8437     }
    8438 
    8439     return { state: "success", data: response };
    8440 }
    8441 // Install script dataType
    8442 jQuery.ajaxSetup({
    8443     accepts: {
    8444         script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
    8445     },
    8446     contents: {
    8447         script: /(?:java|ecma)script/
    8448     },
    8449     converters: {
    8450         "text script": function( text ) {
    8451             jQuery.globalEval( text );
    8452             return text;
    8453         }
    8454     }
    8455 });
    8456 
    8457 // Handle cache's special case and global
    8458 jQuery.ajaxPrefilter( "script", function( s ) {
    8459     if ( s.cache === undefined ) {
    8460         s.cache = false;
    8461     }
    8462     if ( s.crossDomain ) {
    8463         s.type = "GET";
    8464         s.global = false;
    8465     }
    8466 });
    8467 
    8468 // Bind script tag hack transport
    8469 jQuery.ajaxTransport( "script", function(s) {
    8470 
    8471     // This transport only deals with cross domain requests
    8472     if ( s.crossDomain ) {
    8473 
    8474         var script,
    8475             head = document.head || jQuery("head")[0] || document.documentElement;
    8476 
    8477         return {
    8478 
    8479             send: function( _, callback ) {
    8480 
    8481                 script = document.createElement("script");
    8482 
    8483                 script.async = true;
    8484 
    8485                 if ( s.scriptCharset ) {
    8486                     script.charset = s.scriptCharset;
    8487                 }
    8488 
    8489                 script.src = s.url;
    8490 
    8491                 // Attach handlers for all browsers
    8492                 script.onload = script.onreadystatechange = function( _, isAbort ) {
    8493 
    8494                     if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
    8495 
    8496                         // Handle memory leak in IE
    8497                         script.onload = script.onreadystatechange = null;
    8498 
    8499                         // Remove the script
    8500                         if ( script.parentNode ) {
    8501                             script.parentNode.removeChild( script );
    8502                         }
    8503 
    8504                         // Dereference the script
    8505                         script = null;
    8506 
    8507                         // Callback if not abort
    8508                         if ( !isAbort ) {
    8509                             callback( 200, "success" );
    8510                         }
    8511                     }
    8512                 };
    8513 
    8514                 // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
    8515                 // Use native DOM manipulation to avoid our domManip AJAX trickery
    8516                 head.insertBefore( script, head.firstChild );
    8517             },
    8518 
    8519             abort: function() {
    8520                 if ( script ) {
    8521                     script.onload( undefined, true );
    8522                 }
    8523             }
    8524         };
    8525     }
    8526 });
    8527 var oldCallbacks = [],
    8528     rjsonp = /(=)\?(?=&|$)|\?\?/;
    8529 
    8530 // Default jsonp settings
    8531 jQuery.ajaxSetup({
    8532     jsonp: "callback",
    8533     jsonpCallback: function() {
    8534         var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
    8535         this[ callback ] = true;
    8536         return callback;
    8537     }
    8538 });
    8539 
    8540 // Detect, normalize options and install callbacks for jsonp requests
    8541 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
    8542 
    8543     var callbackName, overwritten, responseContainer,
    8544         jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
    8545             "url" :
    8546             typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
    8547         );
    8548 
    8549     // Handle iff the expected data type is "jsonp" or we have a parameter to set
    8550     if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
    8551 
    8552         // Get callback name, remembering preexisting value associated with it
    8553         callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
    8554             s.jsonpCallback() :
    8555             s.jsonpCallback;
    8556 
    8557         // Insert callback into url or form data
    8558         if ( jsonProp ) {
    8559             s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
    8560         } else if ( s.jsonp !== false ) {
    8561             s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
    8562         }
    8563 
    8564         // Use data converter to retrieve json after script execution
    8565         s.converters["script json"] = function() {
    8566             if ( !responseContainer ) {
    8567                 jQuery.error( callbackName + " was not called" );
    8568             }
    8569             return responseContainer[ 0 ];
    8570         };
    8571 
    8572         // force json dataType
    8573         s.dataTypes[ 0 ] = "json";
    8574 
    8575         // Install callback
    8576         overwritten = window[ callbackName ];
    8577         window[ callbackName ] = function() {
    8578             responseContainer = arguments;
    8579         };
    8580 
    8581         // Clean-up function (fires after converters)
    8582         jqXHR.always(function() {
    8583             // Restore preexisting value
    8584             window[ callbackName ] = overwritten;
    8585 
    8586             // Save back as free
    8587             if ( s[ callbackName ] ) {
    8588                 // make sure that re-using the options doesn't screw things around
    8589                 s.jsonpCallback = originalSettings.jsonpCallback;
    8590 
    8591                 // save the callback name for future use
    8592                 oldCallbacks.push( callbackName );
    8593             }
    8594 
    8595             // Call if it was a function and we have a response
    8596             if ( responseContainer && jQuery.isFunction( overwritten ) ) {
    8597                 overwritten( responseContainer[ 0 ] );
    8598             }
    8599 
    8600             responseContainer = overwritten = undefined;
    8601         });
    8602 
    8603         // Delegate to script
    8604         return "script";
    8605     }
    8606 });
    8607 var xhrCallbacks, xhrSupported,
    8608     xhrId = 0,
    8609     // #5280: Internet Explorer will keep connections alive if we don't abort on unload
    8610     xhrOnUnloadAbort = window.ActiveXObject && function() {
    8611         // Abort all pending requests
    8612         var key;
    8613         for ( key in xhrCallbacks ) {
    8614             xhrCallbacks[ key ]( undefined, true );
    8615         }
    8616     };
    8617 
    8618 // Functions to create xhrs
    8619 function createStandardXHR() {
    8620     try {
    8621         return new window.XMLHttpRequest();
    8622     } catch( e ) {}
    8623 }
    8624 
    8625 function createActiveXHR() {
    8626     try {
    8627         return new window.ActiveXObject("Microsoft.XMLHTTP");
    8628     } catch( e ) {}
    8629 }
    8630 
    8631 // Create the request object
    8632 // (This is still attached to ajaxSettings for backward compatibility)
    8633 jQuery.ajaxSettings.xhr = window.ActiveXObject ?
    8634     /* Microsoft failed to properly
    8635      * implement the XMLHttpRequest in IE7 (can't request local files),
    8636      * so we use the ActiveXObject when it is available
    8637      * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
    8638      * we need a fallback.
    8639      */
    8640     function() {
    8641         return !this.isLocal && createStandardXHR() || createActiveXHR();
    8642     } :
    8643     // For all other browsers, use the standard XMLHttpRequest object
    8644     createStandardXHR;
    8645 
    8646 // Determine support properties
    8647 xhrSupported = jQuery.ajaxSettings.xhr();
    8648 jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
    8649 xhrSupported = jQuery.support.ajax = !!xhrSupported;
    8650 
    8651 // Create transport if the browser can provide an xhr
    8652 if ( xhrSupported ) {
    8653 
    8654     jQuery.ajaxTransport(function( s ) {
    8655         // Cross domain only allowed if supported through XMLHttpRequest
    8656         if ( !s.crossDomain || jQuery.support.cors ) {
    8657 
    8658             var callback;
    8659 
    8660             return {
    8661                 send: function( headers, complete ) {
    8662 
    8663                     // Get a new xhr
    8664                     var handle, i,
    8665                         xhr = s.xhr();
    8666 
    8667                     // Open the socket
    8668                     // Passing null username, generates a login popup on Opera (#2865)
    8669                     if ( s.username ) {
    8670                         xhr.open( s.type, s.url, s.async, s.username, s.password );
    8671                     } else {
    8672                         xhr.open( s.type, s.url, s.async );
    8673                     }
    8674 
    8675                     // Apply custom fields if provided
    8676                     if ( s.xhrFields ) {
    8677                         for ( i in s.xhrFields ) {
    8678                             xhr[ i ] = s.xhrFields[ i ];
    8679                         }
    8680                     }
    8681 
    8682                     // Override mime type if needed
    8683                     if ( s.mimeType && xhr.overrideMimeType ) {
    8684                         xhr.overrideMimeType( s.mimeType );
    8685                     }
    8686 
    8687                     // X-Requested-With header
    8688                     // For cross-domain requests, seeing as conditions for a preflight are
    8689                     // akin to a jigsaw puzzle, we simply never set it to be sure.
    8690                     // (it can always be set on a per-request basis or even using ajaxSetup)
    8691                     // For same-domain requests, won't change header if already provided.
    8692                     if ( !s.crossDomain && !headers["X-Requested-With"] ) {
    8693                         headers["X-Requested-With"] = "XMLHttpRequest";
    8694                     }
    8695 
    8696                     // Need an extra try/catch for cross domain requests in Firefox 3
    8697                     try {
    8698                         for ( i in headers ) {
    8699                             xhr.setRequestHeader( i, headers[ i ] );
    8700                         }
    8701                     } catch( err ) {}
    8702 
    8703                     // Do send the request
    8704                     // This may raise an exception which is actually
    8705                     // handled in jQuery.ajax (so no try/catch here)
    8706                     xhr.send( ( s.hasContent && s.data ) || null );
    8707 
    8708                     // Listener
    8709                     callback = function( _, isAbort ) {
    8710                         var status, responseHeaders, statusText, responses;
    8711 
    8712                         // Firefox throws exceptions when accessing properties
    8713                         // of an xhr when a network error occurred
    8714                         // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
    8715                         try {
    8716 
    8717                             // Was never called and is aborted or complete
    8718                             if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
    8719 
    8720                                 // Only called once
    8721                                 callback = undefined;
    8722 
    8723                                 // Do not keep as active anymore
    8724                                 if ( handle ) {
    8725                                     xhr.onreadystatechange = jQuery.noop;
    8726                                     if ( xhrOnUnloadAbort ) {
    8727                                         delete xhrCallbacks[ handle ];
    8728                                     }
    8729                                 }
    8730 
    8731                                 // If it's an abort
    8732                                 if ( isAbort ) {
    8733                                     // Abort it manually if needed
    8734                                     if ( xhr.readyState !== 4 ) {
    8735                                         xhr.abort();
    8736                                     }
    8737                                 } else {
    8738                                     responses = {};
    8739                                     status = xhr.status;
    8740                                     responseHeaders = xhr.getAllResponseHeaders();
    8741 
    8742                                     // When requesting binary data, IE6-9 will throw an exception
    8743                                     // on any attempt to access responseText (#11426)
    8744                                     if ( typeof xhr.responseText === "string" ) {
    8745                                         responses.text = xhr.responseText;
    8746                                     }
    8747 
    8748                                     // Firefox throws an exception when accessing
    8749                                     // statusText for faulty cross-domain requests
    8750                                     try {
    8751                                         statusText = xhr.statusText;
    8752                                     } catch( e ) {
    8753                                         // We normalize with Webkit giving an empty statusText
    8754                                         statusText = "";
    8755                                     }
    8756 
    8757                                     // Filter status for non standard behaviors
    8758 
    8759                                     // If the request is local and we have data: assume a success
    8760                                     // (success with no data won't get notified, that's the best we
    8761                                     // can do given current implementations)
    8762                                     if ( !status && s.isLocal && !s.crossDomain ) {
    8763                                         status = responses.text ? 200 : 404;
    8764                                     // IE - #1450: sometimes returns 1223 when it should be 204
    8765                                     } else if ( status === 1223 ) {
    8766                                         status = 204;
    8767                                     }
    8768                                 }
    8769                             }
    8770                         } catch( firefoxAccessException ) {
    8771                             if ( !isAbort ) {
    8772                                 complete( -1, firefoxAccessException );
    8773                             }
    8774                         }
    8775 
    8776                         // Call complete if needed
    8777                         if ( responses ) {
    8778                             complete( status, statusText, responses, responseHeaders );
    8779                         }
    8780                     };
    8781 
    8782                     if ( !s.async ) {
    8783                         // if we're in sync mode we fire the callback
    8784                         callback();
    8785                     } else if ( xhr.readyState === 4 ) {
    8786                         // (IE6 & IE7) if it's in cache and has been
    8787                         // retrieved directly we need to fire the callback
    8788                         setTimeout( callback );
    8789                     } else {
    8790                         handle = ++xhrId;
    8791                         if ( xhrOnUnloadAbort ) {
    8792                             // Create the active xhrs callbacks list if needed
    8793                             // and attach the unload handler
    8794                             if ( !xhrCallbacks ) {
    8795                                 xhrCallbacks = {};
    8796                                 jQuery( window ).unload( xhrOnUnloadAbort );
    8797                             }
    8798                             // Add to list of active xhrs callbacks
    8799                             xhrCallbacks[ handle ] = callback;
    8800                         }
    8801                         xhr.onreadystatechange = callback;
    8802                     }
    8803                 },
    8804 
    8805                 abort: function() {
    8806                     if ( callback ) {
    8807                         callback( undefined, true );
    8808                     }
    8809                 }
    8810             };
    8811         }
    8812     });
    8813 }
    8814 var fxNow, timerId,
    8815     rfxtypes = /^(?:toggle|show|hide)$/,
    8816     rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
    8817     rrun = /queueHooks$/,
    8818     animationPrefilters = [ defaultPrefilter ],
    8819     tweeners = {
    8820         "*": [function( prop, value ) {
    8821             var tween = this.createTween( prop, value ),
    8822                 target = tween.cur(),
    8823                 parts = rfxnum.exec( value ),
    8824                 unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
    8825 
    8826                 // Starting value computation is required for potential unit mismatches
    8827                 start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
    8828                     rfxnum.exec( jQuery.css( tween.elem, prop ) ),
    8829                 scale = 1,
    8830                 maxIterations = 20;
    8831 
    8832             if ( start && start[ 3 ] !== unit ) {
    8833                 // Trust units reported by jQuery.css
    8834                 unit = unit || start[ 3 ];
    8835 
    8836                 // Make sure we update the tween properties later on
    8837                 parts = parts || [];
    8838 
    8839                 // Iteratively approximate from a nonzero starting point
    8840                 start = +target || 1;
    8841 
    8842                 do {
    8843                     // If previous iteration zeroed out, double until we get *something*
    8844                     // Use a string for doubling factor so we don't accidentally see scale as unchanged below
    8845                     scale = scale || ".5";
    8846 
    8847                     // Adjust and apply
    8848                     start = start / scale;
    8849                     jQuery.style( tween.elem, prop, start + unit );
    8850 
    8851                 // Update scale, tolerating zero or NaN from tween.cur()
    8852                 // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
    8853                 } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
    8854             }
    8855 
    8856             // Update tween properties
    8857             if ( parts ) {
    8858                 start = tween.start = +start || +target || 0;
    8859                 tween.unit = unit;
    8860                 // If a +=/-= token was provided, we're doing a relative animation
    8861                 tween.end = parts[ 1 ] ?
    8862                     start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
    8863                     +parts[ 2 ];
    8864             }
    8865 
    8866             return tween;
    8867         }]
    8868     };
    8869 
    8870 // Animations created synchronously will run synchronously
    8871 function createFxNow() {
    8872     setTimeout(function() {
    8873         fxNow = undefined;
    8874     });
    8875     return ( fxNow = jQuery.now() );
    8876 }
    8877 
    8878 function createTween( value, prop, animation ) {
    8879     var tween,
    8880         collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
    8881         index = 0,
    8882         length = collection.length;
    8883     for ( ; index < length; index++ ) {
    8884         if ( (tween = collection[ index ].call( animation, prop, value )) ) {
    8885 
    8886             // we're done with this property
    8887             return tween;
    8888         }
    8889     }
    8890 }
    8891 
    8892 function Animation( elem, properties, options ) {
    8893     var result,
    8894         stopped,
    8895         index = 0,
    8896         length = animationPrefilters.length,
    8897         deferred = jQuery.Deferred().always( function() {
    8898             // don't match elem in the :animated selector
    8899             delete tick.elem;
    8900         }),
    8901         tick = function() {
    8902             if ( stopped ) {
    8903                 return false;
    8904             }
    8905             var currentTime = fxNow || createFxNow(),
    8906                 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
    8907                 // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
    8908                 temp = remaining / animation.duration || 0,
    8909                 percent = 1 - temp,
    8910                 index = 0,
    8911                 length = animation.tweens.length;
    8912 
    8913             for ( ; index < length ; index++ ) {
    8914                 animation.tweens[ index ].run( percent );
    8915             }
    8916 
    8917             deferred.notifyWith( elem, [ animation, percent, remaining ]);
    8918 
    8919             if ( percent < 1 && length ) {
    8920                 return remaining;
    8921             } else {
    8922                 deferred.resolveWith( elem, [ animation ] );
    8923                 return false;
    8924             }
    8925         },
    8926         animation = deferred.promise({
    8927             elem: elem,
    8928             props: jQuery.extend( {}, properties ),
    8929             opts: jQuery.extend( true, { specialEasing: {} }, options ),
    8930             originalProperties: properties,
    8931             originalOptions: options,
    8932             startTime: fxNow || createFxNow(),
    8933             duration: options.duration,
    8934             tweens: [],
    8935             createTween: function( prop, end ) {
    8936                 var tween = jQuery.Tween( elem, animation.opts, prop, end,
    8937                         animation.opts.specialEasing[ prop ] || animation.opts.easing );
    8938                 animation.tweens.push( tween );
    8939                 return tween;
    8940             },
    8941             stop: function( gotoEnd ) {
    8942                 var index = 0,
    8943                     // if we are going to the end, we want to run all the tweens
    8944                     // otherwise we skip this part
    8945                     length = gotoEnd ? animation.tweens.length : 0;
    8946                 if ( stopped ) {
    8947                     return this;
    8948                 }
    8949                 stopped = true;
    8950                 for ( ; index < length ; index++ ) {
    8951                     animation.tweens[ index ].run( 1 );
    8952                 }
    8953 
    8954                 // resolve when we played the last frame
    8955                 // otherwise, reject
    8956                 if ( gotoEnd ) {
    8957                     deferred.resolveWith( elem, [ animation, gotoEnd ] );
    8958                 } else {
    8959                     deferred.rejectWith( elem, [ animation, gotoEnd ] );
    8960                 }
    8961                 return this;
    8962             }
    8963         }),
    8964         props = animation.props;
    8965 
    8966     propFilter( props, animation.opts.specialEasing );
    8967 
    8968     for ( ; index < length ; index++ ) {
    8969         result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
    8970         if ( result ) {
    8971             return result;
    8972         }
    8973     }
    8974 
    8975     jQuery.map( props, createTween, animation );
    8976 
    8977     if ( jQuery.isFunction( animation.opts.start ) ) {
    8978         animation.opts.start.call( elem, animation );
    8979     }
    8980 
    8981     jQuery.fx.timer(
    8982         jQuery.extend( tick, {
    8983             elem: elem,
    8984             anim: animation,
    8985             queue: animation.opts.queue
    8986         })
    8987     );
    8988 
    8989     // attach callbacks from options
    8990     return animation.progress( animation.opts.progress )
    8991         .done( animation.opts.done, animation.opts.complete )
    8992         .fail( animation.opts.fail )
    8993         .always( animation.opts.always );
    8994 }
    8995 
    8996 function propFilter( props, specialEasing ) {
    8997     var index, name, easing, value, hooks;
    8998 
    8999     // camelCase, specialEasing and expand cssHook pass
    9000     for ( index in props ) {
    9001         name = jQuery.camelCase( index );
    9002         easing = specialEasing[ name ];
    9003         value = props[ index ];
    9004         if ( jQuery.isArray( value ) ) {
    9005             easing = value[ 1 ];
    9006             value = props[ index ] = value[ 0 ];
    9007         }
    9008 
    9009         if ( index !== name ) {
    9010             props[ name ] = value;
    9011             delete props[ index ];
    9012         }
    9013 
    9014         hooks = jQuery.cssHooks[ name ];
    9015         if ( hooks && "expand" in hooks ) {
    9016             value = hooks.expand( value );
    9017             delete props[ name ];
    9018 
    9019             // not quite $.extend, this wont overwrite keys already present.
    9020             // also - reusing 'index' from above because we have the correct "name"
    9021             for ( index in value ) {
    9022                 if ( !( index in props ) ) {
    9023                     props[ index ] = value[ index ];
    9024                     specialEasing[ index ] = easing;
    9025                 }
    9026             }
    9027         } else {
    9028             specialEasing[ name ] = easing;
    9029         }
    9030     }
    9031 }
    9032 
    9033 jQuery.Animation = jQuery.extend( Animation, {
    9034 
    9035     tweener: function( props, callback ) {
    9036         if ( jQuery.isFunction( props ) ) {
    9037             callback = props;
    9038             props = [ "*" ];
    9039         } else {
    9040             props = props.split(" ");
    9041         }
    9042 
    9043         var prop,
    9044             index = 0,
    9045             length = props.length;
    9046 
    9047         for ( ; index < length ; index++ ) {
    9048             prop = props[ index ];
    9049             tweeners[ prop ] = tweeners[ prop ] || [];
    9050             tweeners[ prop ].unshift( callback );
    9051         }
    9052     },
    9053 
    9054     prefilter: function( callback, prepend ) {
    9055         if ( prepend ) {
    9056             animationPrefilters.unshift( callback );
    9057         } else {
    9058             animationPrefilters.push( callback );
    9059         }
    9060     }
    9061 });
    9062 
    9063 function defaultPrefilter( elem, props, opts ) {
    9064     /* jshint validthis: true */
    9065     var prop, value, toggle, tween, hooks, oldfire,
    9066         anim = this,
    9067         orig = {},
    9068         style = elem.style,
    9069         hidden = elem.nodeType && isHidden( elem ),
    9070         dataShow = jQuery._data( elem, "fxshow" );
    9071 
    9072     // handle queue: false promises
    9073     if ( !opts.queue ) {
    9074         hooks = jQuery._queueHooks( elem, "fx" );
    9075         if ( hooks.unqueued == null ) {
    9076             hooks.unqueued = 0;
    9077             oldfire = hooks.empty.fire;
    9078             hooks.empty.fire = function() {
    9079                 if ( !hooks.unqueued ) {
    9080                     oldfire();
    9081                 }
    9082             };
    9083         }
    9084         hooks.unqueued++;
    9085 
    9086         anim.always(function() {
    9087             // doing this makes sure that the complete handler will be called
    9088             // before this completes
    9089             anim.always(function() {
    9090                 hooks.unqueued--;
    9091                 if ( !jQuery.queue( elem, "fx" ).length ) {
    9092                     hooks.empty.fire();
    9093                 }
    9094             });
    9095         });
    9096     }
    9097 
    9098     // height/width overflow pass
    9099     if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
    9100         // Make sure that nothing sneaks out
    9101         // Record all 3 overflow attributes because IE does not
    9102         // change the overflow attribute when overflowX and
    9103         // overflowY are set to the same value
    9104         opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
    9105 
    9106         // Set display property to inline-block for height/width
    9107         // animations on inline elements that are having width/height animated
    9108         if ( jQuery.css( elem, "display" ) === "inline" &&
    9109                 jQuery.css( elem, "float" ) === "none" ) {
    9110 
    9111             // inline-level elements accept inline-block;
    9112             // block-level elements need to be inline with layout
    9113             if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
    9114                 style.display = "inline-block";
    9115 
    9116             } else {
    9117                 style.zoom = 1;
    9118             }
    9119         }
    9120     }
    9121 
    9122     if ( opts.overflow ) {
    9123         style.overflow = "hidden";
    9124         if ( !jQuery.support.shrinkWrapBlocks ) {
    9125             anim.always(function() {
    9126                 style.overflow = opts.overflow[ 0 ];
    9127                 style.overflowX = opts.overflow[ 1 ];
    9128                 style.overflowY = opts.overflow[ 2 ];
    9129             });
    9130         }
    9131     }
    9132 
    9133 
    9134     // show/hide pass
    9135     for ( prop in props ) {
    9136         value = props[ prop ];
    9137         if ( rfxtypes.exec( value ) ) {
    9138             delete props[ prop ];
    9139             toggle = toggle || value === "toggle";
    9140             if ( value === ( hidden ? "hide" : "show" ) ) {
    9141                 continue;
    9142             }
    9143             orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
    9144         }
    9145     }
    9146 
    9147     if ( !jQuery.isEmptyObject( orig ) ) {
    9148         if ( dataShow ) {
    9149             if ( "hidden" in dataShow ) {
    9150                 hidden = dataShow.hidden;
    9151             }
    9152         } else {
    9153             dataShow = jQuery._data( elem, "fxshow", {} );
    9154         }
    9155 
    9156         // store state if its toggle - enables .stop().toggle() to "reverse"
    9157         if ( toggle ) {
    9158             dataShow.hidden = !hidden;
    9159         }
    9160         if ( hidden ) {
    9161             jQuery( elem ).show();
    9162         } else {
    9163             anim.done(function() {
    9164                 jQuery( elem ).hide();
    9165             });
    9166         }
    9167         anim.done(function() {
    9168             var prop;
    9169             jQuery._removeData( elem, "fxshow" );
    9170             for ( prop in orig ) {
    9171                 jQuery.style( elem, prop, orig[ prop ] );
    9172             }
    9173         });
    9174         for ( prop in orig ) {
    9175             tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
    9176 
    9177             if ( !( prop in dataShow ) ) {
    9178                 dataShow[ prop ] = tween.start;
    9179                 if ( hidden ) {
    9180                     tween.end = tween.start;
    9181                     tween.start = prop === "width" || prop === "height" ? 1 : 0;
    9182                 }
    9183             }
    9184         }
    9185     }
    9186 }
    9187 
    9188 function Tween( elem, options, prop, end, easing ) {
    9189     return new Tween.prototype.init( elem, options, prop, end, easing );
    9190 }
    9191 jQuery.Tween = Tween;
    9192 
    9193 Tween.prototype = {
    9194     constructor: Tween,
    9195     init: function( elem, options, prop, end, easing, unit ) {
    9196         this.elem = elem;
    9197         this.prop = prop;
    9198         this.easing = easing || "swing";
    9199         this.options = options;
    9200         this.start = this.now = this.cur();
    9201         this.end = end;
    9202         this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
    9203     },
    9204     cur: function() {
    9205         var hooks = Tween.propHooks[ this.prop ];
    9206 
    9207         return hooks && hooks.get ?
    9208             hooks.get( this ) :
    9209             Tween.propHooks._default.get( this );
    9210     },
    9211     run: function( percent ) {
    9212         var eased,
    9213             hooks = Tween.propHooks[ this.prop ];
    9214 
    9215         if ( this.options.duration ) {
    9216             this.pos = eased = jQuery.easing[ this.easing ](
    9217                 percent, this.options.duration * percent, 0, 1, this.options.duration
    9218             );
    9219         } else {
    9220             this.pos = eased = percent;
    9221         }
    9222         this.now = ( this.end - this.start ) * eased + this.start;
    9223 
    9224         if ( this.options.step ) {
    9225             this.options.step.call( this.elem, this.now, this );
    9226         }
    9227 
    9228         if ( hooks && hooks.set ) {
    9229             hooks.set( this );
    9230         } else {
    9231             Tween.propHooks._default.set( this );
    9232         }
    9233         return this;
    9234     }
    9235 };
    9236 
    9237 Tween.prototype.init.prototype = Tween.prototype;
    9238 
    9239 Tween.propHooks = {
    9240     _default: {
    9241         get: function( tween ) {
    9242             var result;
    9243 
    9244             if ( tween.elem[ tween.prop ] != null &&
    9245                 (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
    9246                 return tween.elem[ tween.prop ];
    9247             }
    9248 
    9249             // passing an empty string as a 3rd parameter to .css will automatically
    9250             // attempt a parseFloat and fallback to a string if the parse fails
    9251             // so, simple values such as "10px" are parsed to Float.
    9252             // complex values such as "rotate(1rad)" are returned as is.
    9253             result = jQuery.css( tween.elem, tween.prop, "" );
    9254             // Empty strings, null, undefined and "auto" are converted to 0.
    9255             return !result || result === "auto" ? 0 : result;
    9256         },
    9257         set: function( tween ) {
    9258             // use step hook for back compat - use cssHook if its there - use .style if its
    9259             // available and use plain properties where available
    9260             if ( jQuery.fx.step[ tween.prop ] ) {
    9261                 jQuery.fx.step[ tween.prop ]( tween );
    9262             } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
    9263                 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
    9264             } else {
    9265                 tween.elem[ tween.prop ] = tween.now;
    9266             }
    9267         }
    9268     }
    9269 };
    9270 
    9271 // Support: IE <=9
    9272 // Panic based approach to setting things on disconnected nodes
    9273 
    9274 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
    9275     set: function( tween ) {
    9276         if ( tween.elem.nodeType && tween.elem.parentNode ) {
    9277             tween.elem[ tween.prop ] = tween.now;
    9278         }
    9279     }
    9280 };
    9281 
    9282 jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
    9283     var cssFn = jQuery.fn[ name ];
    9284     jQuery.fn[ name ] = function( speed, easing, callback ) {
    9285         return speed == null || typeof speed === "boolean" ?
    9286             cssFn.apply( this, arguments ) :
    9287             this.animate( genFx( name, true ), speed, easing, callback );
    9288     };
    9289 });
    9290 
    9291 jQuery.fn.extend({
    9292     fadeTo: function( speed, to, easing, callback ) {
    9293 
    9294         // show any hidden elements after setting opacity to 0
    9295         return this.filter( isHidden ).css( "opacity", 0 ).show()
    9296 
    9297             // animate to the value specified
    9298             .end().animate({ opacity: to }, speed, easing, callback );
    9299     },
    9300     animate: function( prop, speed, easing, callback ) {
    9301         var empty = jQuery.isEmptyObject( prop ),
    9302             optall = jQuery.speed( speed, easing, callback ),
    9303             doAnimation = function() {
    9304                 // Operate on a copy of prop so per-property easing won't be lost
    9305                 var anim = Animation( this, jQuery.extend( {}, prop ), optall );
    9306 
    9307                 // Empty animations, or finishing resolves immediately
    9308                 if ( empty || jQuery._data( this, "finish" ) ) {
    9309                     anim.stop( true );
    9310                 }
    9311             };
    9312             doAnimation.finish = doAnimation;
    9313 
    9314         return empty || optall.queue === false ?
    9315             this.each( doAnimation ) :
    9316             this.queue( optall.queue, doAnimation );
    9317     },
    9318     stop: function( type, clearQueue, gotoEnd ) {
    9319         var stopQueue = function( hooks ) {
    9320             var stop = hooks.stop;
    9321             delete hooks.stop;
    9322             stop( gotoEnd );
    9323         };
    9324 
    9325         if ( typeof type !== "string" ) {
    9326             gotoEnd = clearQueue;
    9327             clearQueue = type;
    9328             type = undefined;
    9329         }
    9330         if ( clearQueue && type !== false ) {
    9331             this.queue( type || "fx", [] );
    9332         }
    9333 
    9334         return this.each(function() {
    9335             var dequeue = true,
    9336                 index = type != null && type + "queueHooks",
    9337                 timers = jQuery.timers,
    9338                 data = jQuery._data( this );
    9339 
    9340             if ( index ) {
    9341                 if ( data[ index ] && data[ index ].stop ) {
    9342                     stopQueue( data[ index ] );
    9343                 }
    9344             } else {
    9345                 for ( index in data ) {
    9346                     if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
    9347                         stopQueue( data[ index ] );
    9348                     }
    9349                 }
    9350             }
    9351 
    9352             for ( index = timers.length; index--; ) {
    9353                 if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
    9354                     timers[ index ].anim.stop( gotoEnd );
    9355                     dequeue = false;
    9356                     timers.splice( index, 1 );
    9357                 }
    9358             }
    9359 
    9360             // start the next in the queue if the last step wasn't forced
    9361             // timers currently will call their complete callbacks, which will dequeue
    9362             // but only if they were gotoEnd
    9363             if ( dequeue || !gotoEnd ) {
    9364                 jQuery.dequeue( this, type );
    9365             }
    9366         });
    9367     },
    9368     finish: function( type ) {
    9369         if ( type !== false ) {
    9370             type = type || "fx";
    9371         }
    9372         return this.each(function() {
    9373             var index,
    9374                 data = jQuery._data( this ),
    9375                 queue = data[ type + "queue" ],
    9376                 hooks = data[ type + "queueHooks" ],
    9377                 timers = jQuery.timers,
    9378                 length = queue ? queue.length : 0;
    9379 
    9380             // enable finishing flag on private data
    9381             data.finish = true;
    9382 
    9383             // empty the queue first
    9384             jQuery.queue( this, type, [] );
    9385 
    9386             if ( hooks && hooks.stop ) {
    9387                 hooks.stop.call( this, true );
    9388             }
    9389 
    9390             // look for any active animations, and finish them
    9391             for ( index = timers.length; index--; ) {
    9392                 if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
    9393                     timers[ index ].anim.stop( true );
    9394                     timers.splice( index, 1 );
    9395                 }
    9396             }
    9397 
    9398             // look for any animations in the old queue and finish them
    9399             for ( index = 0; index < length; index++ ) {
    9400                 if ( queue[ index ] && queue[ index ].finish ) {
    9401                     queue[ index ].finish.call( this );
    9402                 }
    9403             }
    9404 
    9405             // turn off finishing flag
    9406             delete data.finish;
    9407         });
    9408     }
    9409 });
    9410 
    9411 // Generate parameters to create a standard animation
    9412 function genFx( type, includeWidth ) {
    9413     var which,
    9414         attrs = { height: type },
    9415         i = 0;
    9416 
    9417     // if we include width, step value is 1 to do all cssExpand values,
    9418     // if we don't include width, step value is 2 to skip over Left and Right
    9419     includeWidth = includeWidth? 1 : 0;
    9420     for( ; i < 4 ; i += 2 - includeWidth ) {
    9421         which = cssExpand[ i ];
    9422         attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
    9423     }
    9424 
    9425     if ( includeWidth ) {
    9426         attrs.opacity = attrs.width = type;
    9427     }
    9428 
    9429     return attrs;
    9430 }
    9431 
    9432 // Generate shortcuts for custom animations
    9433 jQuery.each({
    9434     slideDown: genFx("show"),
    9435     slideUp: genFx("hide"),
    9436     slideToggle: genFx("toggle"),
    9437     fadeIn: { opacity: "show" },
    9438     fadeOut: { opacity: "hide" },
    9439     fadeToggle: { opacity: "toggle" }
    9440 }, function( name, props ) {
    9441     jQuery.fn[ name ] = function( speed, easing, callback ) {
    9442         return this.animate( props, speed, easing, callback );
    9443     };
    9444 });
    9445 
    9446 jQuery.speed = function( speed, easing, fn ) {
    9447     var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
    9448         complete: fn || !fn && easing ||
    9449             jQuery.isFunction( speed ) && speed,
    9450         duration: speed,
    9451         easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
    9452     };
    9453 
    9454     opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
    9455         opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
    9456 
    9457     // normalize opt.queue - true/undefined/null -> "fx"
    9458     if ( opt.queue == null || opt.queue === true ) {
    9459         opt.queue = "fx";
    9460     }
    9461 
    9462     // Queueing
    9463     opt.old = opt.complete;
    9464 
    9465     opt.complete = function() {
    9466         if ( jQuery.isFunction( opt.old ) ) {
    9467             opt.old.call( this );
    9468         }
    9469 
    9470         if ( opt.queue ) {
    9471             jQuery.dequeue( this, opt.queue );
    9472         }
    9473     };
    9474 
    9475     return opt;
    9476 };
    9477 
    9478 jQuery.easing = {
    9479     linear: function( p ) {
    9480         return p;
    9481     },
    9482     swing: function( p ) {
    9483         return 0.5 - Math.cos( p*Math.PI ) / 2;
    9484     }
    9485 };
    9486 
    9487 jQuery.timers = [];
    9488 jQuery.fx = Tween.prototype.init;
    9489 jQuery.fx.tick = function() {
    9490     var timer,
    9491         timers = jQuery.timers,
    9492         i = 0;
    9493 
    9494     fxNow = jQuery.now();
    9495 
    9496     for ( ; i < timers.length; i++ ) {
    9497         timer = timers[ i ];
    9498         // Checks the timer has not already been removed
    9499         if ( !timer() && timers[ i ] === timer ) {
    9500             timers.splice( i--, 1 );
    9501         }
    9502     }
    9503 
    9504     if ( !timers.length ) {
    9505         jQuery.fx.stop();
    9506     }
    9507     fxNow = undefined;
    9508 };
    9509 
    9510 jQuery.fx.timer = function( timer ) {
    9511     if ( timer() && jQuery.timers.push( timer ) ) {
    9512         jQuery.fx.start();
    9513     }
    9514 };
    9515 
    9516 jQuery.fx.interval = 13;
    9517 
    9518 jQuery.fx.start = function() {
    9519     if ( !timerId ) {
    9520         timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
    9521     }
    9522 };
    9523 
    9524 jQuery.fx.stop = function() {
    9525     clearInterval( timerId );
    9526     timerId = null;
    9527 };
    9528 
    9529 jQuery.fx.speeds = {
    9530     slow: 600,
    9531     fast: 200,
    9532     // Default speed
    9533     _default: 400
    9534 };
    9535 
    9536 // Back Compat <1.8 extension point
    9537 jQuery.fx.step = {};
    9538 
    9539 if ( jQuery.expr && jQuery.expr.filters ) {
    9540     jQuery.expr.filters.animated = function( elem ) {
    9541         return jQuery.grep(jQuery.timers, function( fn ) {
    9542             return elem === fn.elem;
    9543         }).length;
    9544     };
    9545 }
    9546 jQuery.fn.offset = function( options ) {
    9547     if ( arguments.length ) {
    9548         return options === undefined ?
    9549             this :
    9550             this.each(function( i ) {
    9551                 jQuery.offset.setOffset( this, options, i );
    9552             });
    9553     }
    9554 
    9555     var docElem, win,
    9556         box = { top: 0, left: 0 },
    9557         elem = this[ 0 ],
    9558         doc = elem && elem.ownerDocument;
    9559 
    9560     if ( !doc ) {
    9561         return;
    9562     }
    9563 
    9564     docElem = doc.documentElement;
    9565 
    9566     // Make sure it's not a disconnected DOM node
    9567     if ( !jQuery.contains( docElem, elem ) ) {
    9568         return box;
    9569     }
    9570 
    9571     // If we don't have gBCR, just use 0,0 rather than error
    9572     // BlackBerry 5, iOS 3 (original iPhone)
    9573     if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
    9574         box = elem.getBoundingClientRect();
    9575     }
    9576     win = getWindow( doc );
    9577     return {
    9578         top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
    9579         left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
    9580     };
    9581 };
    9582 
    9583 jQuery.offset = {
    9584 
    9585     setOffset: function( elem, options, i ) {
    9586         var position = jQuery.css( elem, "position" );
    9587 
    9588         // set position first, in-case top/left are set even on static elem
    9589         if ( position === "static" ) {
    9590             elem.style.position = "relative";
    9591         }
    9592 
    9593         var curElem = jQuery( elem ),
    9594             curOffset = curElem.offset(),
    9595             curCSSTop = jQuery.css( elem, "top" ),
    9596             curCSSLeft = jQuery.css( elem, "left" ),
    9597             calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
    9598             props = {}, curPosition = {}, curTop, curLeft;
    9599 
    9600         // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
    9601         if ( calculatePosition ) {
    9602             curPosition = curElem.position();
    9603             curTop = curPosition.top;
    9604             curLeft = curPosition.left;
    9605         } else {
    9606             curTop = parseFloat( curCSSTop ) || 0;
    9607             curLeft = parseFloat( curCSSLeft ) || 0;
    9608         }
    9609 
    9610         if ( jQuery.isFunction( options ) ) {
    9611             options = options.call( elem, i, curOffset );
    9612         }
    9613 
    9614         if ( options.top != null ) {
    9615             props.top = ( options.top - curOffset.top ) + curTop;
    9616         }
    9617         if ( options.left != null ) {
    9618             props.left = ( options.left - curOffset.left ) + curLeft;
    9619         }
    9620 
    9621         if ( "using" in options ) {
    9622             options.using.call( elem, props );
    9623         } else {
    9624             curElem.css( props );
    9625         }
    9626     }
    9627 };
    9628 
    9629 
    9630 jQuery.fn.extend({
    9631 
    9632     position: function() {
    9633         if ( !this[ 0 ] ) {
    9634             return;
    9635         }
    9636 
    9637         var offsetParent, offset,
    9638             parentOffset = { top: 0, left: 0 },
    9639             elem = this[ 0 ];
    9640 
    9641         // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
    9642         if ( jQuery.css( elem, "position" ) === "fixed" ) {
    9643             // we assume that getBoundingClientRect is available when computed position is fixed
    9644             offset = elem.getBoundingClientRect();
    9645         } else {
    9646             // Get *real* offsetParent
    9647             offsetParent = this.offsetParent();
    9648 
    9649             // Get correct offsets
    9650             offset = this.offset();
    9651             if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
    9652                 parentOffset = offsetParent.offset();
    9653             }
    9654 
    9655             // Add offsetParent borders
    9656             parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
    9657             parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
    9658         }
    9659 
    9660         // Subtract parent offsets and element margins
    9661         // note: when an element has margin: auto the offsetLeft and marginLeft
    9662         // are the same in Safari causing offset.left to incorrectly be 0
    9663         return {
    9664             top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
    9665             left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
    9666         };
    9667     },
    9668 
    9669     offsetParent: function() {
    9670         return this.map(function() {
    9671             var offsetParent = this.offsetParent || docElem;
    9672             while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
    9673                 offsetParent = offsetParent.offsetParent;
    9674             }
    9675             return offsetParent || docElem;
    9676         });
    9677     }
    9678 });
    9679 
    9680 
    9681 // Create scrollLeft and scrollTop methods
    9682 jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
    9683     var top = /Y/.test( prop );
    9684 
    9685     jQuery.fn[ method ] = function( val ) {
    9686         return jQuery.access( this, function( elem, method, val ) {
    9687             var win = getWindow( elem );
    9688 
    9689             if ( val === undefined ) {
    9690                 return win ? (prop in win) ? win[ prop ] :
    9691                     win.document.documentElement[ method ] :
    9692                     elem[ method ];
    9693             }
    9694 
    9695             if ( win ) {
    9696                 win.scrollTo(
    9697                     !top ? val : jQuery( win ).scrollLeft(),
    9698                     top ? val : jQuery( win ).scrollTop()
    9699                 );
    9700 
    9701             } else {
    9702                 elem[ method ] = val;
    9703             }
    9704         }, method, val, arguments.length, null );
    9705     };
    9706 });
    9707 
    9708 function getWindow( elem ) {
    9709     return jQuery.isWindow( elem ) ?
    9710         elem :
    9711         elem.nodeType === 9 ?
    9712             elem.defaultView || elem.parentWindow :
    9713             false;
    9714 }
    9715 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
    9716 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
    9717     jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
    9718         // margin is only for outerHeight, outerWidth
    9719         jQuery.fn[ funcName ] = function( margin, value ) {
    9720             var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
    9721                 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
    9722 
    9723             return jQuery.access( this, function( elem, type, value ) {
    9724                 var doc;
    9725 
    9726                 if ( jQuery.isWindow( elem ) ) {
    9727                     // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
    9728                     // isn't a whole lot we can do. See pull request at this URL for discussion:
    9729                     // https://github.com/jquery/jquery/pull/764
    9730                     return elem.document.documentElement[ "client" + name ];
    9731                 }
    9732 
    9733                 // Get document width or height
    9734                 if ( elem.nodeType === 9 ) {
    9735                     doc = elem.documentElement;
    9736 
    9737                     // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
    9738                     // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
    9739                     return Math.max(
    9740                         elem.body[ "scroll" + name ], doc[ "scroll" + name ],
    9741                         elem.body[ "offset" + name ], doc[ "offset" + name ],
    9742                         doc[ "client" + name ]
    9743                     );
    9744                 }
    9745 
    9746                 return value === undefined ?
    9747                     // Get width or height on the element, requesting but not forcing parseFloat
    9748                     jQuery.css( elem, type, extra ) :
    9749 
    9750                     // Set width or height on the element
    9751                     jQuery.style( elem, type, value, extra );
    9752             }, type, chainable ? margin : undefined, chainable, null );
    9753         };
    9754     });
    9755 });
    9756 // Limit scope pollution from any deprecated API
    9757 // (function() {
    9758 
    9759 // The number of elements contained in the matched element set
    9760 jQuery.fn.size = function() {
    9761     return this.length;
    9762 };
    9763 
    9764 jQuery.fn.andSelf = jQuery.fn.addBack;
    9765 
    9766 // })();
    9767 if ( typeof module === "object" && module && typeof module.exports === "object" ) {
    9768     // Expose jQuery as module.exports in loaders that implement the Node
    9769     // module pattern (including browserify). Do not create the global, since
    9770     // the user will be storing it themselves locally, and globals are frowned
    9771     // upon in the Node module world.
    9772     module.exports = jQuery;
    9773 } else {
    9774     // Otherwise expose jQuery to the global object as usual
    9775     window.jQuery = window.$ = jQuery;
    9776 
    9777     // Register as a named AMD module, since jQuery can be concatenated with other
    9778     // files that may use define, but not via a proper concatenation script that
    9779     // understands anonymous AMD modules. A named AMD is safest and most robust
    9780     // way to register. Lowercase jquery is used because AMD module names are
    9781     // derived from file names, and jQuery is normally delivered in a lowercase
    9782     // file name. Do this after creating the global so that if an AMD module wants
    9783     // to call noConflict to hide this version of jQuery, it will work.
    9784     if ( typeof define === "function" && define.amd ) {
    9785         define( "jquery", [], function () { return jQuery; } );
    9786     }
    9787 }
    9788 
    9789 })( window );
    9790 jQuery.noConflict();
     1/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
     2//@ sourceMappingURL=jquery-1.10.2.min.map
     3*/
     4(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
     5}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
     6u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
  • trunk/wp-includes/script-loader.php

    r24774 r24781  
    136136    $scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.10.2' );
    137137    $scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '1.10.2' );
    138     $scripts->add( 'jquery-migrate', '/wp-includes/js/jquery/jquery-migrate.js', array(), '1.2.1' );
     138    $scripts->add( 'jquery-migrate', "/wp-includes/js/jquery/jquery-migrate$suffix.js", array(), '1.2.1' );
    139139
    140140    // full jQuery UI
Note: See TracChangeset for help on using the changeset viewer.